0

なぜこれが機能しないのかを理解しようとしています。フォームからエントリを1つだけ追加してから、電子メールを追加すると、機能しなくなりました。また、これはSQLインジェクションから安全ですか?これがエラーメッセージです

ERROR: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

これがinsert.phpの私のコードです:

<?php 

try {
$conn = new PDO('mysql:host=localhost;dbname=info', 'blah', 'test');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare('INSERT INTO people (name, email) VALUES (:name, :email)');
$stmt->bindParam(':name', $POST_['name']);
$stmt->bindParam(':email', $_POST['email']);
$stmt->execute(array(':name' => $_POST['name']));
$stmt->execute(array(':email' => $_POST['email']));
#If one or more rows were returned...

} catch(PDOException $e){
    echo'ERROR: ' . $e->getMessage();
}

?>

フォームから値を1つだけ挿入する場合の作業コードは、次のとおりです。

<?php 

try {
$conn = new PDO('mysql:host=localhost;dbname=encorem2_info', 'encorem2', 'Yamaha!32088!');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare('INSERT INTO people (name) VALUES (:name)');

$stmt->execute(array(':name' => $_POST['name']));

#If one or more rows were returned...

} catch(PDOException $e){
    echo'ERROR: ' . $e->getMessage();
}

?>

これが別のファイルの私のhtmlコードです:

<!DOCTYPE html>

<html>
    <head>
        <title>Welcome!</title>

    </head>
    <body>

<form action="insert.php" method="post">
Name: <input type="text" name="name" id="name" />
Email: <input type="text" name="email" id="email"/>
<input type="submit" />
</form>

    </body>

</html>
4

3 に答える 3

2

bindParam()別々の呼び出しを実行してスキップするときに、両方のパラメーターをバインドします。

$stmt->bindParam(':name', $POST_['name']);
$stmt->bindParam(':email', $_POST['email']);
$stmt->execute(array(':name' => $_POST['name']));
$stmt->execute(array(':email' => $_POST['email']));

する必要があります

$stmt->execute(array(':name' => $_POST['name'], ':email' => $_POST['email']));
于 2012-10-31T02:17:49.407 に答える
0

実際には、パラメータを個別にバインドしている場合は、実行するものを渡す理由はありません。電話するだけ

$stmt->execute();

bindParamを呼び出した後。

于 2012-10-31T02:18:59.767 に答える
0

bindParamORのいずれかでデータを渡す必要がありますexecute。交換する方が簡単です

$stmt->bindParam(':name', $POST_['name']);
$stmt->bindParam(':email', $_POST['email']);
$stmt->execute(array(':name' => $_POST['name']));
$stmt->execute(array(':email' => $_POST['email']));

$stmt->execute(array(':name' => $_POST['name'],':email' => $_POST['email']));
于 2012-10-31T02:19:36.623 に答える