2013-05-09 2 views
2

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

так что это выход: выход 'выход' выход '' выход b '' выход c '' выход 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>';} 
     } 
    } 
?> 
+0

, что делает 'var_dump ($ г);' (помещается в цикл while)? –

+1

вам не нужно 2 запроса, это можно сделать в одном – 2013-05-09 20:42:04

+2

Вам нужно прочитать [надлежащее SQL-экранирование] (http://bobby-tables.com/), потому что вы не можете писать код, как этот, и ожидайте его быть безопасным. – tadman

ответ

5

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

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

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

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

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

2

Ниже приведен пример использования одного запроса с подзапросом. Не нужно делать 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 . '<br />'; 
} 
?> 
0

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

+0

Думаю, мне нужно 'foreach', потому что $ r ['name'] не всегда будет иметь одинаковое количество переменных для вывода для каждого пользователя. Иногда это может быть 0, иногда 1,2,3 и т. Д. –

+0

каждая итерация цикла while, $ r будет одним массивом элементов, подобным этому '(0 => 'name')', и если вам нужно эхо-имя, echo $ r ['name']; ' – Amir

Смежные вопросы