2012-06-05 17 views
1

我有這樣爲什麼這個UPDATE過程更新每一行?

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

一個MySQL的存儲過程,我這個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檢查。到底是怎麼回事?我怎樣才能讓它只更新一行?

+1

您可能正在使用存儲過程中名爲'id'的變量,對嗎?這與「ID」列衝突。將變量名稱(在SP中)更改爲其他名稱,例如'update_id' –

回答

2

在存儲過程中,當字段名和參數名之間發生名稱衝突時,將使用這些參數。

您的查詢解析爲:

UPDATE ... 
WHERE :id = :id 

這始終是真實的(除非你傳遞一個NULL

在前面加上一個下劃線的參數名稱:

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

另請注意MySQL [docs](http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html),'參數名不區分大小寫',因此衝突。 –

4

因爲` ID `是您的列的區分大小寫的名稱,id是同一列的不區分大小寫的名稱。

編輯這是錯誤:你應該使用一個PHP變量,其中小寫ID是。就像$ id一樣。

在你的情況下,你正在調用綁定參數的過程。

對於id參數使用不同的名稱。

這是一個名稱範圍局部變量beloging到過程的問題,而參數變量屬於過程與表列名稱。

+0

OP正在使用MySQL存儲過程。 –

+0

有關使用$ id的答案是錯誤的,但「ID」與** id **具有相同標識符的基本概念是正確的。 –

相關問題