2012-06-05 3 views
1

У меня есть MySQL хранимые процедуры, как этотПочему эта процедура 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 

и я звоню его с этим 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!"; 
} 

Обновление работает точно так, как я ожидал, за исключением того, что он обновляет каждую строку вместо одной строки, соответствующей идентификатору. Я не понимаю, почему это происходит, у меня есть проверка 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.

Это проблема локальной переменной, зависящей от имени, зависящей от процедуры, от аргумента переменной, относящейся к процедуре, против имени столбца таблицы.

+0

OP использует процедуру хранения MySQL. –

+0

Ответ на использование $ id был неправильным, но основное понятие, что 'ID' - это тот же идентификатор, что и ** id **, является правильным. –

Смежные вопросы