今天早上我在看一个关于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循环并且不尝试获取非对象值的成员。