-1

好吧 - 这可能是一个愚蠢的问题,但我对完美的渴望正在推动我,所以,如果它是愚蠢和毫无意义的,请告诉我。

我有一个 mysql 查询,我从数据库表中获取行,并且我需要为我收集的所有列提供某种形状或形式的值。查看以下示例代码(这可以使用数组来收集输出 - 基本问题应该是相同的):

$query="SELECT A,B,C,D FROM table1 WHERE 'X'='Y'";
$result=mysql_query($query,$resource);
while($row=mysql_fetch_assoc($result)){
   $var1=$row['A'];   $var2=$row['B'];

   echo '<li class="' . $row['C'] . '" id="' . $row['D'] . '">';
}

我的问题如下:

我只需要 $row['A'] 和 $row['B'] 一次,因为在这种情况下它们对于每一行都是相同的值,但我确实需要它们一次。每行的其他值都不同,我也需要它们,如示例中所示。

在整个循环中连续设置变量是否有问题?还是使用if(!isset...更好?还是有其他方法可以做到这一点?还是性能影响如此之小以至于使这个问题变得无关紧要?

谢谢

4

4 回答 4

1

为什么不将变量设置在循环之外。

$result=mysql_query($query,$resource);
$result_new = mysql_fetch_assoc($result);
$var1 = $result_new['A']; //considering $result_new['A'] always exists 
$var2=$result_new['B']; //considering $result_new['B'] always exists
while($row=$result_new){ 
echo '<li class="' . $row['C'] . '" id="' . $row['D'] . '">';
}
于 2012-09-21T16:26:41.560 回答
1

真的不要为此烦恼。除非您循环数百万条记录。

如果您需要更快的速度,请不要在 while 循环中回显:

 $result=mysql_query($query,$resource);
    $string ='';
if ($result) {
$row=mysql_fetch_assoc($result);
$string .= '<li class="' . $row['C'] . '" id="' . $row['D'] . '">';
$var1=$row['A'];
$var2=$row['B'];

    while($row=mysql_fetch_assoc($result)){

    $var1=$row['A']; $var2=$row['B'];
    $string .= '<li class="' . $row['C'] . '" id="' . $row['D'] . '">';
    }
   }
    echo $string;

还有两件事。不要使用 mysql_*:不鼓励使用这个扩展!

并且(就像我认为其他人所说的那样)如果 a/b 总是相同的,你应该重新考虑你的数据库结构。

编辑:给你的问题一个真正的答案:我做了一个小测试。设置每个循环的值(1,000 次)需要 0.00027 秒。检查循环内部是否已设置值需要 0.00030 秒。所以每次设置它甚至比检查更快。

于 2012-09-21T16:34:38.703 回答
1
  1. 在这种情况下对性能的影响是无关紧要的,事实上我会推测if(isset..)守卫是否会花费更长的时间——我能想到的唯一一种情况,这个问题很重要的情况是你将(更大的)对象或数组分配给$var1和以某种方式强制 php 进行复制,而不是参考

  2. 如果它因美学原因而困扰您(我可以联系;)),您可以使用 do - while 循环:

    //assuming you always get at least one result
    $result=mysql_query($query,$resource);
    $row=mysql_fetch_assoc($result);
    $var1=$row['A'];   $var2=$row['B'];
    
    do {
      // the loop stuff - stringify or echo the list
    } while ($row=mysql_fetch_assoc($result)) ;
    
于 2012-09-21T16:52:14.503 回答
1

你可以用 do-while 表达式来做到这一点

$query="SELECT A,B,C,D FROM table1 WHERE 'X'='Y'";
$result=mysql_query($query,$resource);
if($row=mysql_fetch_assoc($result)) {
    $var1=$row['A'];   $var2=$row['B'];
    do {
        echo '<li class="' . $row['C'] . '" id="' . $row['D'] . '">';
    } while($row=mysql_fetch_assoc($result));
}
于 2012-09-21T16:54:11.173 回答