人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: mitaina
●カテゴリ:ウェブ制作
✍キーワード:?D ECHO MySQL PHP RC
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● b-wind
●60ポイント ベストアンサー

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

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

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

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

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


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

いや、それは誤解。

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

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


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

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

◎質問者からの返答

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

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

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

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

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

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ