如何從準備好的語句中獲取資料

準備好的陳述

請參閱 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 驅動程式相同的輸出,但不必安裝。如果你無法在系統上安裝所述驅動程式,這非常有用。只需實施此解決方案。