Php 查询失败!您的SQL语法有错误;检查与MySQL服务器版本对应的手册

Php 查询失败!您的SQL语法有错误;检查与MySQL服务器版本对应的手册,php,mysql,sql,Php,Mysql,Sql,我正试着把这个输入数据库。然而,我得到了一个意想不到的错误,说: 查询失败!您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行的“orderOrder\u日期、Order\u时间、Delivery\u费用、Delivery\u Fname、Delivery\u Lname、Delivery”附近使用的正确语法 以下是我的PHP: <?php //error_reporting(E_ERROR | E_PARSE); include("includes/db.

我正试着把这个输入数据库。然而,我得到了一个意想不到的错误,说:

查询失败!您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第1行的“orderOrder\u日期、Order\u时间、Delivery\u费用、Delivery\u Fname、Delivery\u Lname、Delivery”附近使用的正确语法

以下是我的PHP:

<?php
//error_reporting(E_ERROR | E_PARSE);  
include("includes/db.php");
include("includes/functions.php");

if($_REQUEST['command']=='update')
{
$date     = date('Y-m-d');
$time     = time('H:i:s');
$charge   = $_REQUEST['ocharge'];
$fname    = $_REQUEST['ofname'];
$lname    = $_REQUEST['olname'];
$mobile   = $_REQUEST['omobile'];
$add1     = $_REQUEST['oadd1'];
$add2     = $_REQUEST['oadd2'];
$postcode = $_REQUEST['opostcode'];
$state    = $_REQUEST['ostate'];
$country  = $_REQUEST['ocountry'];
$weight   = $_REQUEST['oweight'];
$credit   = $_REQUEST['ocredit'];
$pin      = $_REQUEST['opin'];
$city     = $_REQUEST['ocity'];



    $result=mysql_query("insert into order(Order_Date,Order_Time,Delivery_Charge,Delivery_Fname,Delivery_Lname,Delivery_HP,Delivery_Street1,Delivery_Street2,Delivery_Postcode,Delivery_State,Delivery_Country,Total_Weight,Credit_No,Pin_No,Delivery_City) values ('$date',$time,$charge,'$fname','$lname',$mobile,'$add1','$add2',$postcode,'$state','$country',$weight,$credit,$pin,'$city')");

    if($result === FALSE)
    {
            die("Query Failed!".mysql_error().$result);
    }

    $orderid=mysql_insert_id();   


    $max=count($_SESSION['cart']);
    for($i=0;$i<$max;$i++)
    {
        $pid=$_SESSION['cart'][$i]['productid'];
        $q=$_SESSION['cart'][$i]['qty'];
        $price=get_price($pid);

        mysql_query("insert into order_detail (Order_ID,Product_ID,Order_Quantity,Sub_Total) values ('$orderid','$pid','$q','$price')");    
    }

    die('Thank You! your order has been placed!');

  }
  ?>
查询出了什么问题?

订单是一个问题。因此,您需要在backticks中转义它,如下所示:

INSERT INTO `order` ...

在查询中不使用保留关键字是更好的解决方案,但使用反勾号转义它们也很有效。

这里有一些调试技巧。与此相反:

$result=mysql_query("insert into order(Order_Date,Order_Time,Delivery_Charge,Delivery_Fname,Delivery_Lname,Delivery_HP,Delivery_Street1,Delivery_Street2,Delivery_Postcode,Delivery_State,Delivery_Country,Total_Weight,Credit_No,Pin_No,Delivery_City) values ('$date',$time,$charge,'$fname','$lname',$mobile,'$add1','$add2',$postcode,'$state','$country',$weight,$credit,$pin,'$city')");
始终这样做:

$sql ="insert into order(Order_Date,Order_Time,Delivery_Charge,Delivery_Fname,Delivery_Lname,Delivery_HP,Delivery_Street1,Delivery_Street2,Delivery_Postcode,Delivery_State,Delivery_Country,Total_Weight,Credit_No,Pin_No,Delivery_City) values ('$date',$time,$charge,'$fname','$lname',$mobile,'$add1','$add2',$postcode,'$state','$country',$weight,$credit,$pin,'$city')";
$result = mysql_query($sql);
这使得在处理代码时,执行以下操作变得很简单:

echo htmlentities($sql);
这将向您显示正在处理的查询,而不是生成查询的PHP代码,这可能会在您的值中隐藏笨拙的字符

最后,考虑编写这样的代码:

$sql = "
    INSERT INTO order (
        Order_Date, Order_Time, Delivery_Charge,
        Delivery_Fname, Delivery_Lname, Delivery_HP,
        Delivery_Street1, Delivery_Street2, Delivery_Postcode,
        Delivery_State,  Delivery_Country, Total_Weight,
        Credit_No, Pin_No, Delivery_City
    )
    VALUES (
        '$date', $time, $charge,
        '$fname', '$lname', $mobile,
        '$add1', '$add2', $postcode,
        '$state', '$country', $weight,
        $credit, $pin, '$city'
    )
";
$result = mysql_query($sql);
我已经对SQL进行了大写并格式化了查询,使其可读,因此您可以确保为正确的列提供了正确的值。现在不需要在编辑器或屏幕上进行水平滚动

如注释中所示,如果采用这种方法插入数据库,则需要确保所有值都正确转义,特别是当它们来自用户输入时。但是,参数化是一种更好的方法,请注意,mysql库现在已不推荐使用


附录:看看这个查询,我想说,假设$time、$mobile和$postcode都是字符串,那么需要在它们周围加上撇号。我假定$charge和$weight是数字,因此不需要引用。

我已经尝试在backticks中转义它,但仍然有相同的问题。查询失败!您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第行使用“订单日期、订单时间、交付费用、交付名称、交付名称、删除”的正确语法1@JessTan他说backtick不是一句话。这个‘不是那个’@JessTan:你可能把反勾号和单引号混淆了。请参阅.Opps..很抱歉造成混淆,最后我明白了,非常感谢,非常感谢您的帮助。在报告此类问题时,还可以呼应SQL并在您的问题中提供它以及PHP代码,以便我们可以看到错误所在。但是,很好,您提供了PHP,这表明您在查询中有几个SQL注入漏洞。转义用户输入将是一个良好的开端,但使用更好的数据库库(如PDO)进行参数化将更好。我应该更正什么?对于每次使用$u请求或任何用户输入,请逐一运行。使用此功能时,请确保已连接到数据库,因为它需要数据库连接才能完全工作。请阅读SQL注入-这是一个漏洞,允许恶意用户在您的数据库上执行未经授权的SQL,例如删除行。感谢您提供的信息,我得到了答案,谢谢。可能是重复的