2013-04-22 5 views
0

Мне просто интересно: если запись не существует, «UPDATE» также делает «обновление»? Я использую следующий код, и if-statement всегда имеет «успех», особенно если адрес электронной почты не найден «WHERE». Должен ли я проверять, существует ли электронная почта в таблице?обновление: нет ошибки, если запись не существует

$email=...; 
if ($update_stmt = $mysqli->prepare("UPDATE members SET password = ?, salt = ? WHERE email='".$email."'")) 
     { 
     $update_stmt->bind_param('ss', $password, $random_salt); 

     $update_stmt->execute() 
     header("Location: ...?success=1"); 
     } 
     else 
      header("Location: ...?error=1"); 

Спасибо за любые предложения.

+1

если запись не существует, какая запись будет обновляться? –

+2

Если предложение 'WHERE' не соответствует ни одному из строк, ничего не выполняется. Вы можете проверить [затронутые строки] (http://php.net/manual/en/mysqli.affected-rows.php). – alex

+0

В SQL семантика ошибок - это не то, для чего вы их используете. Это прекрасно, чтобы сделать запрос, который не возвращает никаких строк. Почему это должно быть ошибкой? Ошибки связаны, главным образом, но не исключительно, с синтаксическими ошибками или ошибками, выполняющими определенные операции. Если вам нужно создать ошибку, когда обновление не выполняется, вам нужно проверить, были ли возвращены какие-либо строки и возникла ошибка, если их не было. – Eric

ответ

1

это потому, что вы поменяете либо если матч существует или нет

$update_stmt->execute() 
if($update_stmt->affected_rows != 0) 
{ 
    header("Location: ...?success=1"); 
} 
else 
{ 
    header("Location: ...?error=1"); 
} 

также удалить, что if до вашего запроса, так что окончательный код будет выглядеть

$update_stmt = $mysqli->prepare("UPDATE members SET password = ?, salt = ? WHERE email='".$email."'")) 
$update_stmt->bind_param('ss', $password, $random_salt); 
$update_stmt->execute() 
if($update_stmt->affected_rows != 0) 
{ 
    header("Location: ...?success=1"); 
} 
else 
{ 
    header("Location: ...?error=1"); 
} 
+0

Большое спасибо Фабио. Ваш код спас мой день. if-check «$ mysqli-> prepare (...)» также не требуется, да. –

+0

@DavieSteady вы приветствуете чувак – Fabio

0

Вы должны извлечь количество строк, на которые повлияла предыдущая операция. Это обеспечивается affected_rows.

if ($mysqli->affected_rows == 1) 
{ 
    echo 'A record was deleted'; 
} 
0
$email=...; 
$mysqli->prepare("UPDATE members SET password = ?, salt = ? WHERE email='".$email."'")) 
$update_stmt->bind_param('ss', $password, $random_salt); 
$update_stmt->execute(); 

if ($update_stmt->affected_rows > 0){ 
    header("Location: ...?success=1"); 
     } 
else 
    header("Location: ...?error=1"); 
+0

запрос будет всегда выполнен, вам нужно проверить, выполнено ли обновление – Fabio

+0

@Fabio Many Thanks – Amir

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