【问题标题】:Check if a value exists before deleting with prepared statement在使用准备好的语句删除之前检查值是否存在
【发布时间】:2014-10-07 20:43:07
【问题描述】:

我想在电影不存在时收到通知。这表示从数据库中删除电影的脚本。 这是我现在拥有的一部分:

$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);

当电影不存在时,它仍然返回:

电影“Movie1”已成功删除:0 行受影响

如您所见,它不存在,但仍返回“成功”。如何更改它以显示:

错误:数据库中不存在电影

【问题讨论】:

  • 它返回成功,因为查询没有因错误而失败。没有任何行受到影响。
  • 为什么不将mysqli_stmt_affected_rows($delMovie) 存储在变量中,如果 == 0 则回显不同的消息。只运行删除查询并且没有删除任何行并没有什么坏处。然后你只运行一个查询,无论如何它会更快。
  • “拍摄,看看你是否击中任何东西”的删除方法比“测试和有条件删除”方法要好得多,因为后者会受到丑陋的race conditions 的影响,您的测试可能会失败,但该记录稍后会出现。

标签: php mysql database mysqli prepared-statement


【解决方案1】:

以下内容如何:

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

我认为第二条路径的变体会使代码更简洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多