#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. Не проблема .. теперь вы знаете 🙂