画像の拡張子
PHPでCMSを作る場合、画像をアップロードして反映させる機能を作ることも多い。その際どんな風に作るのが一般的なんだろうか、と疑問に思ったので、現在の自分の作業をメモしておくことにする。
- アップロードされたファイルの形式をチェックする
画像かどうかのチェックは必須とする。 - ファイルの拡張子なしで保存する
拡張子なしのファイル名で画像を保存する。PCブラウザは、拡張子なしでもだいたい対応してくれるので。
PHPでCMSを作る場合、画像をアップロードして反映させる機能を作ることも多い。その際どんな風に作るのが一般的なんだろうか、と疑問に思ったので、現在の自分の作業をメモしておくことにする。
PHPからメールを送信するとき、mail関数やmb_send_mail関数などを使う。このとき、Fromとして送信元を指定する場合、第4引数として「From: test@example.com」のように与えると、送信元を指定したメールを送信することができる。ただしこのままでは日本語は使えない。この引数はそのままメールのヘッダとして追加されるので、日本語は適切に変換をかけなければいけないことになっている。
ここまでは当たり前の話だが、注意しなくてはいけないのは、日本語の適切な変換をかけるための関数「mb_encode_mimeheader」の使い方だ。マニュアルを見ると以下のように書いてある。
string mb_encode_mimeheader ( string str [, string charset [, string transfer_encoding [, string linefeed]]] )
mb_encode_mimeheader() は、MIME ヘッダ エンコーディング方式によって文字列 str をエンコードします。この関数は、ASCII 表現の文字列を返します。
charset は、str の文字セット名です。デフォルトは、現在の NLS 設定 (mbstring.language)によって決まります。
transfer_encoding は MIME エンコーディングの 方式を指定します。“B” (Base64) または “Q” (Quoted-Printable) のどちらかでなければなりません。 デフォルトは “B” です。
第一引数はいうまでもなく変換したい文字列だ。この関数では基本的にこの第1引数だけを指定しておくのが無難。必要に応じて以降の引数を設定することもあるだろうが、第2引数の扱いには注意が必要だ。
マルチバイト関数ならたいてい使用している文字コードを引数として与えるオプションがついている(これはmbstring.internal_encodingに連動している)。しかしこのmb_encode_mimeheaderで与えるcharaset(第2引数)はその意味がまったく異なる(ようだ)。
例えばUTF-8でプログラムを記述しているからといって以下のように記述するのはNGだ。
mb_encode_mimeheader($str, ‘UTF-8′);
変換結果を出力すると以下のようになっている。
=?UTF-8?B?・・・・・・・・・・・・
本来なら「=?ISO-2022-JP?B?・・・・・・・・・・・」なはずなのに・・・。理由は省略するとして正しくは以下のように記述しておくのが無難なようだ。
mb_language(‘Japanese’);
mb_internal_encoding(‘UTF-8′);
$str=mb_encode_mimeheader($str);
1行目のmb_language関数でmb_encode_mimeheader関数に対して「日本語ルールで変換せよ」と命令していることになる。2行目で「現状文字列はUTF-8で記述されているので、UTF-8から変換すればよいものと想定して処理せよ」といった感じだろうか。だから1行目と2行目を記述しておくことだけでいいはずだ。
ちなみに引数として渡すには、以下の内容でmail関数やmb_send_mail関数の第4引数として渡せばよい。
mb_language(‘Japanese’);
mb_internal_encoding(‘UTF-8′);
$option=’From: ‘.mb_encode_mimeheader(‘名前’).'<test@example.com>';
mail($recipient,$subject,$message,$option);
携帯サイト等シフトJISでサイトを構築する場合、Smartyを使うことにしている。PHP自体はシフトJISでの記述はNGなのでUTF-8で記述し、テンプレートHTMLをシフトJISで記述して使用している。素でそのまま使ってしまうと文字化けしてしまうので、テンプレートを読み込む際にいったん文字コードをUTF-8に変換し、出力するときに再度シフトJISに変換するような処理をしている。
そのときに便利な機能がSmartyのフィルタだ。フィルタにはプレフィルタ、ポストフィルタ、アウトプットフィルタの3種類があり、用途は以下のとおり。
実は最初勘違いしていた。プレフィルタとポストフィルタだけだと思っていた。テンプレート読み込み時にプレフィルタにかけられ、HTML出力時にポストフィルタにかけられると思っていた。Smartyを使った処理を記述する際に、希望通りの動作をしてくれないのでマニュアルを読み直してみて初めて知った。ちょっと恥ずかしい。
もう何十回もhtaccessに記述しているのに、必要に迫られ、その都度検索している自分が悲しい。メモしておくことにする。
AddType application/x-httpd-php .html
覚えられないのは老化?。
ウェブサイトを移転をスマートにおこなう方法。移転といってもいろいろな種類があるけど、今回はサーバのコンテンツはまったくそのままで、別のサーバ(もしくは別のディレクトリ)へ移動させる場合を考えた(基本的に別サーバへの移転として考える)。まず新しいサイトを用意しておくのはいいとして、古いサイトから新しいサイトへの移動のさせ方が問題だ。やり方としては4つ思いつく。
4が便利でお勧め。このサイトもコレを使って移転しました。古いURL(php.atseason.com)でブックマークしている方は、新しいURL(php.tekmemo.com)でのブックマークをお願いします。