2014-09-12 113 views
0

SQL語句行爲不同於SQL語句在phpMyAdmin

$form_store_sql = "                              
    INSERT INTO myodyssey_myaccount (`id`, `email`, `username`, `password`) VALUES (NULL, 'email', 'unixmiah.formtest', 'woohoo');   

    SET @last_id_in_myaccount = LAST_INSERT_ID();                      

    INSERT INTO myodyssey_personal_info (`id`, `myodyssey_myaccount_id`) VALUES (NULL, @last_id_in_myaccount);        

    SET @last_id_in_personal_info = LAST_INSERT_ID();                     

    INSERT INTO myodyssey_travel_info (`id`, `myodyssey_personal_info_id`)                 
     VALUES (NULL, @last_id_in_personal_info);                          

    SET @last_id_in_travel_info = LAST_INSERT_ID();                      

    INSERT INTO myodyssey_tour_orders (`id`, `myodyssey_travel_info_id`) VALUES (NULL, @last_id_in_travel_info);"; 

    if(mysql_query($form_store_sql)){ 
     echo "done"; 
    } 

它不工作;它不存儲數據。但是,如果我將SQL語句從form_store_variable中取出並粘貼到phpmyadmin的sql對話框中,它的行爲會有所不同,它會存儲數據。我想知道我在做什麼錯誤的存儲SQL語句在form_store_variable。

+0

這是建立形式網址: – unixmiah 2014-09-12 20:21:24

+0

[ Déjàvue question today。](http://stackoverflow.com/q/25814295/)應該標記爲重複。 – 2014-09-12 20:21:42

+0

'mysql_query'一次只能運行一個查詢。 – 2014-09-12 20:23:11

回答

4

mysql_*()功能做不是允許在一個單一的query調用這樣的多個語句。這是針對某些形式的SQL注入攻擊的基本防禦措施。

如果你使用任何類型的錯誤處理您的查詢電話,你會被告知語法錯誤的:

$result = mysql_query($form_store_sql); 
if ($result === false) { 
    die(mysql_error()); 
} 

你將不得不query()每個那些個別報表的分別。

+0

+1快速和完美的答案:) – 2014-09-12 20:21:30

+0

謝謝。我會盡量避免代碼焚燒。 – unixmiah 2014-09-12 21:01:50

3

mysql_query()在單次調用中不允許多個查詢。您需要將$form_store_sql拆分爲每個查詢的單獨字符串,並分別爲其中的每個查詢調用mysql_query()

$sql = "INSERT INTO myodyssey_myaccount (`id`, `email`, `username`, `password`) 
     VALUES (NULL, 'email', 'unixmiah.formtest', 'woohoo');"; 
mysql_query($sql); 
$sql = "SET @last_id_in_myaccount = LAST_INSERT_ID();"; 
mysql_query($sql); 
... 

您還可以避免在一個單獨的呼叫只是一個變量設置爲LAST_INSERT_ID(),只要使用該功能在未來的插入:

$sql = "INSERT INTO myodyssey_personal_info (`id`, `myodyssey_myaccount_id`) 
     VALUES (NULL, LAST_INSERT_ID());" 
mysql_query($sql); 
+0

謝謝。我不知道。我認爲你在php語句中的sql語句中的任何查詢都會在單個mysql_query函數中得到處理。我花了數小時的時間找出問題所在。 – unixmiah 2014-09-12 20:39:32

+0

現在有意義。謝謝。我的印象是,它會處理你實際上在PHP方面有什麼;如果它被分解或沒有關係無關緊要。考慮到它的安全漏洞是有道理的。 – unixmiah 2014-09-12 20:43:01