質問: mysqli_connect('xxx.sakura.ne.jp', 'yyy', 'zzz'); $name =isset($name) ? mysqli_real_escape_string($link, $name) : ""; $dsn='mysql:dbname=yyy;host=xxx.sakura.ne.jp'; $user='yyy'; $password='zzz'; $dbh=new PDO($dsn,$user,$password); $dbh->query('SET NAMES utf8'); $sql="SELECT name FROM database WHERE number=?"; $stmt=$dbh->prepare($sql); $data2[0]=$number; $stmt->execute($data2); $dbh=null; $rec=$stmt->fetch(PDO::FETCH_ASSOC); $name_in=htmlspecialchars($rec['name']); print$name_in; print''; print''; ?> ```
回答: そもそも、SQLインジェクション対策は、 案1:プレースホルダを使って、SQLへの変数の埋め込みはライブラリに任せる 案2:mysql_real_escape_stringを使って、変数をエスケープして、プレースホルダを使わず、自分でSQL文字列を組み立てる の選択(案1推奨)なので、 プレースホルダを使った変数埋め込み時にmysql_real_escape_stringを呼ぶのは間違いです。mysql_real_escape_stringでエスケープされた文字列がそのまま文字通り使われます。 それにしても「田中さん」がエスケープされるのは解せませんが。どんな文字コード設定ならそうなってしまうんでしょうね。