В основном происходит следующее:
Человек идет в определенную галерею, скажем GalleryID = 42. Я делаю запрос, чтобы захватить все изображения в этой галерее (со значением GalleryID = 42) и сделать отдельный запрос, чтобы захватить все комментарии, связанные с этой галереей (например GalleryID = 42). Всего может быть всего 4 комментария на 3 разных изображениях из 400 изображений.
Когда я просматриваю изображения с помощью цикла do/while и отображаю их, я просматриваю массив комментариев, которые были помещены для каждого изображения, когда он петли. Если он находит идентификатор изображения, который соответствует определенному изображению, он отображает значения комментариев (Comment, CommentAuthor и CommentDate).
Вот запрос изображений:
SELECT * FROM GalleryData WHERE GalleryID = 42
И запрос комментариев:
SELECT Comment, CommentAuthor, CommentDate, ID FROM Comments WHERE CategoryID=42
Затем я использую этот код для размещения комментариев в повторном запросе:
while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments));
Затем я использую это для этого, чтобы перебрать массив, чтобы найти комментарии, связанные с конкретным изображением
foreach($Comments as $comment)
{
if($comment['ID'] == $row_rsGalleries['ID'])
{
echo '<p>'.$comment['Comment'].' - '.$comment['CommentAuthor'].'</p>';
}
}
Проблема в том, что этот код, похоже, не содержит самого первого комментария в запросе.
Теперь это один из первых проектов, которые я сделал примерно так, и я не эксперт php/mysql, новичок.
Когда я запускаю запрос, он имеет 4 результата, но массив содержит только 3, первый результат отсутствует.
Эта конструкция выглядит совершенно безумной для меня. Я не понимаю, почему он отрезал бы первый элемент, но я действительно не чувствую склонности даже тратить время, чтобы узнать: вам нужно исправить это утверждение. Использование ||
в этом контексте никогда не даст вам желаемого результата.
Можете ли вы описать, что это должно делать?
|| array_pop($Comments)
должна делать. Я думаю, вы можете просто оставить это, и это должно работать
Зачем вам нужен поп-код?
while($rsComment = mysql_fetch_assoc($rsComments)) {
$Comments[] = $rsComment;
}
Не делает ли это все, что вам нужно, с тем, чтобы быть намного более подробным?
Изменить Причина, по которой ваш код не работает, заключается в том, когда while оценивает значение false, чтобы остановить цикл, он запускает array_pop, и это удаляет 1 элемент из массива.
Вам нужно поставить счетчик; например: $counter = 3 Затем оператор while содержит этот счетчик, например:
while ($ count < 3) {(Ваш счет начинается с 0, поэтому, хотя у вас есть всего 4 элемента, 0 считается одним из них. Ваша программа будет учитывать только до 3 с помощью массива, который у вас есть. )
Я не могу ничего исправить в вашем коде, потому что я слишком новичок в программировании, но, по крайней мере, это поможет вам избежать бесконечного цикла.
Я не могу понять, как это работает вообще.
Сначала я предположил, что он заполнит массив значениями bool
, но, подумав об этом, , цикл никогда не должен заканчиваться.
В конечном итоге он будет равен while(($array[] = array_pop($array)));
, а для непустого массива это будет вращаться навсегда:
Следующие никогда не заканчиваются:
<?php
// Simulate MySQL_fetch_assoc; return false when no more results
function fetch($results) {
if (count($results))
return array_pop($results);
return false;
}
$Comments = array();
$rsComments= array(array(3), array(4), array(5), array(6));
while (($Comments[] = fetch($rsComments) || array_pop($Comments)));
// $Comments = array(true,true,true,true,true,...);
mysql_fetch_assoc
возвращает ассоциативный массив, соответствующий выбранной строке, если присутствуют строки, и он возвращает false
, если строк больше нет.
Итак,
while(($Comments[] = mysql_fetch_assoc($rsComments)) || array_pop($Comments));
будет выглядеть так:
while(true || array_pop($Comments));
для первых 4 строк. Теперь ||
закорочен, поп не происходит. После этого, когда осталось больше строк, mysql_fetch_assoc
возвращает false
, который попадает в массив, а затем выполняется array_pop
, который удаляет последний добавленный элемент (false
).
Таким образом, || array_pop($Comments)
удаляет окончательное логическое значение, заданное в массиве, гарантируя, что массив имеет только строки, возвращаемые mysql_fetch_assoc
.
while ($Comments[] = (true || array_pop(...)));
Это важное различие, так как значения array_push
в массив, всегда являются bools .
mysql_fetch_assoc(...) || array_pop(...)
, вы будетеmysql_fetch_assoc(...) || array_pop(...)
значенияbool
в$Comments
...mysql_fetch_assoc(...) || array_pop(...)
вычисляется перед присваиванием, а результатом всегда будет bool.