【发布时间】: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