-4

クエリの実行方法が SQL インジェクションに対してオープンであることがわかっているため、MySQLi で最初の準備済みステートメントを作成しようとしています。

これの bind_param と bind_result の部分が本当にわかりません。誰かがこれを可能な限り最も馬鹿げた方法で説明してくれませんか。

これが機能する私のクエリです。

$sql = "UPDATE formdata SET name = '$varName', email = '$varEmail', address = '$varAddress', city = '$varCity', state = '$varState', zip = '$varZip', submitDate  = '$varDate' WHERE promoCode = '$varPromo'";
$mysqli->query($sql);

そして、これが準備されたステートメントでの私の試みです。

$query = "UPDATE formdata SET name = ?, email = ?, address = ?, city = ?, state = ?, zip = ?, submitDate  = ? WHERE promoCode = '$varPromo'";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $varName, $varName, $varEmail, $varAddress, $varCity, $varState, $varZip, $varDate);
$stmt->execute();
$stmt->bind_result($varName, $varName, $varEmail, $varAddress, $varCity, $varState, $varZip, $varDate);
$stmt->fetch();

header("location: index.php?success=1");
exit();
4

1 に答える 1

1

エラー メッセージの情報は役に立ちますが、注意すべき点がいくつかあります。

まず、最初の引数では、渡される情報 (string、int など) を示し、引数をリストするのと同じ順序でbind_param()各情報を指定する必要があります。たとえば、2 つの文字列と 2 つの整数がある場合は、次のように入力します。

$stmt->bind_param("ssii", $str1, $str2, $int1, $int2);

また、と$varNameの両方で 2 回使用する変数があります。情報ごとに異なる変数名を使用することをお勧めします。ただし、この場合、ステートメントを実行しているため、影響を受ける行の数のみを取得するため、代わりにbind_param()bind_result()UPDATE$stmt->bind_result(...);echo $stmt->affected_rows;

select ステートメントはまったく異なるシナリオであり、その場合、結果情報を変数にバインドします。ただし、上記のチュートリアル hakre を参照してください。それらには多くの適切な例があり、独自の準備済みステートメントを作成して結果を返すための出発点を提供するのに役立ちます.

于 2013-10-18T19:48:32.463 に答える