我想问为什么我应该使用(在 foreach -> 中使用)mysqli_fetch_array($result, MYSQLI_ASSOC)
如果foreach ($result as $row)
给出相同的结果?如果我只能使用基本的 foreach 循环,我很难理解 mysqli_fetch 的好处。
1 回答
有许多不同之处。如果您需要的只是循环中的关联数组,那么请使用 clean foreach($result as $row)
。在大多数情况下,无论如何您都不应该mysqli_result
直接在应用程序逻辑中处理。您应该使用某种数据库抽象层。
foreach
方法
这是循环结果集的最简单和最简单的方法。结果集将始终从头到尾迭代,并且可以重复多次,无需手动倒带。
$result = $stmt->get_result();
foreach($result as $row) {
echo $row['field'];
}
缺点很明显:你总是得到一个关联数组。如果你想要数字索引或者你想要一个对象而不是一个数组,那么你需要手动获取行。
mysqli_result::fetch_array
此函数以关联数组、数值数组或两者的形式返回单行。每次调用此函数时都会增加一个内部指针,因此每次调用它时,您都会从结果集中获得下一行。当然,您可以随时将其倒回到任何随机行,前提是结果是在客户端缓冲的。
// traverses the result set in a reverse order
$result = $stmt->get_result();
for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
$result->data_seek($row_no);
$row = $result->fetch_array();
echo " id = " . $row['id'] . "\n";
}
mysqli_result::fetch_assoc
和mysqli_result::fetch_row
这些只是mysqli_result::fetch_array
. 它们以完全相同的方式工作,但只为您提供一种类型的数组,分别是关联的或数字的。
mysqli_result::fetch_object
此方法的工作方式与前三个类似,但它返回的不是数组,而是一个对象。如果您需要将结果作为特定类的实例来获取,这很有用。类的名称可以作为该函数的参数提供。
class Movie {
private $title;
private $director;
public function getTitle() {
return $this->title.' by '.$this->director;
}
}
$stmt = $mysqli->prepare('SELECT title, director FROM movie');
$stmt->execute();
$result = $stmt->get_result();
while ($obj = $result->fetch_object(Movie::class)) {
printf("%s\n", $obj->getTitle());
}
mysqli_result::fetch_all
这可能是最常见的选择。当您不需要以任何特定方式操作结果集并且只想将所有结果作为数组获取时,可以使用它。它的工作方式类似于mysqli_result::fetch_array
但不是一次返回每一行,而是返回一个数组数组。注意,默认获取模式是数值数组。
$result = $stmt->get_result();
$data = $result->fetch_all(MYSQLI_ASSOC);