今天早上我正在观看关于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()但它没有向屏幕显示任何内容。
答案 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]
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循环,而不是尝试获取非对象值的成员。