MySQL没有拉动所有行

时间:2010-08-14 20:38:17

标签: php mysql

嘿伙计们,第一次使用stackoverflow。

你能帮我调试吗?

这是问题所在,这个查询是从我的数据库中选择所有行,由于某种原因,它只输出第二行。

  $top10_query = "SELECT * FROM kicks";
  $result = mysqli_query($cxn, $top10_query) or die("Couldn't execute query.");
  $row = mysqli_fetch_assoc($result);

  $rating = $row['rating'];
  $description = $row['description'];
  $completed = $row['completed'];
  $userid = $row['userid'];
  $posted = $row['posted'];

  while($row = mysqli_fetch_assoc($result)) {
   echo "<tr>";
    echo "<td class='rating'>" . $rating . "</td>";
    echo "<td class='description'>" . $description . " </td>";
    echo "<td class='completed_" . $completed . "'>" . $completed  . "</td>";
    echo "<td class='author'>";
     echo "Posted by: <a href='profile?userid=" . $userid . "'>" . $userid . "</a><br />";
     echo "on "; echo $posted;
    echo "</td>";
   echo "</tr>";
  }

3 个答案:

答案 0 :(得分:2)

您循环遍历行集,但从不多次检索其值。您从第一行中提取了所有值,并将其缓存在此处:

$rating = $row['rating'];
$description = $row['description'];
$completed = $row['completed'];
$userid = $row['userid'];
$posted = $row['posted'];

将此代码移动到循环中,然后删除第一次获取。

答案 1 :(得分:2)

您需要在$rating循环中更新$descriptionwhile等:

<?php

  $top10_query = "SELECT * FROM kicks";
  $result = mysqli_query($cxn, $top10_query) or die("Couldn't execute query.");

  while($row = mysqli_fetch_assoc($result)) {
   $rating = $row['rating'];
   $description = $row['description'];
   $completed = $row['completed'];
   $userid = $row['userid'];
   $posted = $row['posted'];

   echo "<tr>";
    echo "<td class='rating'>" . $rating . "</td>";
    echo "<td class='description'>" . $description . " </td>";
    echo "<td class='completed_" . $completed . "'>" . $completed  . "</td>";
    echo "<td class='author'>";
     echo "Posted by: <a href='profile?userid=" . $userid . "'>" . $userid . "</a><br />";
     echo "on "; echo $posted;
    echo "</td>";
   echo "</tr>";
  }

?>

或者,当然,您可以内联$rating等,而不是写$row['rating']

注意:您可能希望在将变量插入HTML之前通过htmlspecialchars运行变量。否则,像<script>alert('hacked');</script>这样的描述可能会执行一个脚本,让自己受到XSS攻击。

您也可以使用extract。但是,我不建议您这样做,因为它可能会给其他开发人员带来问题和困惑:

<?php

  $top10_query = "SELECT * FROM kicks";
  $result = mysqli_query($cxn, $top10_query) or die("Couldn't execute query.");

  while($row = mysqli_fetch_assoc($result)) {
   extract($row);

   echo "<tr>";
    echo "<td class='rating'>" . $rating . "</td>";
    echo "<td class='description'>" . $description . " </td>";
    echo "<td class='completed_" . $completed . "'>" . $completed  . "</td>";
    echo "<td class='author'>";
     echo "Posted by: <a href='profile?userid=" . $userid . "'>" . $userid . "</a><br />";
     echo "on "; echo $posted;
    echo "</td>";
   echo "</tr>";
  }

?>

答案 2 :(得分:0)

变量$rating等没有“绑定”到表达式$row['rating']等。一旦设置,它们将永远采用这些值,除非您再次修改它们。

有关详细信息,请参阅PHP: Assignment Operators

尝试将它们重写为:

  $top10_query = "SELECT * FROM kicks";
  $result = mysqli_query($cxn, $top10_query) or die("Couldn't execute query.");

  while($row = mysqli_fetch_assoc($result)) {
    $rating = $row['rating'];    // <-- use the new value every time a row is fetched.
    $description = $row['description'];
    $completed = $row['completed'];
    $userid = $row['userid'];
    $posted = $row['posted'];

   echo "<tr>";
    echo "<td class='rating'>" . $rating . "</td>";
    echo "<td class='description'>" . $description . " </td>";
    echo "<td class='completed_" . $completed . "'>" . $completed  . "</td>";
    echo "<td class='author'>";
     echo "Posted by: <a href='profile?userid=" . $userid . "'>" . $userid . "</a><br />";
     echo "on "; echo $posted;
    echo "</td>";
   echo "</tr>";
  }