0

这是我应该能够做的事情,但我在过去的一个小时里一直试图在这里看到这个问题,但我做不到。这是一个简单的删除功能,通过使用 ID 标签来删除条目。它正在通过delete_category.php. 如果它有助于我的 sql 表被调用blog_categories

它不会引发错误。尝试在其上使用 echo mysql_error() 但没有。它只是充当死链接并刷新页面。

任何帮助将不胜感激。

博客.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>

删除_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();
?>
4

1 回答 1

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. 将以下两行添加到最顶部:
      错误报告(-1);
      ini_set('display_errors', true);
    
  2. 将所有headers 更改为echos。立即重定向将掩盖任何错误。
  3. 使用exit而不是die. 虽然他们做同样的事情,但使用die经常专门用于“出现问题以至于我现在必须退出”的上下文中,而exit,这只是,嗯,呃......退出。

任何实际出错的事情都应该非常明显。

如果您仍然没有看到任何不正确的事情发生,并且行仍然没有被删除,请尝试SELECT COUNT(*) FROM ...在删除之前和之后添加一个,使用相同的表名和WHERE子句。这将有助于我们进一步排除故障。

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

于 2012-12-25T22:26:48.827 回答