2011-04-06 119 views
1

我在想什麼可能是不可能的,我不確定。這是我的情況:使用自動遞增鍵插入多個表格

我整理了一個課程項目,讓老師爲學生創建測驗。在PHP中,測試問題/答案被輸入到數據庫中,我使用mysqli準備好的語句。由於我使用的問題/答案IDS將其鏈接我把它就像這樣:

$q_stmt = $db -> prepare('query with no correct_answer_id') 
$a_stmt = $db -> prepare('query with ? = $q_stmt -> insert_id') 
$a_stmt -> bind_params($q_id) 
$q_update = $db -> prepare('query with ? = $a_stmt -> insert_id for correct answer') 
$q_update -> bind_params($correct_answer_id) 

,然後腳本循環,如:

foreach ($question) 
    $q_stmt -> execute() 
    $q_id = $db -> insert_id 
    foreach ($answers) 
    $a_stmt -> execute() 
    id (correct_answer) $correct_answer_id = $db -> insert_id 
$q_update -> execute() 

現在,這工作我的筆記本電腦( Mac OS X.6與最新(截至1月)PHP和MySQL),但是當我上傳我的項目的另一部分,也使用嵌套預準備語句到我的網絡服務器時,我收到一條錯誤消息,說它不喜歡我的嵌套。它說:

警告:mysqli的準備::()[mysqli.prepare]:所有的數據必須在新的語句之前準備中獲取發生在根/路徑/文件名上線124 .PHP

因此,我認爲嵌套準備語句必須是一件壞事?這是非常不幸的,因爲我真的很喜歡我把它們放在一起。

作爲替代,我遍歷所有收集ID,然後再做循環上的問題和答案也收集ID,然後循環又一個更多的時間來更新的問題,但似乎想了很多問題爲服務器額外的工作,我喜歡嘗試高效。

這就是說,我正在尋找兩件事之一。
1 - 通過奇蹟有一種方法來運行我的查詢在一步
a - 我會喜歡一個解決方案,允許問題/正確答案對插入一次,然後循環以後的可變數量不正確的答案也是相關的問題
2 - 一種方法來改變我的Web服務器(我已經完全進入cpannel),使得它不再恨我的嵌套預處理語句提前

回答

1

核心

謝謝問題在於其中一個準備好的語句爲您設置了一個結果集,但您在嘗試下一個語句之前沒有檢索它。 一些版本的MySQL庫有這方面的問題,而其他的則沒有。

看看mysqli_stmt::store_result。調用execute後,您可以立即調用它以將結果集傳送出MySQL。即使你不會立即使用結果集(或者根本不使用結果集),這個動作應該讓你繼續執行你的其他準備好的語句。

(PDO中的土地,這可以通過toggling buffered queries控制。)

+0

你可能是正確的。當我正在處理另一個數據庫函數時,我注意到我忘記調用$ stmt - > close()來執行一個已經在頁面上執行過的語句,這個語句可能是罪魁禍首。 – baiano 2011-04-06 08:02:05

+0

我會考慮[mysqli_stmt :: free_result](http://www.php.net/manual/en/mysqli-stmt.free-result。php)作爲一種替代方案,如果你已經完成了數據,因爲它將會在資源上更輕。 – Joshua 2012-03-30 22:24:33

相關問題