PHP不删除mysql中的行

PHP不删除mysql中的行,php,mysql,Php,Mysql,我一直在尝试删除mysql中的一行,但它不起作用。 它回显删除失败 我不知道代码出了什么问题。 欢迎提出任何建议 <?php error_reporting(0); include("db_config.php"); // array for JSON response $response = array(); if( isset($_GET['id'] ) ) { $id=$_GET['id']; $data=$_GET['data']; $item=$_

我一直在尝试删除mysql中的一行,但它不起作用。 它回显删除失败

我不知道代码出了什么问题。 欢迎提出任何建议

<?php
 error_reporting(0);
 include("db_config.php");

// array for JSON response
$response = array();
if( isset($_GET['id'] ) ) {

    $id=$_GET['id'];
    $data=$_GET['data'];
    $item=$_GET['item'];
    $time=$_GET['time'];

    $result = mysql_query("delete from myorder where id='$id' ");

    $row_count = mysql_affected_rows();

    if($row_count>0){
        $response["success"] = 1;
        $response["message"] = "Deleted Sucessfully.";
       }
    else{
        $response["success"] = 0;
        $response["message"] = "Failed To Delete";
     }
  // echoing JSON response
  echo json_encode($response);

 }
?>

在您的查询中,将$id左右的引号去掉,并连接起来以防万一

$sql = "DELETE FROM myorder WHERE id = ".$id;
编辑:正如注释所提到的,在查询中使用变量之前,应该先清理变量,以防止sql注入

我建议首先停止使用mysql,因为它不再受支持,并切换到mysqli或PDO。我个人更喜欢PDO


这里是一个链接,指向一篇关于SQL注入的文章,因为我假设一个脚本是从AJAX调用运行的,您将无法使用简单的echo语句对其进行调试,因此请尝试此操作,然后使用broswer调试器查看JSON中发送到浏览器的内容

查看db_config.php中的内容也可能很有用

另外,由于您显然只是在学习PHP和MYSQL,请不要浪费时间学习MYSQL_uu数据库扩展,它很快就会在PHP7中被完全删除,因为它已被删除。相反,更有效地利用您的时间,学习mysqli_u或PDO扩展。看

您使用单引号将$id字段括起来,这意味着SQL引擎将把“$id”解析为字符串文字,这不是您想要的,因为您希望使用传递给函数的动态id。为此,您可以通过执行以下操作将ID附加到查询中:

"DELETE FROM myorder WHERE id = " . $id;
虽然这可能有效,但恶意用户的SQL注入存在严重风险,我知道您是PHP新手,但越早发现这些危险越好

例如,用户可以将$id设置为;从myorder中删除,这将终止第一个查询并运行第二个查询,删除myorder表中的所有记录。更糟糕的是,恶意攻击者可能会尝试猜测模式(如用户)中表的常用名称,并运行类似以下内容的查询:

);从用户中选择*

这可能会暴露敏感信息,如用户名和密码,并真正把你放在一个你不想处于的位置

为了解决这个问题,有一些非常流行的数据库包装器,我最喜欢的。它允许您在执行查询之前安全地将值绑定到查询,准备好的值将默认为字符串,这样它们就不会在服务器上被解析为查询,从而使您免受此类攻击

我编写了一个简单的数据库包装器类,可以用来处理所有CRUD操作,可以找到它。然后你可以像这样使用它:

// Require the DB class and create an instance
require('../path/to/file/Database.php');
$db = new Database();

// Create a query, use the :param_name syntax to bind values
$query = "DELETE FROM myorder WHERE id = :id";

// Create the associative array that has data binding for values
$data = Array(":id" => $id);

// Run the query and capture the result
$deleted = $db->delete($query, $data);

// Check the result
if($deleted > 0)
    // deleted successfully
else
    // handle errors here

查询现在将绑定并安全运行,不会出现SQL注入的风险,如果您需要任何进一步的帮助,请询问。

尝试回显查询,然后手动运行以查看发生了什么。这就是它发布的内容{success:0,message:Failed to Delete}进行一些错误检查,也就是说,请注意mysqldeprecated@SteveKamau这就是你在问题中所说的。当你手动运行查询时会发生什么?您确定该ID存在于表中吗?需要一个;最后。事实上,这并不重要。在字符串上漏掉引号是不好的,但如果有点误导的话,引用数字是可以的。虽然这可能会回答问题,但请让OP意识到SQL注入的危险性…我可能应该提到我正在从android应用程序中删除,而这个JU会使进度对话框无休止地循环。Steve,放一个分号;在这一行之后,假设是所有混乱之母,我也尝试了你的代码,我的浏览器显示{mysql_query:delete from myorder where id=,mysql_error:你的SQL语法有错误;检查与你的mysql服务器版本相对应的手册,在第1行附近使用正确的语法}嗯,这不是很有帮助,是吗。但至少我们知道有一个错误啊$id中没有任何内容请参见sql,其中id=即没有传递给代码的id。我猜这意味着你正在从安德洛伊德那里传递一些古怪的角色。更奇怪的是,@riggsfully的意思是isset正在经历。已经设置好了,但我们不知道那是什么。OP可能需要逃离它。OP需要更清楚地了解什么是什么。如果使用MySQL_uu与@RiggsFolly连接,我认为代码中有id。让我更新我的问题。非常有用的一部分。为了安全起见,我一定会检查SQL注入实例。不要把它吹得过火;SELECT*FROM user将不起作用,因为mysql\u查询只允许您运行一个查询。
// Require the DB class and create an instance
require('../path/to/file/Database.php');
$db = new Database();

// Create a query, use the :param_name syntax to bind values
$query = "DELETE FROM myorder WHERE id = :id";

// Create the associative array that has data binding for values
$data = Array(":id" => $id);

// Run the query and capture the result
$deleted = $db->delete($query, $data);

// Check the result
if($deleted > 0)
    // deleted successfully
else
    // handle errors here