PHP эхо дублирует строки, когда их нет - PullRequest
1 голос
/ 22 декабря 2009
<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><br> <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 есть только один тег <td></td>.
Я также проверил БД и таблица не содержит повторяющихся записей.

Ответы [ 4 ]

6 голосов
/ 22 декабря 2009

Это то, что mysql_fetch_array делает, если вы не предоставите второй аргумент: получает ассоциативный массив, в котором значение отображается как на имя столбца, так и на индекс столбца.

Вы можете предоставить MYSQL_ASSOC в качестве второго аргумента, чтобы иметь только имя столбца (или использовать mysql_fetch_assoc).

2 голосов
/ 22 декабря 2009

Вы, вероятно, выбираете массив результатов MySQL в режиме по умолчанию MYSQL_BOTH.

Попробуйте это:

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_ASSOC или MYSQL_NUM приведет к извлечению только ассоциативных значений или численно проиндексированных значений соответственно.

1 голос
/ 22 декабря 2009

Изменение

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().

0 голосов
/ 22 декабря 2009

Легко.

Если ваш SQL-запрос

SELECT foo FROM bar

тогда mysql_fetch_array возвращает 2 результата. Один с числовым индексом, другой с именем поля. Добавьте print_r ($ r) в свой код, чтобы увидеть поведение.

Решение? Использовать mysql_fetch_assoc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...