这个PHP代码如何工作?

时间:2012-08-20 00:44:21

标签: php mysql mysqli

今天早上我正在观看关于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查询的结果拼凑在一起,但我得不到的是,while循环如何在参数内部进行赋值?

我试图回显$ row = $ result-&gt; fetch_object()但它没有向屏幕显示任何内容。

5 个答案:

答案 0 :(得分:7)

这是一个标准的获取循环,大多数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()(对于关联数组)实际上只是风格问题。

答案 1 :(得分:2)

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

使用var_dump()或print_r()

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

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

只是生成一个变量$ row设置为1记录的内容(从技术上讲,JOINs超过1个真正的“记录”,但我怀疑你在这里使用它),然后当你循环时你打印的值是$ row-&gt; id。

的列

答案 2 :(得分:1)

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

  

while($ row = $ result-&gt; fetch_object()){

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

答案 3 :(得分:1)

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

  

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

这样想:当你执行$ x == 5时,结果为true或false。当你执行$ 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。

答案 4 :(得分:0)

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

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

$row = $result->fetch_object()

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

while (false)

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