私は PDO メソッドを使い始めたばかりですが、ちょっとした質問に行き詰まっています。名と姓をデータベースに挿入するフォームを作成すると、以下のコードですべての種類の特殊文字を挿入できます。
try {
$db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
$db -> exec("SET CHARACTER SET utf8");
} catch(PDOException $e) {
echo $e->getMessage();
}
$query = $db->prepare("INSERT INTO users(fname, lname) VALUES(:fname, :lname)");
$insert_array = array(
":fname" => $fname,
":lname" => $lname
);
$query->execute($insert_array);
$db = NULL;
":;,-!"#¤%&&(%)?{][]}£$€{{{$@@_--"
SQL インジェクションを挿入しても、問題なく挿入できます。しかし、同様のコードでデータベースを更新しようとすると、引用符を除くすべての種類の特殊文字が受け入れられます。何故ですか?更新に使用しているコードは次のとおりです。
try {
$db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
$db -> exec("SET CHARACTER SET utf8");
} catch(PDOException $e) {
echo $e->getMessage();
}
$query = $db->prepare("UPDATE users SET fname=:fname, lname=:lname WHERE userid=:userid");
$update_array = array(
":fname" => $fname,
":lname" => $lname,
":userid" => $_GET['userid']
);
$query->execute($update_array);
$db = NULL;
私が得ることができるすべての助けに感謝しています。
-=解決策=-
htmlspecialchars()
文字列を「デコード」するために使用する必要がありました。このような:
<form action="" method="post">
First name<br><input type="text" name="fname" value="'.htmlspecialchars($user['fname']).'">
Last name: <br><input type="text" name="lname" value="'.htmlspecialchars($user['lname']).'">
<input type="submit">
</form>
これで、あらゆる種類の特殊文字が完全に機能します。みんな助けてくれてありがとう、本当にありがとう!:D