3 回答

TA貢獻1820條經驗 獲得超9個贊
MySQL客戶端不允許您執(zhí)行新查詢,其中仍有從正在進行的查詢中提取的行。有關常見錯誤,請參閱MySQL文檔中的命令不同步。
您可以使用mysqli_store_result()
從外部查詢中預取所有行。這將在MySQL客戶端中緩沖它們,因此從服務器的角度來看,您的應用程序已獲取完整的結果集。然后,即使在從now-buffered外部結果集中獲取行的循環(huán)中,您也可以執(zhí)行更多查詢。
或者您mysqli_result::fetch_all()
將完整的結果集作為PHP數組返回,然后您可以循環(huán)該數組。
調用存儲過程是一種特殊情況,因為存儲過程有可能返回多個結果集,每個結果集可能有自己的一組行。這就是為什么@ a1ex07的回答提到使用mysqli_multi_query()
和循環(huán)直到mysqli_next_result()
沒有更多的結果集。這是滿足MySQL協(xié)議所必需的,即使在您的情況下您的存儲過程只有一個結果集。
PS:順便說一句,我看到你正在進行嵌套查詢,因為你有代表層次結構的數據。您可能需要考慮以不同方式存儲數據,以便您可以更輕松地查詢它。我做了一個關于這個標題為SQL和PHP的分層數據模型的演示文稿。我還在我的SQL反模式:避免數據庫編程陷阱的一章中討論了這個主題。
以下是如何mysqli_next_result()
在CodeIgnitor 3.0.3中實現(xiàn):
在system/database/drivers/mysqli/mysqli_driver.php
變化的第262行
protected function _execute($sql){ return $this->conn_id->query($this->_prep_query($sql));}
對此
protected function _execute($sql){ $results = $this->conn_id->query($this->_prep_query($sql)); @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error return $results;}
這是自2.x以來的一個問題。我剛剛更新到3.x并且不得不將這個hack復制到新版本。

TA貢獻2012條經驗 獲得超12個贊
簡單地說,在調用mysqli_free_result之后,你必須調用mysqli_next_result($ db)。
mysqli_free_result($結果); mysqli_next_result($ db) mysqli_close($ db);

TA貢獻1828條經驗 獲得超3個贊
只需調用此函數:
$this->free_result();function free_result() { while (mysqli_more_results($this->conn) && mysqli_next_result($this->conn)) { $dummyResult = mysqli_use_result($this->conn); if ($dummyResult instanceof mysqli_result) { mysqli_free_result($this->conn); } } }
添加回答
舉報