你有一个关闭)
太多:
while ($r=$sth->fetch(PDO::FETCH_ASSOC))||($a=$sth_temp->fetch(PDO::FETCH_ASSOC)) {
//here
它应该是:
while ($r=$sth->fetch(PDO::FETCH_ASSOC)||($a=$sth_temp->fetch(PDO::FETCH_ASSOC)) {
即便如此,这段代码也不是我所说的好代码。您正在从两个语句中的任何一个中获取数据,而不是同时从两个语句中获取数据……事实上,由于 PHP 使您的条件短路,因此永远不会同时从两个语句中获取数据。while
让我们替换while
为 if:
if ($r = $sth->fetch(PDO::FETCH_ASSOC) || $a = $sth_temp->fetch(PDO::FETCH_ASSOC))
//if fetched, $r is truthy, and this branch will be executed
// the second expression (right of the || operator) need never be evaluated
由于短路评估,$a = ...
当第一个条件评估为真时,PHP 不会执行第二个表达式 ( )。
如果第一个 fetch 调用为真,则 while 循环条件为真,因为这就是什么或意味着:如果 this 或 that 为真。评估第二个表达式没有意义,条件的结果是给定的:它是真的。
因此,从本质上讲,循环将遍历 的所有结果集$sth->fetch()
,并且一旦那里没有任何剩余可以获取,那就是何时$sth_temp->fetch
被调用。你可以这样写:
while($r = $sth->fetch(PDO::FETCH_ASSOC))
{
//process $r
}
while(false || $a = $sth->fetch(PDO::FETCH_ASSOC))
{//the false is what $sth->fetch() would be after a while in your code
//process $a
}
不是你想要的,是吗。即便如此:因为您使用了||
运算符,所以您承认在某些情况下,您正在执行的 2 个 fetch 调用中的任何一个都可能失败,但是在while 循环中,您只需假设两者都$a
被$r
分配了关联数组:
$itemcount=countitemsofuser($r['id']);
//...
echo "<td>{$a['stype']}</td>\n";
这完全是错误的。如果要同时处理数据,请使用&&
:
while($r = $sth->fetch(PDO::FETCH_ASSOC) && $a = $sth_temp->fetch(PDO::FETCH_ASSOC))
{
}
避免短路评估的问题。尽管如此,当这些 fetch 调用之一返回 false 时,您必须像这样处理剩余的数据:
$leftRow = $a ? $a : $r;//get the fetched data from the resultset that isn't empty
$left = ($a ? $sth_temp : ($r ? $sth : false));//get the object on which to fetch
if ($left)
{//if there are some left:
do
{//begin with row that was already fetched
//process $leftRow
} while($leftRow = $left->fetch(PDO::FETCH_ASSOC));//and keep fetching
}
但这太可怕了,不是吗。通过更改查询(例如使用 JOIN ),
您更有可能更轻松、更有效地解决此问题...