$dbh = new PDO($conlist, $db_user, $db_pass, array(
PDO::ATTR_PERSISTENT => true,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET CHARACTER SET utf8;'
));
$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stat = $dbh->prepare( "SELECT * FROM member WHERE k_mail = '$from_en'" );
$stat->execute();
(1)
$from_en = "*���;�7=?�du�y[��d(;";
$from_en = "*���;�X��^p�%܋5[����";
(2)
$from_en = "*���;�7+e�#�H7(�cX0']�";
(1)のいずれかだと、$stat->execute();の結果が帰ってくるのですが、
(2)だと$stat->execute();の結果が帰ってきません。
$stat->execute();の直前までは動作していることを確認しています。
(echoで確認しているとこれ以降の表示がされません)
おそらく不適切な文字が入っているのだと思うのですが、
$from_enはメールアドレスを暗号化したデータで、
上記のような内容となっているため特定できかねています。
prepareメソッドを使っているので、エスケープの問題では
ないと思うのですが、そもそもSQL文の書き方を間違えている
(こういう時用の書き方がある?)のでしょうか。
PHP Version 5.2.5、MySQL 5.1.22-rcです。
文字コードは、UTF-8です。
おそらく不適切な文字が入っているのだと思うのですが、
$from_enはメールアドレスを暗号化したデータで、
上記のような内容となっているため特定できかねています。
その内容だと MySQL の文字列変換によって予想とは違うものに変換されるな。
まぁ、k_mail フィールドの型にもよるが。
prepareメソッドを使っているので、エスケープの問題ではない
いや、それは誤解。
エスケープの問題を避けるなら、プレースホルダーを使わないと意味が無い。
一番簡単なやり方は暗号化後のバイナリを Base64 なりでテキスト化して扱うこと。
かならずしも Base64 にこだわる必要は無いがこの手の処理では一番効率が良いので。
base64_encodeを通したら、たしかにあっさり片づきました。
バイナリのままにしてるからハマった……のでしょうか。
普通はバイナリのまま検索等するのではなく、
テキスト化してからでないといけないのでしょうか(なんとなくそんな気がしますが……)
なにはともあれ、一人では糸口をみつけることができなかったので、とても助かりました。
ありがとうございました。
k_mail フィールドの型はBLOBにしていましたが、
テキスト化するなら変えられますね。
あとプレースホルダーの件、ご教授ありがとうございます。
誤解してました。理屈がわかってないといけませんね。
正確な理解に努めていこうと思います。