【问题标题】:PHP echo duplicate rows when none exist当不存在重复行时,PHP 会回显重复行
【发布时间】:2009-12-23 01:28:28
【问题描述】:
<html>
<head>
<title>Test</title>
<link rel="stylesheet" type="text/css" href="style.css"> 
</head>
<body>
    <?php 
       $username ="matt";
       $pass = "bs12kfj";
       $db = "mytest";
       $tbl = "test2";
       mysql_connect(localhost,$username,$pass);
       mysql_select_db($db) or die( "Unable to select database");
       $res = mysql_query("SELECT * FROM test2;");
       $num = mysql_numrows($res);
       echo "<table border='2'><tr>The Peeps</tr>"; 
       while ($r = mysql_fetch_array($res)) {
         echo "<tr>";
         foreach($r as $rs){
                     echo "<td>$rs</td>";
                     }
         echo "</tr>";
       }
       ?>

</body>

此代码执行没有错误,但输出包含每一行的每一列的副本,就像这样。

<table border='2'><tr>The Peeps</tr>
<tr><td>"matt"</td><td>"matt"</td><td>"phillips"</td><td>"phillips></td><td>"mathew.p@waburg.com"</td><td>"mathew.p@waburg.com"</td><td>20</td><td>20</td></tr><tr><td>"paul"</td><td>"paul"</td><td>"franklin"</td><td>"franklin"</td><td>"dude@live.com"</td><td>"dude@live.com"</td><td>30</td><td>30</td></tr><tr><td>"steve"</td><td>"steve"</td><td>"jobs"</td><td>"jobs"</td><td>"sjobs@apple.com"</td><td>"sjobs@apple.com"</td><td>23</td><td>23</td>

我不明白为什么在 echo 语句中只有一个 &lt;td&gt;&lt;/td&gt; 标记时每列都会重复。
我还检查了数据库,该表不包含重复条目。

【问题讨论】:

  • 换掉 mysql_fetch_array 并用 mysql_fetch_assoc 替换(如果你没有另外指定,mysql_fetch_array 返回数字和关联)

标签: php mysql html


【解决方案1】:

如果您不提供第二个参数,这就是mysql_fetch_array 所做的:为您获取一个关联数组,其中的值映射到列名和列索引。

您可以提供MYSQL_ASSOC作为第二个参数以仅包含列名(或使用mysql_fetch_assoc)。

【讨论】:

    【解决方案2】:

    您可能正在以MYSQL_BOTH 的默认模式获取 MySQL 结果数组。

    试试这个:

    while ($r = mysql_fetch_array($res,MYSQL_ASSOC)) {
                 echo "<tr>";
         foreach($r as $rs){
                     echo "<td>$rs</td>";
                     }
                 echo "</tr>";
           }
    

    如果您没有为mysql_fetch_array() 指定第二个参数,则使用MYSQL_BOTH,您最终会得到一个值的关联数组索引和一个数值数组索引,如下所示:

    array(0 => 'field 1 val', 'field1_name'=> 'field 1 val',
          1 => 'field 2 val', 'field2_name'=> 'field 2 val', etc);
    

    指定MYSQL_ASSOCMYSQL_NUM 将仅分别检索关联值或数字索引值。

    【讨论】:

      【解决方案3】:

      改变

      while ($r = mysql_fetch_array($res)) {
      

      while ($r = mysql_fetch_array($res, MYSQL_NUM)) {
      

      while ($r = mysql_fetch_array($res, MYSQL_ASSOC)) {
      

      mysql_fetch_array() 的第二个参数的默认值是 MYSQL_BOTH,它会返回一个以数字相关联的方式索引的数组。或者,您可以使用mysql_fetch_row()(返回数字索引数组)或mysql_fetch_assoc()(返回关联数组)代替mysql_fetch_array()

      【讨论】:

      • MYSQL_NUM 可以与 controlfreak123 的代码一起使用,但这通常是一种不好的方法,因为您永远不应该假设选择字段以相同的顺序从数据库中出来。如果您稍微更改 CREATE TABLE,或者使用 SELECT field1, field2 而不是 *,则顺序可能会更改
      • @Anti Veeranna:如果您使用 foreach 迭代结果,MYSQL_NUMMYSQL_ASSOC 有何不同?
      【解决方案4】:

      简单。

      如果你的 SQL 查询是

      SELECT foo FROM bar
      

      然后 mysql_fetch_array 返回 2 个结果。一个带有数字索引,一个带有字段名称。在代码中添加 print_r($r) 以查看行为。

      解决方案? Use mysql_fetch_assoc

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-05
        • 2021-11-13
        • 2017-05-22
        • 1970-01-01
        • 2011-12-23
        • 2011-03-05
        • 1970-01-01
        相关资源
        最近更新 更多