【注意】 この記事は過去に別サイトで執筆したものを再掲載したものです。 内容が古くなっていて現在では適用できない場合や、もっと良い方法が出来ている場合があります。 |
設定
アップロードするファイルサイズを大きくする
php.ini設定を下記のように変更する。
post_max_size = 16M
upload_max_filesize = 16M
file_uploads = On
POSTサイズの制限も影響を受けるので、php.iniとともに変更する。
バージョン表示を消す
PHPが出力するヘッダにはPHPのバージョン情報も含まれる。
PHPのバージョンを表示することはセキュリティ面から好ましいとは言えないので、特に理由がない限りはOFFにしておくのが好ましい。
expose_php = OFF
リクエストの取得
GETメソッドおよびPOSTメソッドによってブラウザより渡されるデータの取得方法について。
GETメソッド
システム変数、$_GET[ ]を参照する。
<input type="text" name="abc">
このようなフォームからリクエストを受け取る場合は次のように記述する。
$var = $_GET["abc"];
取得できない場合は、nullが返される。
POSTメソッド
システム変数、$_POST[ ]を参照する。
<input type="text" name="abc">
このようなフォームからリクエストを受け取る場合は次のように記述する。
$var = $_POST["abc"];
取得できない場合は、nullが返される。
GET、POST共通
システム変数、$_REQUEST[ ]を参照する。
$_REQUEST[ ]では、GETメソッド、POSTメソッド両方からのデータ取得が出来る。
本来POSTされるべきデータをGETで偽装された場合に区別できないので推奨されない。
チェックボックスの処理
チェックボックスでの複数チェックの状態を取得するには、HTMLは次のように記述する。
<input type="checkbox" name="abc[]" value="01">選択肢A
<input type="checkbox" name="abc[]" value="02">選択肢B
<input type="checkbox" name="abc[]" value="03">選択肢C
name属性を「abc[]」として配列表記にしておく。
PHP側でデータを参照すると配列変数として得られる。
次のように添え字ありでも構わない。
<input type="checkbox" name="abc[1]" value="01">
<input type="checkbox" name="abc[k001]" value="01">
このチェック状態を”hidden”にて次のフォームへ渡す場合も、同様に記述する。
<input type="hidden" name="abc[]" value="01">
<input type="hidden" name="abc[]" value="02">
ファイルの受信
フォームの記述は、で enctype=”multipart/form-data” を指定する。
ファイル選択は、<input type=”file”> にて配置する。
<!-- サンプル -->
<form enctype="multipart/form-data" method="post" action="getimage.php" >
<input type="file" name="fileA">
<input type="file" name="fileB">
<input type="file" name="fileC">
<input type="submit" value="送信">
</form>
PHP側では受け取ったファイルをテンポラリに保存する。
テンポラリを作るディレクトリは、php.iniで設定する。
; 設定例
upload_tmp_dir = "C:\xampplite\tmp"
スクリプトでは、$_FILES配列変数を参照することで、ファイルの詳細を得ることが出来る。
ファイルを1つ選び、残り2つは空欄で送信した場合の$_FILESは以下の通り。
fileA | ||
name | readme.txt | |
type | text/plain | |
tmp_name | C:\xampplite\tmp\php31.tmp | |
error | 0 | |
size | 2435 | |
fileB | ||
name | ||
type | ||
error | 4 | |
size | 0 | |
fileC | ||
name | ||
type | ||
error | 4 | |
size | 0 |
元ファイル名、サイズ、テンポラリファイルのパスが入っているので、これを利用する。
保存されたファイルはスクリプトの終了時に削除されるので、必要ならコピーしておく必要がある。
セッション
セッションを使用するとスーパーグローバル配列変数$_SESSIONを使用して、セッション機能を利用できる。
セッションの開始/破棄
明示的に開始する場合は、session_start()
関数を使用する。
既にセッションが開始されている場合は保存されているセッションデータが読み込まれる。
session_start();
php.iniの設定で自動開始とすることもできる。
[Session]
session.auto_start = 1
明示的にセッションを破棄する場合は、session_destroy()
関数を使用する。
session_destroy();
明示的に破棄しないとサーバに情報が残り続けるので、自動破棄する機構がある。
セッションの有効時間を何秒とするか、php.iniの設定
session.gc_maxlifetime = 1440; // = 24min (24 x 60sec)
期限切れセッションデータの物理削除処理(ガベージコレクション)の起動設定。session_start()
関数が呼ばれるたびに、以下の設定値を用いて確率試行が行われる。
// 1/100の確率でGC起動
session.gc_probability = 1
session.gc_divisor = 100
セッションデータの利用
スーパーグローバル配列変数$_SESSION
を使用する。配列と同じ扱いで良い。
$_SESSION['name'] = $name; // セッションへ登録
if (isset($_SESSION['name'])) {
print $_SESSION['name'].'さん、こんにちは!'; // 登録内容の利用
}
特定の要素を削除する場合は、unset()
関数にて要素を削除できる。
unset($_SESSION['name']);
全ての要素を削除する場合は、新たに配列を割り当てる方が早い。
$_SESSION = array();
Smarty
有名なテンプレートエンジン。テンプレートは標準でファイルを使用する。ファイル以外のリソースを使用する場合は、register_resource()
メソッドにて自前で用意した関数を登録する必要がある。
ファイル以外のリソースを使う
http://ml.php.gr.jp/pipermail/php-users/2004-March/021324.html
テンプレートをメモリーから読み込むサンプルが書かれているが、このままではNG。$smarty->fetch("hensu:".$tmpl);
としているが、$tmpl
の中身がそのままコンパイル結果の保存ファイル名になってしまう。
したがって保存ファイル名が、ファイル名として適切で無い状態になってしまうと落ちることがある。
参考: https://www.smarty.net/docsv2/ja/template.resources
“{” や “}” を本文で使う
Smrty処理しない範囲が決まっているなら、{literal}
~{/literal}
タグで囲む。
スポット的ならそれぞれ、{ldelim}
および{rdelim}
が対応している。