2013-08-31 2 views
0

Я пытаюсь поместить это в базу данных. И я получаю неожиданную ошибку, однако, говоря:Ошибка запроса! У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL

Ошибка запроса! У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса использовать вблизи 'порядка (order_date, Order_Time, Delivery_Charge, Delivery_Fname, Delivery_Lname, Delive' в строке 1.

Вот мой 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!'); 

    } 
    ?> 
?.

Что случилось с запросом

+0

Когда вы сообщаете о проблеме такого рода, она помогает также «отгонять» SQL и поставлять ее в ваш вопрос (а также код PHP), чтобы мы могли видеть, где ошибка. Тем не менее, хорошо, что вы предоставили PHP, который показывает, что у вас есть несколько уязвимостей SQL-инъекций в запросе. Успевание ваших пользовательских входов было бы хорошим началом, но параметризация (с лучшей библиотекой базы данных, такой как PDO) была бы еще лучше. – halfer

+0

И что я должен исправить? –

+1

Для каждого использования '$ _REQUEST' (или любого пользовательского ввода) запустите каждый из них через [' mysql_real_escape_string'] (http://www.php.net/manual/en/function.mysql-real-escape-string. PHP).Убедитесь, что вы подключены к базе данных при использовании этой функции, так как для ее полной работы требуется подключение к базе данных. Также прочитайте «SQL-инъекция» - это уязвимость, которая позволяет злоумышленникам выполнять несанкционированный SQL в вашей базе данных (например, удалять строки). – halfer

ответ

5

ORDER является reserved keyword Итак, вам нужно, чтобы избежать его в обратные кавычки, например:

INSERT INTO `order` ... 

Не использование зарезервированных ключевых слов в вашем запросе было бы лучшим решением, но также ускользнуть от них с backticks.

+0

Я пытаюсь сбежать от него в backticks уже, но все равно имею такую ​​же проблему. –

+0

Какое сообщение об ошибке вы получаете? –

+0

Ошибка запроса! У вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «порядком» (Order_Date, Order_Time, Delivery_Charge, Delivery_Fname, Delivery_Lname, Del »в строке 1 –

0

Вот несколько советов по отладке. Вместо этого:

$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 являются числовыми и поэтому поэтому не нуждаются в цитировании.