-1

这个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

4 回答 4

1

mysql_num_fields返回由 sql 查询返回的表中的列数。它不会改变每一行。您不应该在每个循环中都运行它。

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

你需要一个php & mysql教程。

于 2012-08-22T20:58:20.970 回答
1

来自 PHP 手册

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

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

您的 while 将仅针对每个结果运行。你应该只需要做

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>";
    

}

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

于 2012-08-22T20:58:27.750 回答
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 */
}
于 2012-08-22T20:58:51.667 回答
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>";
}
于 2012-08-22T21:52:45.643 回答