3 回答

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

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
簡(jiǎn)單地說(shuō),在調(diào)用mysqli_free_result之后,你必須調(diào)用mysqli_next_result($ db)。
mysqli_free_result($結(jié)果); mysqli_next_result($ db) mysqli_close($ db);

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
只需調(diào)用此函數(shù):
$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); } } }
添加回答
舉報(bào)