2011-07-26 96 views
1
$tran = "START TRANSACTION;"; 

    $tran_res = mysql_query($tran); 

    $qry_1 = "INSERT INTO docList (doc_ip , doc_country , doc_ref) VALUES ('$ip' , '$country' , '$http_ref');"; 
    $res_1 = mysql_query($qry_1); 
    if(!$res_1) 
     die ("qry1 fail " . mysql_error()); 

    $ins_id = mysql_insert_id(); 
    if(!$ins_id) 
     die ("ins id fail " . mysql_error()); 
    echo "<b>$ins_id</b>"; 

    $qry_2 = "INSERT INTO docContent (doc_id , cont_date , cont_title , cont_aim , cont_obj , cont_theory , cont_sw , cont_code) VALUES ('$ins_id' , '$dt' , '$title' , '$aim' , '$obj' , '$th' , '$sw' , '$code');"; 

    $res_2 = mysql_query($qry_2); 
    if(!$res_2) 
     die("qry2 fail " . mysql_error()); ` 

的上方將返回下面的錯誤執行:PHP - MySQL的交易執行錯誤

2 qry failYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'login'); if($query->num_rows()>0) return $query->result_array(); } ' at line 1

在效果$qry_2執行失敗,但我感到這是錯誤困惑顯示(錯誤提示中提到的第1行沒有這樣的代碼)。此外,查詢($qry_2)在MySql控制檯中正確執行。

+1

貌似你不消毒的變量。 – JJJ

+0

@Juhana你是對的!它現在工作。 – AFV

回答

1

你還沒有發佈MySQL服務器收到的真實查詢,但我敢說你還沒有使用mysql_real_escape_string()將你的數據注入到你的SQL中。

(你們是不是在數據庫中插入PHP代碼?)

+0

是的查詢中的代碼可以來自任何語言,當然它已經通過使用mysql_escape_ * – AFV

+0

'消毒'後得到治癒。謝謝!爲了說明。 – AFV

2

輸出$qry_2的內容來查看要執行的實際SQL語句。很可能你有SQL注入漏洞,並且你插入的變量之一至少包含',導致語法錯誤。

例如如果你有

$var = "O'Reilly"; 
$sql = "INSERT INTO names (name) VALUES ('$var')"; 

你會擁有

INSERT INTO names (name) VALUES ('O'Reilly'); 

將被解釋爲:

'O' - string containing the letter "O" 
Reilly - a field named "Reilly", with no operator between this "field" and the "O" previous 
'); - a weird unterminated string, also with no operator between this and the previous field. 

要解決這個問題,你MUST通過mysql_real_escape_string()通過你的變量,這將防止發生這種錯誤。它會將O'Reilly變成O\'Reilly,這在您的查詢中是「安全」的。