2014-10-07 105 views
0

我想在電影不存在時收到通知。這表示從數據庫中刪除電影的腳本。 這是什麼,我現在有一個部分:在使用預準備語句刪除之前檢查值是否存在

$title = $_POST["title"]; 
$delMovie = mysqli_prepare($link, "DELETE FROM movie WHERE title=?"); 
mysqli_stmt_bind_param($delMovie, "s", $title); 
if (mysqli_stmt_execute($delMovie)) { 
    echo("Movie \"" . $title . "\" successfully deleted: "); 
    echo(mysqli_stmt_affected_rows($delMovie) . " rows affected"); 
} else { 
    echo("Error (" . mysqli_stmt_errno($delMovie) . "): "); 
    echo(mysqli_stmt_error($delMovie)); 
} 
mysqli_stmt_free_result($delMovie); 
mysqli_stmt_close($delMovie); 
mysqli_close($link); 

當影片不存在,但它仍然會返回:

Film "Movie1" successfully deleted: 0 rows affected

正如你所看到的,它不存在,但仍返回「成功」。我怎樣才能改變這種顯示:

Error: Movie does not exists in database

+0

它成功返回,因爲查詢沒有失敗並顯示錯誤。沒有受到影響的行。 – 2014-10-07 20:45:58

+4

爲什麼不只是將'mysqli_stmt_affected_rows($ delMovie)'存儲在一個變量中,並且如果== 0回顯出不同的消息。只要運行刪除查詢並且不刪除任何行就不會造成傷害。然後你只運行一個查詢,反正會更快。 – 2014-10-07 20:47:26

+0

由於後者受到醜陋[競爭條件](http://en.wikipedia.org/)的限制,「刪除並查看是否有任何東西」刪除方法比「測試和條件刪除」方法好得多。 wiki/Race_condition)你的測試可能會失敗,但記錄稍後會出現。 – tadman 2014-10-07 20:49:51

回答

2

如何如下:

if (mysqli_stmt_affected_rows($delMovie) == 0) then 
    echo "Error: Movie does not exists in database"; 

只是因爲MySQL返回0,並不意味着你必須拿出結果,彷彿這是不止一個。

=============================================

你是唯一的其他選擇是

1) Do a select statement to check for existence 
2) If not exists 
    a) Show error 
    b) Delete 
     - If error deleting, show error 
     - Else show success 

1) Delete 
    - If 0 rows affected or error, Show error message 
    - Else show success 

我認爲第二個路徑上的變化使得更清潔的代碼。

+0

像魅力一樣工作,謝謝:) – Patrick2607 2014-10-07 21:14:22

相關問題