[英]I get 0 result and warning mysqli_num_rows() expects parameter 1 to be mysqli_result, array
[英]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
的復選框)。die(mysqli_error())
)。 由於正確的錯誤模式,mysqli 將自動報告所有錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.