1

私はこのようなMySQLストアドプロシージャを持っています

UPDATE `Discounts` SET `Occupation`=occupation,
`Organization`=organization,
`LastName`=lastName,
`FirstName`=firstName,
`Email`=email,
`Phone`=phone,
`Description`=description,
`ExpirationDate`=expiration,
`Notes`=notes 
  WHERE `ID` = id

そして私はこのPHPでそれを呼んでいます

$occupation = $_POST["occupation"];
$organization = $_POST["organization"];
$last = $_POST["last"]; 
$first = $_POST["first"]; 
$email = $_POST["email"];
$phone = $_POST["phone"]; 
$description = $_POST["description"];
$notes = $_POST["notes"];
$expiration = date("Y-m-d H:i:s", strtotime($_POST["expiration"]));
$id = intval($_POST["id"], 10);

$password = $_POST["password"];

$mysqli = new mysqli("localhost", "xxx", $password, "xxxxxxxx");
if ($mysqli->connect_errno) {
    die("Could not connect");
}
$stmt = mysqli_stmt_init($mysqli);
if (mysqli_stmt_prepare($stmt, 'CALL UpdateDiscount(?,?,?,?,?,?,?,?,?,?)')) {
    mysqli_stmt_bind_param($stmt, "isssssssss", 
      $id, 
      $occupation, 
      $last, 
      $first,
      $email, 
      $phone, 
      $description,
      $organization,
      $notes,
      $expiration);
  mysqli_stmt_execute($stmt);
  mysqli_stmt_close($stmt);
  echo "Success!";
}

更新は、IDに対応する1行ではなく、すべての行を更新することを除いて、期待どおりに機能します。なぜこれが起こっているのか理解できません、私はWHERE 'ID'=idチェックをしています。何が起こっている?単一の行のみを更新するようにするにはどうすればよいですか?

4

2 に答える 2

4

`ID`は大文字と小文字を区別しない列の名前であり、idは大文字と小文字を区別しない同じ列の名前であるためです。

これを編集するのは間違っています:小文字のIDがあるPHP変数を使用する必要があります。$idのようなもの。

あなたの場合、バインドされたパラメータを使用してプロシージャを呼び出しています。

idパラメーターには別の名前を使用してください。

これは、プロシージャに属するローカル変数の名前スコープと、プロシージャに属する引数変数とテーブルの列名の問題です。

于 2012-06-05T13:09:36.110 に答える
2

ストアドプロシージャでは、フィールド名とパラメータ名の間で名前の競合が発生すると、パラメータが使用されます。

クエリは次のように解析されます。

UPDATE  ...
WHERE   :id = :id

これは常に真実です(あなたが合格しない限りNULL

パラメータ名の前にアンダースコアを付けます。

CREATE PROCEDURE myprc (_id, _occupation, ...)
AS
BEGIN
        UPDATE  mytable
        SET     occupation = _occupation
        WHERE   id = _id;
END;
于 2012-06-05T13:17:02.870 に答える