Php foreach выводит все дважды

все работает нормально, но вывод отображается дважды.

поэтому он выводит: 'output a' 'output a' 'output b' 'output b' 'output c' 'output c' и т.д.

когда я делаю запрос mysql в phpmyadmin, все отображается только один раз. любые идеи?

то, что делает мой код, идет и получает поле "много-ко-многим"

<!--? 
 $something = mysql_query('select UserID from users where Username ="'. $username .'"');
 while ($row = mysql_fetch_array($something)) {
 $barf = $row['UserID'];
 }
 $result = mysql_query('SELECT name FROM items p LEFT JOIN list up ON p.item_id = up.item_id WHERE up.UserID = "' . $barf . '"');
 while ($r = mysql_fetch_array($result)) {
 foreach($r as $uue) {
 echo $uue . '<br-->';}
 }
 }
?>
3 ответа

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

while ($r = mysql_fetch_assoc($result)){
 foreach($r as $uue) {
 echo $uue . '';
 }
}

Вы получаете повторяющиеся результаты, потому что по умолчанию (MYSQL_BOTH flag) mysql_fetch_array возвращает массив размером 2 ×: индексированный номер + с индексом строки.

Итак, например, $r[0] и $r['name'] будут разными элементами в массиве, которые содержат одинаковые значения.

Кроме того, вы должны прекратить использование mysql_*, поскольку он устарел. Читайте в mysqli_* функции.


Вот пример использования одного запроса с подзапросом. Не нужно делать 2 цикла, когда mysql может предоставить вам данные, необходимые для первого запуска. Кроме того, дополнительный цикл foreach в вашем времени не нужен, поскольку ваши данные возвращаются в виде массива столбцов. Вы можете просто откликнуться на то, что вы хотите по индексу. Поскольку вы только вытаскиваете один столбец, вы можете эхо $r ['name'], или если вы делаете MYSQL_NUM, вы можете сделать $r [0].

<!--?
$escaped_username = mysql_real_escape_string($username);
$query = <<<SQL
SELECT
 name
FROM
 items p
 LEFT JOIN list up ON p.item_id = up.item_id
WHERE
 up.UserID = (SELECT UserID FROM users WHERE Username = '{$escaped_username}')
SQL;
$result = mysql_query($query);
while ($r=mysql_fetch_array($result, MYSQL_ASSOC)) {
 echo $r['name'] . '<br /-->';
}
?>

Также использование mysqli, вероятно, будет лучшим путем, как говорят другие. Вы можете пройти процедурный маршрут, который в значительной степени заменит mysql_ на mysqli_, или вы можете перейти к объектно-ориентированному маршруту.

<!--? 
$mysqli = new mysqli('host', 'user', 'pass', 'database');
$result = $mysqli--->query($query);
while ($r = $result->fetch_object()) {
 echo $r->name . '';
}
?>


независимо от вашего истинного ответа, который для @jari я думаю, почему вы не используете просто echo $r[0]. ''; или echo $r['name']. ''; вместо этого дополнительного foreach

licensed under cc by-sa 3.0 with attribution.