为什么这个UPDATE过程会更新每一行?

时间:2012-06-05 13:06:33

标签: php mysql sql

我有一个像这样的

的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的一行。我无法理解为什么会这样,我有一个WHERE 'ID'=id支票。到底是怎么回事?我怎样才能使它只更新一行?

2 个答案:

答案 0 :(得分:4)

因为`ID`是列的区分大小写的名称,而id是同一列的不区分大小写的名称。

编辑这是错误的:您应该使用小写 id 的PHP变量。有点像$ id。

在您的情况下,您正在调用带有绑定参数的过程。

id 参数使用其他名称。

这是一个名称范围的局部变量问题,而不是属于过程的变量变量与表列名称。

答案 1 :(得分:2)

在存储过程中,当字段和参数名称之间发生名称冲突时,将使用这些参数。

您的查询被解析为:

UPDATE  ...
WHERE   :id = :id

始终为真(除非您传递NULL

使用下划线添加参数名称:

CREATE PROCEDURE myprc (_id, _occupation, ...)
AS
BEGIN
        UPDATE  mytable
        SET     occupation = _occupation
        WHERE   id = _id;
END;