PHPメモ

PHPメモ

Thread Safe版をダウンロードすべし

PHPをダウンロードする際は、Thread Safeを選択する。一番上にあるNon Thread Safeには大事なモジュール(php7apache2_4.dllなど)が含まれていないので避ける(参照)。

VS Codeでデバッグする

Node.jsやPythonだとなにもファイルをつくらなくてもデバッグできるのだが、PHPだとデバッグしたいファイルと同階層の.vscodeフォルダの下にlaunch.jsonをつくる必要がある。内容は

コマンドラインで動くPHPスクリプトは、「Launch currently open script」を選択してデバッグする。「Listen for XDebug」のほうはたぶんサーバー上で実行されるPHPスクリプトをデバッグするのに使うんだと思うんだがいまのところよくわからん。

Node.jsやPythonでは右下に構成の追加というのがでてきてそれをクリックすると自動でlaunch.jsonをつくってくれるのだが、PHPは手動でつくらなければならないということでメモした。フォルダごとにいちいちlaunch.jsonをつくらないといけないのが面倒だなー。settings.jsonはデフォルトのものがあって、カレントフォルダフォルダの.vscode以下につくるとデフォルトに上書きされるという仕組みなのだが、launch.jsonもこれとおなじ感じならいいのに。

クッキーとセッション

クッキー

とすると、いまつくっているレスポンスのヘッダーのset-cookieフィールドに「name=shimada」が追加される。

としても初回はクッキーを表示することはできない。2度目以降は表示できる。それはsetcookie()は$_COOKIEをいじっているわけではなく、レスポンスヘッダーのset-cookieフィールドをいじっているからである。

セッション

とするとレスポンスヘッダーのset-cookieフィールドに「PHPSESSID=a10de7af5a45cc532e06289e495cbaac;」のようにランダムに生成されたセッションIDが書き込まれる。

session_start()したあと

のように$_SESSIONに代入するとサーバー側に保存される。

間違いやすいのは、セッションとクッキーを混同して

のようにしてしまうこと。$_COOKIEに代入してもクッキーは操作できない。$_COOKIEに代入することは基本的にないはず。

ただし、$_COOKIEで条件分岐をしているときなど、$_COOKIEにデフォルト値を代入したことはある。

セッションはセッションIDとだけ紐づけられている(っぽい)

サーバー側に保存されるセッションの情報は、おそらくセッションID + IPアドレスと紐づけらるんだろうと思っていたが、セッションIDとだけ紐づけられるっぽいな。

セッションハイジャックというのがあって、セッションIDが盗まれるとほかのコンピューターからもアクセスできるらしいので、セッションIDとだけ紐づけられていると思われる。

また、ネット接続を切ってIPアドレスが切り替わってもセッションが維持されていると思われるWebサービスを多数経験していることからも、セッションIDのみで管理しているのだと思う。

傍証として、FirefoxでアクセスしてつくられたセッションIDをChromeにコピーしてアクセスすると、セッションの情報をとることができた。もちろんブラウザーを変えただけではIPアドレスが変わらないので、たしかな証拠ではないのだが。

SQLite3を使う

php.iniに以下の2行を追加。

PDOで接続するなら2行目だけ追加すればいいとは思うが、ほかの方法で接続することもあるかもしれないのでついでに1行目も追加。

あとでわかったのだが、以下のようにしてもいい。

DB(pythonでつくったbooks.sqlite3)へ接続し(例外処理は省く)、試しに中身をぜんぶ表示してみる。

.phpファイルとbooks.sqlite3ファイルをFTPソフトでそのまんまレンタルサーバー(ロリポップ)にアップロードして動かしたらうまくいった。お手軽でよい。個人用であればMySQLとか触る必要なしな感じ。

PDOからMySQLにアクセスする

これが基本形。

必要な情報は接続したいデータベース名と、それにアクセスできるユーザー名とパスワードとホスト名。

SQL文をデータベースに投げるにはexec, query, prepareの3つのメソッドがある。

execは結果を返さない安全対策の必要がないSQLに使われる。

queryは結果を返して安全対策の必要がなく1回だけ実行されるSQLに使われる。

prepareは結果を返して安全対策が必要で複数回実行されるSQLに使われる。

表にまとめておく。

メソッド 結果 回数 安全対策
exec 返さない 1回 必要ないとき使われる
query 返す 1回 必要ないとき使われる
prepare 返す 複数回 必要あるとき使われる

安全対策というのを具体的にどうやるのかはいまはまだわからない。

レンタルサーバーのデータベースにはアクセスできない

レンタルサーバーのデータベースにアクセスできるか実験してみた。

これのdbhostをlocalhost→レンタルサーバーのデータベースサーバーに変更して、PHPAdminでデータベース名・ユーザー名・パスワードぜんぶ調べて設定したが、「SQLSTATE[HY000] [2002] 対象のコンピューターによって拒否されたため、接続できませんでした。 」というエラーになる。

考えてみればあたりまえのことだった。ユーザー名とホスト名がセットになって管理されているので、ホスト名が違うということで弾かれるのだろう。

ローカルのMySQLであればrootで入ってユーザー名とホスト名を任意に設定できるが、レンタルサーバーのMySQLではできない(できたとしたら逆にセキュリティ上まずい)。

require, require_once, include, include_onceの使い分け

こちらのページがわかりやすい。

クラスやライブラリの場合は「require_once」を使います。

基本的には、htmlファイルやテキストファイルを読み込む場合にはincludeを使用すると思っておけばよいでしょう。

以上のことからわかるように、require、include_onceは使わなくても問題ありません。

よく使う関数

CSVファイルを1行ずつ読み込みつつ、わかりやすい変数で受ける。

ちなみにexplodeの逆の関数はimplode。配列の要素を連結して文字列をつくる。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする