2024 年日本 PHP 研討會

mysqli::store_result

mysqli_store_result

(PHP 5, PHP 7, PHP 8)

mysqli::store_result -- mysqli_store_result傳輸上次查詢的結果集

說明

物件導向風格

public mysqli::store_result(int $mode = 0): mysqli_result|false

程序式風格

mysqli_store_result(mysqli $mysql, int $mode = 0): mysqli_result|false

將由 `$mysql` 參數所代表的資料庫連線上的最後一次查詢的結果集傳輸,以便與 mysqli_data_seek() 函式一起使用。

參數

mysql

僅限程序式風格:由 mysqli_connect()mysqli_init() 返回的 mysqli 物件。

mode

您想要設定的選項。從 PHP 8.1 開始,此參數無效。它可以是以下值之一:

有效選項
名稱 說明
MYSQLI_STORE_RESULT_COPY_DATA 將結果從內部 mysqlnd 緩衝區複製到提取的 PHP 變數中。預設情況下,mysqlnd 將使用引用邏輯來避免複製和重複保存在記憶體中的結果。對於某些結果集,例如具有許多小行的結果集,複製方法可以減少整體記憶體使用量,因為保存結果的 PHP 變數可能會更早釋放(僅適用於 mysqlnd)。

返回值

返回一個已緩衝的結果物件,如果發生錯誤則返回 false

注意事項:

如果查詢沒有返回結果集(例如,如果查詢是 INSERT 陳述式),mysqli_store_result() 將返回 false。如果讀取結果集失敗,此函式也會返回 false。您可以通過檢查 mysqli_error() 是否沒有返回空字串、mysqli_errno() 是否返回非零值,或 mysqli_field_count() 是否返回非零值來檢查是否發生錯誤。在成功呼叫 mysqli_query() 後,此函式返回 false 的另一個可能原因是結果集過大(無法為其分配記憶體)。如果 mysqli_field_count() 返回非零值,則該陳述式應該產生一個非空的結果集。

錯誤/例外

如果啟用了 mysqli 錯誤報告(MYSQLI_REPORT_ERROR)且請求的操作失敗,則會產生警告。此外,如果模式設定為 MYSQLI_REPORT_STRICT,則會改為拋出 mysqli_sql_exception

更新日誌

版本 說明
8.4.0 傳遞 `$mode` 參數現在已被棄用。從 PHP 8.1.0 開始,此參數無效。

範例

請參閱 mysqli_multi_query()

備註

注意事項:

雖然使用 mysqli_free_result() 函式釋放查詢結果所使用的記憶體始終是一種良好的做法,但在使用 mysqli_store_result() 傳輸大型結果集時,這一點尤其重要。

另請參閱

新增註釋

使用者貢獻的註釋 4 則註釋

mitchind
14 年前
在閱讀了原始註釋和上面的範例,以及費力地查閱了文件之後,我終於讓一個迴圈可以與兩個儲存程序一起運作。

使用第一個儲存程序的結果作為第二個儲存程序的參數。用這種方式比使用一個巨大的修改過的內部聯結查詢序列更容易。

希望這對其他人有所幫助...

<?php
// 連線到伺服器和資料庫
$mysqli = new mysqli("$dbServer", "$dbUser", "$dbPass", "$dbName");

// 使用 MYSQLI_STORE_RESULT 開啟第一個預存程序以保留結果供迴圈使用
$resultPicks = $mysqli->query("CALL $proc ($searchDate, $maxRSI, $incRSI, $minMACD, $minVol, $minTrades, $minClose, $maxClose)", MYSQLI_STORE_RESULT);

// 從第一個預存程序逐行處理
while($picksRow = $resultPicks->fetch_array(MYSQLI_ASSOC)) {
// 取得下一個預存程序的參數
$symbol = $picksRow['Symbol'];

// 清除已儲存的結果
clearStoredResults($mysqli);

// 使用第一個預存程序的值作為參數執行第二個預存程序 (使用 MYSQLI_USE_RESULT 並立即釋放結果)
$resultData = $mysqli->query("CALL prcGetLastMACDDatesBelowZero('$symbol', $searchDate)", MYSQLI_USE_RESULT);
$dataRow = $resultData->fetch_array(MYSQLI_ASSOC);

// 顯示兩個相關查詢的結果
echo "<p>$symbol ... 日期數量: " . $dataRow['NumDates'];

// 釋放第二個預存程序的結果
$resultData->free();

}

// 釋放第一個預存程序的結果
$resultPicks->free();

// 關閉連線
$mysqli->close();

#------------------------------------------
function clearStoredResults($mysqli_link){
#------------------------------------------
while($mysqli_link->next_result()){
if(
$l_result = $mysqli_link->store_result()){
$l_result->free();
}
}
}
?>
filippo at ecoms dot it
6 年前
錯誤處理程式碼

if ($mysqli->multi_query($query)) {
$result = $mysqli->store_result();
if ($mysqli->errno == 0) {

/* 第一個結果集或 FALSE(如果查詢沒有返回結果集)儲存在 $result 中 */

while ($mysqli->more_results()) {
if ($mysqli->next_result()) {
$result = $mysqli->store_result();
if ($mysqli->errno == 0) {
/* 結果集或 FALSE(見上文)儲存在 $result 中 */
}
} else {
/* 讀取結果集錯誤 */
break;
}
}
} else {
} /* 查詢中的錯誤 */
}
}
}
} else {
} /* 讀取第一個結果集錯誤 */
}
}
} else {
} /* 第一個查詢中的錯誤 */
}
Warner
15 年前
另外,在 multi_query() 中執行 SET 陳述式似乎也會返回一個額外的結果集,這是我們不預期的。
lau at goldenweb dot com dot au
17 年前
使用預存程序時要小心
如果您連接到資料庫,然後呼叫資料庫程序 A,接著呼叫資料庫程序 B,然後關閉與資料庫的連接,則第二次程序呼叫將無法正常工作。

看起來 MYSQL 或 mysqli 中存在一個錯誤,它返回的結果集比您預期的多一個。然後,它不允許您呼叫另一個預存程序,直到您完成處理第一個預存程序呼叫的所有結果集。

解決方案是在呼叫資料庫程序之間簡單地循環遍歷額外的結果集。以下是我在呼叫資料庫程序之間呼叫的函式

<?php
#--------------------------------
function ClearRecordsets($p_Result){
#--------------------------------
$p_Result->free();
while(
$this->Mysqli->next_result()){
if(
$l_result = $this->Mysqli->store_result()){
$l_result->free();
}
}
}

?>
To Top