PHPでちょっと値を確認したい場合に良く使われるechoやらprint_rやらvar_dumpやら、インタプリタ言語ならすぐに確認できるのが良い。その表示を綺麗に整形してくれるライブラリを2つ、と自分用(主にバッチ処理などで)使っているもの。
- 文字列、配列、オブジェクト、DBリソース、XMLに対応
- JavaScriptで要素の折り畳み切替
- どの形式の場合も同じ呼び出し方

実行方法
new dBug($myVariable);
- 配列、オブジェクトに対応した print_a関数
- $_POST, $_GET, $_SESSION, $_COOKIEを表示する show_vars関数
- 開発2004年で止まっている

実行方法
print_a($myArray);
show_vars();
- print_rやvar_dumpのエイリアス集
- エイリアス関数の最終引数に1を渡せばそのままexitする
- CLIで動作時のみ対話型配列インデックスサーチと配列more表示
プリントデバッグで良く使う関数を1文字にしたものと、良く使う処理を2~3文字にしたもの。
- CLIで動作時のみ使える関数 p_s() と p_d()
渡した配列のIndexを入力するとその内容をprint_rするp_s()、何かキーを押すたびに1つずつ要素をprint_rする p_d、で対話モードに入れる。
実行方法
p($myArray);
v($myArray);
ec($myArray, 1);
fje($myArray, ",", 1);
m(); // メモリ使用量をMBで表示
適当にどうぞ。
Zend_MailのSMTPによるメール送信で単一コネクションで複数のメールを送信する場合のマニュアルが間違えているので注意。確認したVersionと箇所は以下。
ZendFramework1.0.2
21.3. SMTP 接続による複数のメールの送信
「例 21.4. SMTP 雪像による複数のメールの送信」によると以下の様に書かれている。
require_once 'Zend/Mail.php';
$mail = new Zend_Mail();
// メッセージを作成します...
require_once 'Zend/Mail/Transport/Smtp.php';
$tr = new Zend_Mail_Transport_Smtp('mail.example.com');
Zend_Mail::setDefaultTransport($tr);
$tr->connect();
for ($i = 0; $i < 5; $i++) {
$mail->send();
}
$tr->disconnect();
が、上記だとZend_Mail_Transport_Smtpにconnectメソッドが無いのでエラーになる。
代わりにZend_Mail_Protocol_Smtpにあるのでそっちでコネクションを張ってZend_Mail_Transport_SmtpのsetConnectionメソッドでセットしてやる。
<?php
$connection = new Zend_Mail_Protocol_Smtp($host, $port);
$connection->connect();
$connection->helo();
$tr = new Zend_Mail_Transport_Smtp;
$tr->setConnection($connection);
// 以下ループ処理
$mail = new Zend_Mail();
上記方法で1コネクションで複数のメール送信が出来る。
Zend_Mail_Transport_Smtpのデストラクタでdisconnectメドッソが呼ばれて自動的に接続解除されるので通常は問題無い。しかしSMTP接続がネットワーク障害で切れてしまった場合、disconnectの前に呼ばれるSMTPコマンドのQUITで例外が投げられるがデストラクタの例外は拾えなくてFatal Errorになってしまうので注意。
PEAR::MDB2のmysqliドライバを使用してキャラクタセットにSJISを使う時の注意。
SET NAMES sjis;
上記SQLの発行だけだと(cp932でも)プレースホルダのエスケープが上手く行われない場合がある。問題が起こるのはプレースホルダの引数に渡した文字の最終文字が特定の文字の場合。
以下の文字が該当し共通点は2バイト目が0×5c(ASCIIコードのに該当)なのでSQLのエスケープ処理で「’」によって囲まれても「’」自体がエスケープされてしまいsyntax errorになる。
― ソ Ы ? 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄
喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 ? 薌 硃 菑
mysqliにはmysqli_set_charset系のクライアントキャラクタセットを変更する関数・メソッドが用意されていて、それを利用しキャラクタセットを変更すればmysqli_real_escape_string関数が正しく2バイト目を判別するようになる。
変更にはmysqli接続オブジェクトが必要になるので取得して変更。
/**
* @var $mdb2 MDB2
*/
$mdb2->getConnection()->set_charset('sjis');
これで上の文字列が通れば大丈夫。MDB2.phpの読み込み重い・・・。