如何從準備好的語句中獲取資料
準備好的陳述
請參閱 MySQLi 中的 Prepared 語句, 瞭解如何準備和執行查詢。
結果的約束力
物件導向的風格
$stmt->bind_result($forename);
程式風格
mysqli_stmt_bind_result($stmt, $forename);
使用 bind_result
的問題是它需要語句來指定將使用的列。這意味著對於上面的工作,查詢必須看起來像這個 SELECT forename FROM users
。要包含更多列,只需將它們作為引數新增到 bind_result
函式中(並確保將它們新增到 SQL 查詢中)。
在這兩種情況下,我們都將 forename
列分配給 $forename
變數。這些函式使用與要分配的列一樣多的引數。賦值只進行一次,因為函式通過引用繫結。
然後我們可以迴圈如下:
物件導向的風格
while ($stmt->fetch())
echo "$forename<br />";
程式風格
while (mysqli_stmt_fetch($stmt))
echo "$forename<br />";
這樣做的缺點是你必須一次分配很多變數。這使得難以跟蹤大型查詢。如果你安裝了 MySQL Native Driver(mysqlnd
) ,你需要做的就是使用 get_result 。
物件導向的風格
$result = $stmt->get_result();
程式風格
$result = mysqli_stmt_get_result($stmt);
這更容易使用,因為現在我們得到一個 mysqli_result 物件。這與 mysqli_query 返回的物件相同。這意味著你可以使用常規結果迴圈來獲取資料。
如果我不能安裝 mysqlnd
怎麼辦?
如果是這樣的話那麼 @Sophivorus 會讓你滿意這個驚人的答案 。
此功能可以執行 get_result
的任務,而無需在伺服器上安裝。它只是遍歷結果並構建一個關聯陣列
function get_result(\mysqli_stmt $statement)
{
$result = array();
$statement->store_result();
for ($i = 0; $i < $statement->num_rows; $i++)
{
$metadata = $statement->result_metadata();
$params = array();
while ($field = $metadata->fetch_field())
{
$params[] = &$result[$i][$field->name];
}
call_user_func_array(array($statement, 'bind_result'), $params);
$statement->fetch();
}
return $result;
}
然後我們可以使用該函式來獲得這樣的結果,就像我們使用 mysqli_fetch_assoc()
一樣
<?php
$query = $mysqli->prepare("SELECT * FROM users WHERE forename LIKE ?");
$condition = "J%";
$query->bind_param("s", $condition);
$query->execute();
$result = get_result($query);
while ($row = array_shift($result)) {
echo $row["id"] . ' - ' . $row["forename"] . ' ' . $row["surname"] . '<br>';
}
它將具有與使用 mysqlnd
驅動程式相同的輸出,但不必安裝。如果你無法在系統上安裝所述驅動程式,這非常有用。只需實施此解決方案。