简单的DELETE查询不起作用

mem*_*one 0 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}");
    }
Run Code Online (Sandbox Code Playgroud)

链接删除功能:

<a href="delete_category.php?id=<?php echo $category['id']; ?>">Delete</a>
Run Code Online (Sandbox Code Playgroud)

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();
?>
Run Code Online (Sandbox Code Playgroud)

Cha*_*les 5

因此,这不是一个完整的答案,但评论字段的方式太短,无法指出正确的故障排除方向.

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

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

    把那个GET变成POST.也许使用表格和按钮代替?

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

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

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

    对于其他类型的SQL语句,INSERT,UPDATE,DELETE,DROP,等的mysql_query()返回TRUE成功或FALSE出错.

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

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

  1. 将以下两行添加到最顶部:
      error_reporting(-1);
      ini_set('display_errors', true);
    
  2. 将所有headers 更改为echos.立即重定向将掩盖任何错误.
  3. exit而不是die.虽然他们做同样的事情,但是die经常使用"在某些事情上出现了错误以至于我现在必须退出"的情况下,vs exit,这只是,嗯,呃...退出.

那些实际上出错的东西应该是非常明显的.

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

从长远来看,你真的想开始从mysql_ PDOmysqli切换.PHP的下一个主要版本,5.5版本,被mysql_系列函数.