为什么这个while循环不起作用?

时间:2012-08-22 20:51:51

标签: php mysql

这个while循环没有执行任何回声。我测试了mysql_num_fields($ result);它给了我16,所以不是$ i已经大于$ j。对我来说也不会无限,只是无所事事。

while ($row = mysql_fetch_array($result))  
{ 
    $i = 1;
    $j = mysql_num_fields($result);

    if ($i <= $j) {
        echo "<li>";
        echo "<a id='autoload' href='images/big/".$row['card$i'].".jpg' class='highslide'      onclick='return hs.expand(this, config1 )'>";
        echo "<img src='images/small/".$row['card$i']."jpg' alt''";
        echo " title='";
        echo $year." ". $brand." ".$playerfirst." ".$playerlast." ".$details."'/>";
        echo "</a>";
        echo "</li>";
        $i++;
    }
    else {
        break;
    }
}

我想我应该说这个查询只返回1行。然后,我需要从几个不同的列(card1,card2,card3 ... card16)中提取一个数字,并将其作为图像文件名,如上所示。此外,我了解所有的mysqli和注射内容的保护,我真的不需要担心这种项目。

4 个答案:

答案 0 :(得分:1)

mysql_num_fields返回sql查询返回的表中的列数。它不会改变每一行。你不应该每次循环运行它。

此外,删除$i$j行并将if语句更改为if(false)将完成与现在相同的操作,并解决此问题,您删除if完全声明......

您需要php & mysql教程。

答案 1 :(得分:1)

FROM PHP MANUAL

  

返回与获取的行对应的字符串数组,如果没有其他行,则返回FALSE。返回数组的类型取决于result_type的定义方式。通过使用MYSQL_BOTH(默认),您将获得一个包含关联索引和数字索引的数组。使用MYSQL_ASSOC,你只获得关联索引(如mysql_fetch_assoc()工作),使用MYSQL_NUM,你只获得数字索引(因为mysql_fetch_row()工作)。

     

如果结果的两列或多列具有相同的字段名称,则最后一列将优先。要访问同名的其他列,必须使用列的数字索引或为列创建别名。对于别名列,您无法使用原始列名访问内容。

你的时间只会针对每个结果运行。你应该只需要做

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

    echo "<li>";
    echo "<a id='autoload' href='images/big/".$row['card'].".jpg' class='highslide'      onclick='return hs.expand(this, config1 )'>";
    echo "<img src='images/small/".$row['card']."jpg' alt''";
    echo " title='";
    echo $year." ". $brand." ".$playerfirst." ".$playerlast." ".$details."'/>";
    echo "</a>";
    echo "</li>";


}

这样做只会循环显示每个结果。虽然结果中有一行,但请执行此操作。如果仍有行可用,则返回顶部然后再次执行

答案 2 :(得分:0)

这就是您的代码今天所做的事情:

/* as long as i can fetch a database row */
while($row=mysql_fetch_array($result))  
{ 
   /* reset the counter i */
   $i=1;

   /* count the number of fields */
   $j=mysql_num_fields($result);

   /* as long as its at leas one field ($i is always 1) */
   if ($i <= $j)
   {

      /* print some html */
      echo "<li>";
      echo "<a id='autoload' href='images/big/".$row['card$i'].".jpg' class='highslide'      onclick='return hs.expand(this, config1 )'>";
      echo "<img src='images/small/".$row['card$i']."jpg' alt''";
      echo " title='";
      echo $year." ". $brand." ".$playerfirst." ".$playerlast." ".$details."'/>";
      echo "</a>";
      echo "</li>";

      /* increase counter to 2 (always gets to 2 as i always is 1 before) */
      $i++;
  }

  /* if there was zero field */
  else
  {
      /* break the loop */
      break;
  }

  /* loop by jumping ut to reset counter i */
}

答案 3 :(得分:0)

就像所有人都说的那样,这段代码应该一起重做。但是要尝试找出问题,你有一行有16列。您想打印出16次列表项html。你想要的是for循环。 if循环只运行一次。

for($i=1; $i <= $j; $i++) {
     /* print some html */
      echo "<li>";
      echo "<a id='autoload' href='images/big/".$row['card$i'].".jpg' class='highslide'      onclick='return hs.expand(this, config1 )'>";
      echo "<img src='images/small/".$row['card$i']."jpg' alt''";
      echo " title='";
      echo $year." ". $brand." ".$playerfirst." ".$playerlast." ".$details."'/>";
      echo "</a>";
      echo "</li>";
}