【问题标题】:Query Failed!You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version查询失败!您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册
【发布时间】:2013-09-03 23:00:58
【问题描述】:

我正在尝试将其放入数据库。但是,我遇到了一个意外错误,说:

查询失败!您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“order(Order_Date,Order_Time,Delivery_Charge,Delivery_Fname,Delivery_Lname,Delive”附近使用正确的语法。

这是我的 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!');

  }
  ?>

查询有什么问题?

【问题讨论】:

  • 当报告此类问题时,它还有助于echo 输出 SQL 并在您的问题(以及 PHP 代码)中提供它,以便我们可以看到错误在哪里。但是,您提供的 PHP 很好,这表明您在查询中存在多个 SQL 注入漏洞。转义用户输入将是一个好的开始,但参数化(使用更好的数据库库,如 PDO)会更好。
  • 我应该纠正什么?
  • 对于$_REQUEST(或任何用户输入)的每次使用,通过mysql_real_escape_string 运行每一个。确保在使用此功能时已连接到数据库,因为它需要数据库连接才能完全工作。还要阅读“SQL 注入” - 这是一个允许恶意用户在您的数据库上执行未经授权的 SQL(例如删除行)的漏洞。
  • 感谢您的信息,我得到了答案,谢谢。

标签: php mysql sql


【解决方案1】:

ORDER 是一个reserved keyword。因此,您需要用反引号将其转义,如下所示:

INSERT INTO `order` ...

在查询中不使用保留关键字会是更好的解决方案,但也可以使用反引号转义它们。

【讨论】:

  • 我已经尝试在反引号中转义它,但仍然有同样的问题。
  • 查询失败!您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在“订单”附近使用的正确语法(Order_Date、Order_Time、Delivery_Charge、Delivery_Fname、Delivery_Lname、Del' 在第 1 行
  • @JessTan 他说反引号不是单引号。这个`不是那个'
  • @JessTan:您可能将反引号与单引号混淆了。请参阅difference
  • Opps..抱歉给您带来了困惑,终于明白了,非常感谢,非常感谢您的帮助。
【解决方案2】:

这里有一些调试技巧。而不是这个:

$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 大写并格式化查询以使其可读,因此您可以确保为正确的列提供正确的值。现在不需要水平滚动(在您的编辑器或我们的屏幕上)。

如 cmets 中所述,如果您采用这种方法进行数据库插入,则需要确保您的所有值都正确转义,尤其是当它们来自用户输入时。但是,参数化是一种更好的方法,请注意“mysql”库现在已弃用。

附录:查看查询,我会说您需要在 $time$mobile$postcode 周围使用撇号(假设它们都是字符串)。我认为$charge$weight 是数字,因此不需要引用。

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 2014-01-27
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多