while ($row = $result->fetch_object()) 如何工作?



今天早上我在看一个关于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(),但它没有在屏幕上显示任何内容。

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

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

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

要调试查询,请不要使用echo。

使用var_dump()或print_r()

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

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

简单地生成一个变量$row,该变量设置为1条记录的内容(从技术上讲,JOIN的实际"记录"不止一条,但我怀疑你在这里是否使用了它),然后当你循环通过时,你打印的是带有$row->id的列的值。

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

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

  • $row = $result->fetch_object()实际上是一个变量赋值。我怀疑$result变量是一个mysql资源,它是[mysql_query][1]的结果
  • 有一个循环,由while表示
  • 在内部,fetch_object将遍历mysql返回的行,直到没有行为止,此时fetch_object将返回false,从而结束循环
  • echo调用$row = $result->fetch_object()时没有得到结果的原因是,由于这是一个变量赋值,因此没有输出。要调试,您应该尝试var_dump($result);

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

赋值运算符将值存储在由左操作数。赋值表达式的值为赋值后的操作数,但不是左值。

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

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

显示"5"one_answers"105"。

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

执行$row = $result->fetch_object()时没有显示任何内容的原因可能是因为已经检索到所有行,并且fetch_object()返回false。

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

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

$row = $result->fetch_object()

将$row设置为一个错误值,然后while循环将其评估为

while (false)

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

最新更新