簡體   English   中英

獲取具有 mysqli 結果的行數組

[英]get array of rows with mysqli result

我需要從結果 object 中獲取所有行。 我正在嘗試構建一個包含所有行的新數組。

這是我的代碼:

$sql = new mysqli($config['host'],$config['user'],$config['pass'],$config['db_name']);
if (mysqli_connect_errno())
{
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$query = "SELECT domain FROM services";
$result = $sql->query($query);           
while($row = $result->fetch_row());
{
    $rows[]=$row;
}
$result->close();
$sql->close();
return $rows;

$rows應該是包含所有行的新數組,但我得到一個空數組。

任何想法為什么會發生這種情況?

您有一個輕微的語法問題,即錯誤的分號。

while($row = $result->fetch_row());

注意到最后的分號了嗎? 這意味着后面的塊沒有在循環中執行。 擺脫它,它應該可以工作。

此外,您可能希望 mysqli 報告它遇到的所有問題:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$sql = new mysqli($config['host'], $config['user'], $config['pass'], $config['db_name']);

$query = "SELECT domain FROM services";
$result = $sql->query($query);
$rows = [];
while($row = $result->fetch_row()) {
    $rows[] = $row;
}
return $rows;

最新版本的 mysqli 有一些改進,可以簡化這樣的任務。

首先,有一個有用的函數可以返回一個包含查詢返回的所有行的數組,mysqli_fetch_all()
這意味着如果您需要一個簡單的枚舉數組,代碼會簡單得多:

$query = "SELECT domain FROM services";
$result = $sql->query($query);     
return $result->fetch_all(MYSQLI_ASSOC);

甚至都在一條線上,

return $sql->query("SELECT domain FROM services")->fetch_all(MYSQLI_ASSOC);

但是,如果您需要使用某些列來索引結果數組,您仍然需要這樣的 while 循環:

$query = "SELECT id, domain FROM services";
$result = $sql->query($query);
$data = [];
while ($row = $result->fetch_assoc()) {
  $data[$row['id']] = $row;
}

請注意,您應該始終在填充數組之前對其進行初始化,因為這樣的變量可能已經存在。

此外, mysqli_result類現在是可遍歷的。 這意味着您可以立即在 foreach 循環中使用它,就好像它是一個包含數據庫中所有行的數組一樣:

$query = "SELECT domain FROM services";
$result = $sql->query($query);
foreach ($result as $row) {
    echo $row['domain'];
}

但它實際上只是 while 循環的語法糖——你不能直接訪問這個“數組”的值,這使得這個特性實際上有點用處。

強制性說明。

這個問題已有十年之久,在問題和接受的答案中建立聯系和執行查詢的方式如今已過時且不受歡迎。

建立連接時,需要記住幾件事。 我寫了一篇關於如何正確連接mysqli的文章,提供了一個正確的連接示例,強調以下問題:

  • 必須設置正確的錯誤報告模式
  • 必須設置正確的字符
  • 不應使用手動錯誤報告代碼(如die(mysqli_connect_error())
  • 連接只需在單獨的文件中建立一次,然后只需包含在需要數據庫交互的每個腳本中即可。 如果在函數中使用數據庫代碼,則必須將連接變量作為函數參數傳入。

在運行查詢時,還需要記住幾件事:

  • 即使在查詢中使用單個變量時,也必須使用准備好的語句而不是mysqli_query()
  • 因此,應該使用一個名為mysqli_stmt_get_result()的特殊函數,以便使用熟悉的 fetch 函數來獲取結果行。 如果此功能不可用,您可能需要在 cpanel 中勾選某個復選框(查找標記為mysqlnd的復選框)。
  • 給定一個帶有 mysqli 的預處理語句,雖然是強制性的,但需要編寫大量代碼,建議使用mysqli 的輔助函數,它會自動執行大部分工作,並使 mysqli 預處理語句像常規查詢一樣平滑。
  • 不應使用手動錯誤報告代碼(如die(mysqli_error()) )。 由於正確的錯誤模式,mysqli 將自動報告所有錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM