简单的DELETE查询不起作用

时间:2012-12-25 12:20:36

标签: php sql sql-delete

这是我应该能够做的事情,但我一直在努力在最后一小时看到这里的问题,但我做不到。这是一个简单的删除功能,可以通过使用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();
?>

1 个答案:

答案 0 :(得分:5)

所以,这不是一个完整的答案,但注释字段太短,无法指向正确的故障排除方向。

您的代码已损坏,但不符合您的预期。

  1. GET请求have to beidempotent。也就是说,除了提供内容之外,它们不能具有副作用。通过将删除功能绑定到GET请求,您会产生副作用。这有一些非常严重的后果。例如,某些浏览器和缓存机制可以预取链接。还要考虑搜索蜘蛛在抓取该页面时最终会做什么。

    将GET转为POST。也许使用表格和按钮代替?

  2. 你使用mysql_real_escape_string真棒,但你在这里使用它是不正确的。 mres旨在将字符数据编码为字符串的一部分。您正在标识符上使用它 - 表名。标识符不与字符串共享相同的转义语义,尤其是在引号之外使用时。

    只要delete函数的第一个参数永远不会通过用户,您可以在此处跳过mres

  3. 您没有检查mysql_query的结果。说手册:

      

    对于其他类型的SQL语句INSERTUPDATEDELETEDROP等,mysql_query()会在成功时返回TRUE或{{ 1}}出错。

    你丢掉了结果。您应该检查不是 FALSE,然后调用mysql_affected_rows以确保删除了一行且只有一行。如果false mysql_query,那么您可以查看false

  4. 进行这些更改后,您需要更改delete_category.php脚本以帮助进行故障排除:

    1. 将以下两行添加到最顶层:
        error_reporting(-1);
        ini_set('display_errors', true);
      
    2. 将所有mysql_error更改为header s。立即重定向将掩盖任何错误。
    3. 使用echo代替exit。虽然他们做同样的事情,die的使用经常专门用于“现在我必须退出的事情”,vs die,这只是,嗯,呃......退出。
    4. 任何真正出错的事情都应该非常明显。

      如果仍然没有看到任何错误发生,并且仍然没有删除行,请尝试使用相同的表名和exit子句在删除前后添加SELECT COUNT(*) FROM ... 。这将有助于我们进一步排查问题。

      长期来看,您真的想从WHERE PDOmysqli开始切换。 PHP的下一个主要版本5.5版弃用 mysql_函数系列。