0

我正在做一个关于 php 的项目工作。在我的工作中,每一个查询都能顺利进行。但是当我想删除任何使用它的对象时不会删除...

这是我的php代码

<?php
//delete item
if(isset($_GET['deletecat'])){
    $id_to_delete = $_GET['deletecat'];
    $sql = mysql_query("DELETE FROM `category` WHERE `Category_id`=$id_to_delete LIMIT 1") or die('Error: Could not delete.');
    }
    else{
    header('location: category.php');
    exit();
    }       
?>

之后我只收到错误消息。GET 值没问题。在我的 phpmyadmin 上,这个 SQL 运行正常。但是当我想删除任何对象时会出现一条弹出消息。我现在能做什么?

4

2 回答 2

0

有几层您可能会遇到问题:数据库连接、查询或您发送的数据。

此外,您没有过滤 " 和 ' 标记,因此您可能会遇到麻烦,并且您不能确保您的 id 是一个数字,因此您的 sql 也可能在那里失败。

但是,您可以通过对代码进行一些调整来解决这个问题......您可以在代码中插入一些诊断信息,以查看 mysql 报告错误的内容,并更好地了解如何修复它。

注意 [一般推荐][1] 使用 mysqli 扩展而不是 mysql 扩展,但不管怎样,这里是您当前使用的扩展的示例代码

希望这可以帮助!

<?php

    if ( isset($_GET['deletecat'])) {

        #dbh -> database resource. 
        $dbh = mysql_connect()

        #mysql_connect returns false if it fails. capture error and echo to output.
        if (!$dbh) {
            die("Could not connect to database server: ".mysql_error()."\n");
            #if using mysqli use mysql_connect_error() instead
        }

        #never trust input. use an escape function.    
        $id_to_delete = mysql_real_escape_string($_GET['deletecat'],$dbh);

        #force $id_to_delete to be treated as a number, or make it safer in your sql. 
        #i used the latter method below.
        $sql = "DELETE FROM `category` WHERE `Category_id` = '$id_to_delete' LIMIT 1");

        #mysql_query returns false on failure
        $result = mysql_query($sql,$dbh);

        #on failure catch the error and display the exact contents of 'deletecat' in a web-friendly way.
        if (!$result) {
            $error=mysql_error($dbh);
            die ("Error: Could not delete '"
                 .htmlentities(print_r($_GET['deletecat'],true)).". Error: $error\n"
            );

       }

       #if we did not trigger die() above we are ok.
       header('location: category.php');
       exit();
    }
?>

[1]:见警告http://php.net/manual/en/function.mysql-connect.php

于 2013-04-16T04:27:55.033 回答
0

您应该首先转义 GET 变量以避免任何 SQl 注入攻击,正如 deceze 已经说过的那样。那么,你应该明白,如果你需要执行删除查询,phpmyadmin给出的消息是一个确认。您可以使用mysql_real_escape_string($value)转义,但正如 php 供应商所说,此功能将很快被删除,目前已被弃用。再见..

于 2013-04-16T03:45:42.247 回答