2016-09-26 40 views
1

我試圖將一個記錄複製到另一個記錄在同一個table1中。 mysqli_multi_query()成功執行,但會導致下一個代碼mysqli_query()不會被執行。爲什麼運行mysqli_multi_query()會導致未來mysqli_query()語句不執行?

代碼:

mysqli_multi_query($db,"CREATE TEMPORARY TABLE TEMP SELECT * FROM table1 WHERE id=12;UPDATE TEMP SET id=16 WHERE id_pengadu_tpgp = 12;INSERT INTO table1 SELECT * FROM TEMP WHERE id=16;UPDATE table1 SET fullname=johnny WHERE id= 16;");} mysqli_query($db,"SELECT * FROM table1 WHERE id-16"); 

希望有人可以幫助我弄清楚了這一點。

+1

'SELECT * FROM表1 WHERE ID = 16'你有一個連字符不是一個等號。我真的建議停止使用多個查詢 – nogad

回答

0

原諒我,如果你忽略你的multi_query的另一重要組成部分,但你不能簡單地擠了一堆內部mysqli_multi_query()查詢語句,繼續前進。有一整段代碼對於處理多查詢過程至關重要。閱讀這個答案,也許你可以達到你自己的解決方案:Strict Standards: mysqli_next_result() error with mysqli_multi_query

「經典」IF(){DO {} WHILE}「語法」片段可以很好地爲您服務,並允許您將最終的SELECT包含到multi_query 。

*編輯*

好吧,VARKEY,我沒有賺到我一般建議在綠色的勾,所以現在我會完全填鴨式你答案,看看是否會做到這一點。 ..

我已經採取了您的疑問,糾正了破折號的錯字和單引號包裝johnny

CREATE TABLE IF NOT EXISTS `table1` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `id_pengadu_tpgp` int(10) NOT NULL, 
    `fullname` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ; 

INSERT INTO `table1` (`id`, `id_pengadu_tpgp`, `fullname`) VALUES 
(1, 1, 'Eddie'), 
(2, 2, 'Jeff'), 
(3, 3, 'Mike'), 
(4, 4, 'Matt'), 
(5, 5, 'Dean'), 
(6, 6, 'Robert'), 
(7, 7, 'Scott'), 
(8, 8, 'Erik'), 
(9, 9, 'Chris'), 
(10, 10, 'Ben'), 
(11, 11, 'Scott'), 
(12, 12, 'Kim'); 

我看到你在一個片段決定從實現行重複: In MySQL, can I copy one row to insert into the same table? - 或 - Duplicate/Copy records in the same MySQL table - 或 -

我使用下面的表製造測試我的PHP代碼 Mysql: Copy row but with new id
你該更新的新行的全稱列和結果集的附加查詢選擇在年底mysqli_multi_query函數內都歡迎。如果你打算使用mysqli_multi_query(),那麼在同一個查詢批次中,我看不到任何干擾所有內容的問題。我冒昧地將每個查詢保存到一個數組,併爲每個查詢分配一個直觀的關鍵字,以幫助理解過程。我只是稍微修改了我的代碼片段(從「嚴格標準」鏈接)以完全顯示SELECTed行。

這是PHP代碼:

<?php 
$queries=array(
    "Create Temp Table"=>"CREATE TEMPORARY TABLE TEMP SELECT * FROM table1 WHERE id=12", 
    "Copy To Temp"=>"UPDATE TEMP SET id=16 WHERE id_pengadu_tpgp=12", 
    "Insert From Temp"=>"INSERT INTO table1 SELECT * FROM TEMP WHERE id=16", 
    "Update New Row"=>"UPDATE table1 SET fullname='johnny' WHERE id=16", 
    "Retrieve New Resultset"=>"SELECT * FROM table1 WHERE id=16" 
); 

if(mysqli_multi_query($mysqli,implode(';',$queries))){ 
    do{ 
     echo "<br><br>",key($queries),": ",current($queries); // display key:value @ pointer 
     if($result=mysqli_store_result($mysqli)){ // if a result set 
      while($rows=mysqli_fetch_assoc($result)){ 
       echo "<br>id = {$rows["id"]}"; 
       echo "<br>id_pengadu_tpgp = {$rows["id_pengadu_tpgp"]}"; 
       echo "<br>fullname = {$rows["fullname"]}"; 
      } 
      mysqli_free_result($result); 
     } 
     echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs 
    } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); 
} 
if($mysqli_error=mysqli_error($mysqli)){ 
    echo "<br><br>",key($queries),": ",current($queries),"<br>Syntax Error: $mysqli_error"; // display array pointer key:value 
} 
?> 

輸出:

Create Temp Table: CREATE TEMPORARY TABLE TEMP SELECT * FROM table1 WHERE id=12 
Rows = 1 

Copy To Temp: UPDATE TEMP SET id=16 WHERE id_pengadu_tpgp=12 
Rows = 1 

Insert From Temp: INSERT INTO table1 SELECT * FROM TEMP WHERE id=16 
Rows = 1 

Update New Row: UPDATE table1 SET fullname='johnny' WHERE id=16 
Rows = 1 

Retrieve New Resultset: SELECT * FROM table1 WHERE id=16 
id = 16 
id_pengadu_tpgp = 12 
fullname = johnny 
Rows = 1 

這應該是足夠的支持,您可以調整您的實際需要,並幫助你找到任何錯誤。當一切工作正常時,剝掉任何回聲或其他不必要的代碼,以使其生產就緒。 *請記住,如果有任何查詢的任何錯誤,查詢的鏈條將被暫停,我的片斷將提供錯誤信息。

相關問題