【问题标题】:Mysql delete query won't work on lamp stackMysql删除查询不适用于灯堆栈
【发布时间】:2013-04-08 08:08:33
【问题描述】:

我正在做一个关于 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 运行正常。但是当我想删除任何对象时会出现一条弹出消息。我现在能做什么?

【问题讨论】:

  • 弹出消息是什么,mysql_error的结果是什么?
  • 1) SQL 注入警报! 2) 过时的 mysql API 警报! 3) 删除 GET 请求警报上的数据! 4) 警报警报!
  • 请看这个tinypic.com/r/2rzwc9g/6 ...
  • 你在这里做的事情是非常危险的,如果你不阅读SQL injection bugs,你将把自己暴露在各种非常严重的问题中。你不能这样编码。这里有很多可怕的错误。
  • 愚蠢的问题,但你有没有发出:mysql_connect()mysql_select_db();

标签: mysql php lamp phpmyadmin


【解决方案1】:

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

【讨论】:

  • 那为什么我的脚本不起作用?我知道我的脚本存在 sql 漏洞,但这还不完整。
  • 您遇到什么错误?仅仅是确认吗?你能把错误贴出来吗?
【解决方案2】:

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

另外,您没有过滤 " 和 ' 标记,因此您可能会遇到麻烦,并且您不能确保您的 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的警告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多