例えば、「ソムリエ」→「ソ\ムリエ」が、これにあたります。
今回は、この文字化けを回避する方法をご紹介します。
magic_quotes_gpc を設定する
回避方法は簡単です。
PHP設定(PHP.ini)で、magic_quotes_gpc を off にするだけです。
-
magic_quotes_gpc = off
.htaccessでも設定可能です。
-
php_flag magic_quotes_gpc off
magic_quotes_gpcは、文字列中に「'(シングル・クォテーション)」や「"(ダブル・クォテーション)」、「\」を自動でエスケープする機能です。
「ソムリエ」→「ソ\ムリエ」となってしまうのは、「ソ」の2バイト目の文字コードが「\」と一緒なため、magic_quotes_gpcでエスケープされていました。
「ソ」以外にも、「表」「予」「能」「申」などで同様の現象が発生します。
備忘録として追加していきますので、ご活用ください。
AUTO_INCREMENTのカラムに挿入した値を取得する
insert文の直後にlast_insert_id()関数で取得します。
- insert into table_name ...;
- select last_insert_id();
INSERT文で既存レコードがあればUPDATEする
レコードが無ければinsert、有ればupdateする場合、insert文に「on duplicate key update 更新するカラム,...」を追加することで、1つのステートメントで実行できます。
- insert into table_name (a,b,c) values (1,2,3)
受信メールから、件名、本文、添付ファイル(画像)を取得する方法をご紹介します。
受信メールを解析する
PEARのMail_mimeDecodeを使用して、受信メールを解析します。
受信メールからのPHPスクリプトの呼び出しは「さくらインターネットで、メール自動返信をする」を参照してください。
- #!/usr/local/bin/php -q
- <?php
- //PEARのパスを設定
- $path = '/home/{さくらアカウント名}/pear/PEAR/';
- set_include_path(get_include_path() . PATH_SEPARATOR . $path);
- require_once 'Mail/mimeDecode.php';
- //受信メールから読み込み
- $params['include_bodies'] = true;
- $params['decode_bodies'] = true;
- $params['decode_headers'] = true;
- $params['input'] = file_get_contents("php://stdin");
- $params['crlf'] = "\r\n";
- if (!$params['input']) {
- // 読み込み失敗
- exit();
- }
- $structure = Mail_mimeDecode::decode($params);
- //送信者のメールアドレスを抽出
- $mail = $structure->headers['from'];
- $mail = addslashes($mail);
- $mail = str_replace('"','',$mail);
- $mail = preg_replace('/(^.*<|>$)/', '', $mail);
- // 件名を取得
- $subject = $structure->headers['subject'];
- // 本文、添付ファイル(画像)を抽出
- switch (strtolower($structure->ctype_primary)) {
- case "text":
- // シングルパート(テキストのみ)
- $body = $structure->body;
- break;
- case "multipart":
- // マルチパート(画像付き)
- foreach ($structure->parts as $part) {
- switch (strtolower($part->ctype_primary)) {
- case "text":
- $body = $part->body;
- break;
- case "image":
- // 画像の拡張子を取得する
- $type = strtolower($part->ctype_secondary);
- // 添付ファイル保存
- $tmpName = '{保存ディレクトリ}/image.' . $type;
- if ($fp = fopen($tmpName, "w")) {
- $length = strlen($part->body);
- fwrite($fp, $part->body, $length);
- fclose($fp);
- }
- break;
- }
- }
- break;
- default:
- $body = "";
- }
- // 取得した情報を、データベースへ保存等の処理を行う
さくらインターネットで、自動メール返信するスクリプトを使用する方法をご紹介します。
.mailfilterでPHPへメールを転送する
以下の場所に.mailfilterファイルを作成します。
/home/{さくらアカウント名}/MailBox/{メールアカウント名}/.mailfilter
- to "| /usr/local/bin/php -q /home/{さくらアカウント名}/www/reply.php"
- exit
サーバーに受信メールを残したい場合は、先頭の「to」を「cc」に変えます。
- cc "| /usr/local/bin/php -q /home/{さくらアカウント名}/www/reply.php"
- exit
受信メールを解析し、自動返信メールを送信する
PEARのMail_mimeDecodeを使用して、受信メールを解析します。
- #!/usr/local/bin/php -q
- <?php
- //PEARのパスを設定
- $path = '/home/{さくらアカウント名}/pear/PEAR/';
- set_include_path(get_include_path() . PATH_SEPARATOR . $path);
- require_once 'Mail/mimeDecode.php';
- //受信メールから読み込み
- $params['include_bodies'] = true;
- $params['decode_bodies'] = true;
- $params['decode_headers'] = true;
- $params['input'] = file_get_contents("php://stdin");
- $params['crlf'] = "\r\n";
- if (!$params['input']) {
- // 読み込み失敗
- exit();
- }
- $structure = Mail_mimeDecode::decode($params);
- //送信者のメールアドレスを抽出
- $mail = $structure->headers['from'];
- $mail = addslashes($mail);
- $mail = str_replace('"','',$mail);
- $mail = preg_replace('/(^.*<|>$)/', '', $mail);
- // メール作成
- $from = {メールアドレス};
- $head = "From: $from\n";
- $subject = 'メール件名';
- $body = 'メール本文';
- // メール送信
- mb_language('japanese');
- mb_internal_encoding('EUC-JP');
- mb_send_mail($mail, $subject, $body, $head, $from);
- ?>
「utn」属性は送信する度に確認画面が出てしまいますので、「guid=ON」パラメータを付与して「iモードID」で識別する方法が主流になっています。
ここでは、この「guid=ON」パラメータをURLに自動付与する方法をご紹介します。
output_add_rewrite_var関数を使う
HTMLの前にoutput_add_rewrite_var関数を追加します。
- <?php
- if (DoCoMo端末の判定) {
- output_add_rewrite_var('guid', 'ON');
- }
- ?>
- <a href="index.php">トップページ</a>
- <form action="index.php">
- </form>
- <a href="index.php?guid=ON">トップページ</a>
- <form action="index.php">
- <input type="hidden" name="guid" value="ON" />
- </form>
そこで、formタグのactionに「guid」を付与する方法です。
url_rewriter.tagsに「form=action」を定義する
php.iniまたはini_set関数でurl_rewriter.tagsを設定します。
- php.iniで設定する場合
url_rewriter.tags="a=href,area=href,frame=src,form=action,fieldset=" - ini_set関数で設定する場合
ini_set("url_rewriter.tags", "a=href,area=href,frame=src,form=action,fieldset=");
- <a href="index.php?guid=ON">トップページ</a>
- <form action="index.php?guid=ON">
- <input type="hidden" name="guid" value="ON" />
- </form>