【问题标题】:Do failed MySQL queries cause side affects?失败的 MySQL 查询会导致副作用吗?
【发布时间】:2015-10-18 09:14:43
【问题描述】:

我正在使用 Wordpress,并使用 AJAX 通过 PHP 从 MYSQL 数据库中删除帖子。

这很好用。

我网站上的用户可以“收藏”帖子,这会呈现一个列表,显示他们收藏的内容(基本上是一个单独的表格,将他们的用户 ID 与帖子 ID 交叉引用)。

现在的问题是,当一个帖子被删除时,我还需要从另一个表中删除所有“收藏”的引用。

我通过运行以下查询作为删除后例程的一部分来做到这一点:

 $wpdb->query("DELETE FROM favourite_posts WHERE post_id = ".$_REQUEST['id']);

这很完美,但如果我添加错误检查:

 $wpdb->query("DELETE FROM favourite_posts WHERE post_id = ".$_REQUEST['id']) or die(mysql_error());

而且帖子不在收藏夹表中,显然整个例程都失败了。

所以我的问题是……

在 favourite_posts 表中不存在的帖子上运行此例程时,是否会运行第一个查询(不进行错误检查),导致问题/服务器过载等?还是 MYSQL 只是忽略失败的请求并照常进行?

或者这是不好的做法,我应该在尝试删除之前检查该帖子是否存在于 favourite_posts 中?显然,这意味着我希望避免更多的查询。

【问题讨论】:

  • 你也意识到你很容易受到注入攻击,对吧?
  • DELETE 语句如果找不到要删除的匹配行,将不会抛出错误!这很好,因为它是合乎逻辑的。只有在 sql 语句中出现语法错误(见上文:sql 注入漏洞)或删除会违反某些约束(如外键)时才会引发错误。
  • @arkascha 这是一个例子;我敢肯定还有其他方法,但重点仍然存在; OP 直接在查询中使用未转义的请求变量,甚至没有进行类型转换。
  • @Grant 转义参数有帮助,但这是错误的方法。相反,您应该阅读“准备好的语句”和“参数绑定”的优点。

标签: php mysql wordpress error-handling


【解决方案1】:

这不是一个失败的请求,它是一个不影响任何行的查询,因为没有一个匹配 WHERE 条件。一点问题都没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多