あなたの問題は、実際には引用符のエスケープに関する問題です。SQL ステートメントで値を囲むために、より標準的な一重引用符を使用していた場合は、おそらくこれにもっと簡単に気付くでしょうが、現在、電子メールの値の前に開始引用符がありません。
次のような準備済みステートメントの使用を強くお勧めします。
$query = 'INSERT INTO donations (name, email, donation_amount, item_id) VALUES (:name, :email, :amount, :radioButtons)';
$sth = $db->prepare($query);
$sth->execute(array(
':name' => $_POST['name'],
':email' => $_POST['email'],
':amount' => $_POST['amount'],
':radioButtons' => $_POST['radioButtons']
));
もちろん、これは、途中で配置したい適切なエラー処理を行うべきではありません。
この準備済みステートメントは、SQL インジェクションから保護し、引用符を不要にすることで SQL をより読みやすくするという利点もあります。
実際には、値の配列を渡して実行するよりも、すべてのパラメーターをバインドするより冗長な方法を使用することを好みます。これにより、入力タイプを明示的に指定できます (つまり、整数、文字列など)。したがって、最後の 2 つの値が整数であるという仮定に基づいて、次のようになります。
$query = 'INSERT INTO donations (name, email, donation_amount, item_id) VALUES (:name, :email, :amount, :radioButtons)';
$sth = $db->prepare($query);
$sth->bindParam(':name', $_POST['name'], PDO::PARAM_STR);
$sth->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$sth->bindParam(':amount', $_POST['amount'], PDO::PARAM_INT);
$sth->bindParam(':radioButtons', $_POST['radioButtons'], PDO::PARAM_INT);
$sth->execute();
何らかの理由で、PHP コミュニティは主に配列を介して に値を渡すことに引き寄せられていると思いますexecute()
。また?
、名前付きのプレースホルダーよりもプレースホルダーを使用する傾向がより一般的ですが、私にとって、これは単に怠け者です。つまり、コードの明瞭さを犠牲にするために余分な文字をいくつか書くことで、本当に多くの時間を節約しているということですか?