MySQL(+PHPのPDO)の質問です。


$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です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/11/30 16:32:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント60pt

おそらく不適切な文字が入っているのだと思うのですが、

$from_enはメールアドレスを暗号化したデータで、

上記のような内容となっているため特定できかねています。

その内容だと MySQL の文字列変換によって予想とは違うものに変換されるな。

まぁ、k_mail フィールドの型にもよるが。


prepareメソッドを使っているので、エスケープの問題ではない

いや、それは誤解。

エスケープの問題を避けるなら、プレースホルダーを使わないと意味が無い。

PDOでサクサクDB開発(1/9):CodeZine


一番簡単なやり方は暗号化後のバイナリを Base64 なりでテキスト化して扱うこと。

かならずしも Base64 にこだわる必要は無いがこの手の処理では一番効率が良いので。

id:mitaina

base64_encodeを通したら、たしかにあっさり片づきました。

バイナリのままにしてるからハマった……のでしょうか。

普通はバイナリのまま検索等するのではなく、

テキスト化してからでないといけないのでしょうか(なんとなくそんな気がしますが……)

なにはともあれ、一人では糸口をみつけることができなかったので、とても助かりました。

ありがとうございました。

k_mail フィールドの型はBLOBにしていましたが、

テキスト化するなら変えられますね。

あとプレースホルダーの件、ご教授ありがとうございます。

誤解してました。理屈がわかってないといけませんね。

正確な理解に努めていこうと思います。

2009/11/30 16:32:11

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません