-5

此代码在语法方面有任何问题

    $i=0;
while ($r=$sth->fetch(PDO::FETCH_ASSOC))||($a=$sth_temp->fetch(PDO::FETCH_ASSOC)) {
  $i++;
  $itemcount=countitemsofuser($r['id']);
  echo "\n<tr>";
  echo "<td><a class='editid' href='$scriptname?action=editsoftware&amp;id=".$r['id']."'>{$r['id']}</a></td>\n";
  echo "<td>{$r['manufacturerid']}</td>\n";
  echo "<td>{$r['stitle']}</td>\n";
  echo "<td>{$r['sversion']}</td>\n";
  echo "<td>{$a['stype']}</td>\n";

谢谢你的支持。

4

1 回答 1

2

你有一个关闭)太多:

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 ),
您更有可能更轻松、更有效地解决此问题...

于 2013-10-24T10:50:45.217 回答