1

このエラー メッセージのいくつかの変形が表示され続けます。

警告: PDO::exec(): SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。C:\xampp\htdocs\donations\index.php の 31 行目の 1 行目の '@email.com",5,2)' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

それが参照しているPHPはこれです:

$db->exec("INSERT INTO donations(name, email, donation_amount, item_id) VALUES(\"" . $_POST['name'] . "\"," . $_POST['email'] . "\"," . $_POST['amount'] . "," . $_POST['radioButtons'] . ");");

正しくエスケープしていませんか、それとも引用符が多すぎますか? どんな助けでも大歓迎です!

4

3 に答える 3

1

あなたの問題は、実際には引用符のエスケープに関する問題です。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()。また?、名前付きのプレースホルダーよりもプレースホルダーを使用する傾向がより一般的ですが、私にとって、これは単に怠け者です。つまり、コードの明瞭さを犠牲にするために余分な文字をいくつか書くことで、本当に多くの時間を節約しているということですか?

于 2013-09-10T20:29:52.597 に答える
0

フィールド/テーブル名と括弧の間にスペースを追加します

INSERT INTO donations (name...) VALUES (...)

また、値を一重引用符 ' ' で囲みます。

VALUES ( '" . $_POST['名前'] . "' )

また、$ POST データを SQL クエリに直接挿入しないでください。これは SQL インジェクションを懇願しています。そしてぜひ、PDO/Prepared Statements を学び、mysql機能の使用をやめてください。その死んだ。

于 2013-09-10T20:17:57.477 に答える