这是我应该能够做的事情,但我一直在努力在最后一小时看到这里的问题,但我做不到。这是一个简单的删除功能,可以通过使用ID标签删除条目。它正在通过delete_category.php
。如果它有助于我的sql表被称为blog_categories
。
它没有抛出错误。尝试使用echo mysql_error(),但没有。它只是像死链接一样刷新页面。
任何帮助将不胜感激。
blog.php的:
function delete($table, $id) {
$table = mysql_real_escape_string($table);
$id = (int) $id;
mysql_query("DELETE FROM {$table} WHERE id = {$id}");
}
通过以下方式链接删除功能:
<a href="delete_category.php?id=<?php echo $category['id']; ?>">Delete</a>
Delete_category.php
<?php
include("../script/dbconnect.php");
include("../script/blog.php");
if ( ! isset($_GET['id']) ) {
header('location: cms.php');
die();
}
delete('blog_categories', $_GET['id']);
header('location:category_list.php');
die();
?>
答案 0 :(得分:5)
所以,这不是一个完整的答案,但注释字段太短,无法指向正确的故障排除方向。
您的代码已损坏,但不符合您的预期。
GET请求have to be为idempotent。也就是说,除了提供内容之外,它们不能具有副作用。通过将删除功能绑定到GET请求,您会产生副作用。这有一些非常严重的后果。例如,某些浏览器和缓存机制可以预取链接。还要考虑搜索蜘蛛在抓取该页面时最终会做什么。
将GET转为POST。也许使用表格和按钮代替?
你使用mysql_real_escape_string
真棒,但你在这里使用它是不正确的。 mres
旨在将字符数据编码为字符串的一部分。您正在标识符上使用它 - 表名。标识符不与字符串共享相同的转义语义,尤其是在引号之外使用时。
只要delete
函数的第一个参数永远不会通过用户,您可以在此处跳过mres
。
您没有检查mysql_query
的结果。说手册:
对于其他类型的SQL语句
INSERT
,UPDATE
,DELETE
,DROP
等,mysql_query()会在成功时返回TRUE
或{{ 1}}出错。
你丢掉了结果。您应该检查不是 FALSE
,然后调用mysql_affected_rows
以确保删除了一行且只有一行。如果false
mysql_query
,那么您可以查看false
。
进行这些更改后,您需要更改delete_category.php脚本以帮助进行故障排除:
error_reporting(-1); ini_set('display_errors', true);
mysql_error
更改为header
s。立即重定向将掩盖任何错误。echo
代替exit
。虽然他们做同样的事情,die
的使用经常专门用于“现在我必须退出的事情”,vs die
,这只是,嗯,呃......退出。任何真正出错的事情都应该非常明显。
如果仍然没有看到任何错误发生,并且仍然没有删除行,请尝试使用相同的表名和exit
子句在删除前后添加SELECT COUNT(*) FROM ...
。这将有助于我们进一步排查问题。
长期来看,您真的想从WHERE
PDO或mysqli开始切换。 PHP的下一个主要版本5.5版弃用 mysql_
函数系列。