2

今天早上我在看一个关于 PHP MySQLi 的教程系列,我发现了一些该系列的作者没有解释的代码。我以前看过这段代码,但从来不知道它是如何工作的......

while ($row = $result->fetch_object()) {
    // set up a row for each record
    echo "<tr>";
    echo "<td>" . $row->id . "</td>";
    echo "<td>" . $row->firstname . "</td>";
    echo "<td>" . $row->lastname . "</td>";
    echo "<td><a href='records.php?id=" . $row->id . "'>Edit</a></td>";
    echo "<td><a href='delete.php?id=" . $row->id . "'>Delete</a></td>";
    echo "</tr>";
}

我知道它将一个表与 MySQL 查询的 $result 的结果拼凑在一起,但我没有得到的是,while 循环如何在参数内部进行赋值?

我试图回显 $row = $result->fetch_object() 但它没有在屏幕上显示任何内容。

4

5 回答 5

7

这是一个标准的 fetch 循环,大多数 PHP 数据库 API 使用它从结果资源中检索行。 mysqli_result::fetch_object()将下一行检索到泛型类型的对象中stdClass,其属性具有查询返回的列的名称。您可以查看其内容var_dump($row);

当结果资源用完行时,它将返回FALSE,导致while循环终止。这种模式在 PHP 中很常见——一些数据库 API 将提供一种额外的方法来抽象 fetch 循环,只需从单个函数调用返回一个结果数组,但这在大型数据集上可能会导致内存效率低下。有时最好在要使用它们时从数据库中一次检索一行。当您调用fetch_object()或调用它的亲戚时,您实际上是在与 MySQL 通信并请求它为 PHP 提供另一行。简单地调用query()实际上并不会将任何行发送回 PHP。

在这种情况下,是否使用fetch_object()fetch_assoc()(对于关联数组)实际上只是样式问题。

于 2012-08-20T00:46:27.183 回答
2

调试查询不要使用 echo。

使用 var_dump() 或 print_r()

您所做的所有查询都是循环并创建用 sql 表中的数据填充的表行。

while ($row = $result->fetch_object()) {

只是生成一个变量 $row 设置为 1 条记录的内容(从技术上讲,使用 JOIN 时,它有超过 1 条真正的“记录”,但我怀疑你在这里使用它),然后当你循环遍历时,你正在打印列的值$行->标识。

于 2012-08-20T00:48:16.630 回答
1

让我们解开线路中发生的事情;

而 ($row = $result->fetch_object()) {

  • $row = $result->fetch_object()实际上是一个变量赋值。我怀疑这个$result变量是一个mysql资源,它是[mysql_query][1]
  • 有一个循环,由while.
  • 在内部,fetch_object将遍历 mysql 返回的行,直到没有更多行,此时,fetch_object将 return false,从而结束循环。
  • echo'ed时没有结果的原因$row = $result->fetch_object()是,因为它是一个变量赋值,所以没有输出。要调试,您应该尝试var_dump($result);
于 2012-08-20T00:52:19.757 回答
1

PHP 遵循 C 的语法,赋值运算符的结果是左操作数的值。来自 C 标准:

赋值运算符将值存储在左操作数指定的对象中。赋值表达式在赋值后具有左操作数的值,但不是左值。

可以这样想:当你执行 $x == 5 时,结果要么为真,要么为假。当您执行 $x + 5 时,结果是 $x 增加了 5。赋值运算符以类似的方式工作。当您执行 $x = 5 时,结果为 5($x 的新值)。您可以通过以下方式进行检查:

$x = 0;
echo $x = 5;
echo "\n";
echo $x += 100; 

这将显示“5”和“105”。

这种语法有点令人困惑,因为我们通常只关心 = 运算符的副作用(将某些内容存储到变量中)而不是其结果(之后的变量值)。不过,这种while($var = f()) { }结构相当普遍,因为有时我们需要同时进行赋值并检查结果。构造循环的另一种方法是使用无限循环:for (;;) { $row = $result->fetch_object(); if(!$row) break; ... }但这看起来很难看。

当您这样做时没有显示任何内容的原因$row = $result->fetch_object()可能是因为所有行都已被检索并且 fetch_object() 返回 false。

于 2012-08-20T01:18:07.600 回答
0

为了扩展 while 循环的工作原理, fetch_object() 成员函数为结果集中的下一行返回一个对象,如果没有更多行,则返回一个假值。

当没有更多对象时,while 循环将终止,因为

$row = $result->fetch_object()

将 $row 设置为一个虚假值,然后由 while 循环评估为

while (false)

这将结束 while 循环,而不是尝试获取非对象值的成员。

于 2012-08-20T00:50:50.280 回答