запрос php mysql с циклом в нем

#php #mysql #foreach #while-loop

#php #mysql #foreach #while-цикл

Вопрос:

Я пытаюсь получить результаты пользователей в моей базе данных, а затем, если мой флажок установлен, извлекать только пользователей, у которых есть фотографии, чтобы показать эти результаты, но я, похоже, не могу понять, как перебирать эти результаты или даже делаю ли я это в правильном контексте. `

 $photos = $_POST['pcbox'];
$basicsql = "SELECT * FROM users";
$basicsql .= "WHERE status > '1'";
if($photos=='1'){
    $sql = mysql_query("SELECT user_id FROM pictures GROUP BY user_id");
    while($row2 = mysql_fetch_assoc($sql))
    $options[] = " AND (users.user_id = '$row2[user_id]')";
    foreach($options as $key => $str){
        $basicsql .= $str;
    }
}
$basicsql .= " ORDER BY users.last_login DESC";
$pagesql = mysql_query($basicsql);
  

Все работает, пока не установлен флажок

Комментарии:

1. Действительно ли в конце 3-й строки отсутствует цитата? Или это действительно ваш код? Я не уверен, должен ли я это исправить.

2. Я забыл это при размещении этого примера.

3. К сожалению, это слишком короткое исправление, чтобы преодолеть минимальную длину редактирования!

4. @PhilLello: Тогда я не уверен, как я это только что отредактировал ..?

5. @Tomalak должно отличаться для рецензируемых правок и полных правок.

Ответ №1:

Вы не можете использовать один и тот же дескриптор db для вложенных циклов. Вам нужно явно установить дескриптор db для каждого из них.

Однако вы можете просто сделать это в одном sql-запросе.

Наблюдайте:

Select * from users u inner join pictures p on u.id=p.user_id
where status > 1

ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ предоставит вам только пользователей, у которых есть строки в таблице pictures.

Это даст вам пользователей, у которых есть только изображения.

Редактировать

Это даст количество pitcures и только 1 пользовательскую строку.

Select name,email,address,status,count(*) as num_pics from users u inner join pictures p on u.id=p.user_id group by name,email,address,status
where status > 1

Комментарии:

1. Я пробовал этот способ, но тогда, если у пользователя есть более одного изображения, он повторяет пользователю столько раз, сколько у них есть изображений.

2. Хорошо, в итоге я разобрался с этим, просто добавив if($photos=='1'){ $basicsql .= ""; } пару раз все области, которые мне были нужны для достижения этого.

3. @Bobby: $basicsql .= ""; ничего не делает.

4.Да, я знаю, то, что я в итоге сделал, было… $basicsql = "SELECT *,users.user_id FROM users"; if($photos=='1'){ $basicsql .= ", pictures"; } $basicsql .= " WHERE status > '1' if($photos=='1'){ $basicsql .= " AND (users.user_id = pictures.user_id)"; $basicsql .= " GROUP BY users.user_id"; } $basicsql .= " ORDER BY users.last_login DESC"; $pagesql = mysql_query($basicsql);

5. Я бы использовал свое решение, потому что оно более эффективно и проще для понимания. Удачи!

Ответ №2:

Не совсем уверен, что это то, что вы ищете. Также непроверенный.

 $photos = $_POST['pcbox'];
$basicsql = "SELECT * FROM users WHERE status > 1";
$photoSql = "SELECT * FROM users, pictures WHERE status > 1 AND users.user_id = pictures.user_id GROUP BY users.user_id ORDER BY users.last_login DESC"

if($photos=='1')
{
    $result = mysql_query($photosSql);
}
else
{
    $result = mysql_query($photoSql);
}
  

Комментарии:

1. Вы не можете выбрать * и группировать только по user.id

2. Вы имели в виду $basicsql во втором предложении.

Ответ №3:

 $photos = isset($_POST['pcbox']) ? $_POST['pcbox'] : null;

$sql = 'SELECT U.* FROM users AS U LEFT JOIN pictures AS P ON P.user_id = U.id ' . ($photos == '1' ? 'WHERE P.id IS NOT NULL') . ' GROUP BY U.id ORDER BY U.last_login DESC';

$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result))
  // Do something with the user info, such as outputting it to a table
}
  

Ответ №4:

Кроме того, закройте while, прежде чем начинать цикл в options.

Комментарии:

1. Это должен был быть комментарий.

2. Не проблема .. теперь вы знаете 🙂