В основном происходит следующее:
Человек идет в определенную галерею, скажем 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, первый результат отсутствует.
Эта конструкция выглядит совершенно сумасшедшей для меня. Я не понимаю, почему он отрезал бы первый элемент, но я действительно не чувствую склонности даже тратить время, чтобы узнать: вам нужно исправить это утверждение. Используя ||
в этом контексте никогда не даст вам результат, который вы хотите.
Можете ли вы описать, что это должно делать?
Зачем вам нужен поп-код?
while($rsComment = mysql_fetch_assoc($rsComments)) { $Comments[] = $rsComment; }
Разве это не делает все, что вам нужно, с тем, чтобы быть намного более многословным?
Редактировать Причина, по которой ваш код не работает, заключается в том, что while вычисляет false, чтобы остановить цикл, он запускает array_pop, и это удаляет 1 элемент из массива.
mysql_fetch_assoc
возвращает ассоциативный массив, который соответствует 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)
|| array_pop($Comments)
удаляет окончательное логическое значение, вставляемое в массив, гарантируя, что массив имеет только строки, возвращаемые mysql_fetch_assoc
.
Я не могу понять, как это работает вообще.
Сначала я предположил, что он заполнит массив значениями 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,...);
Вы должны поставить счетчик; например: $ counter = 3 Затем оператор while содержит этот счетчик, например:
while ($ count <3) {(Ваш счет начинается с 0, так что, хотя у вас есть в общей сложности 4 элемента, 0 считается одним из них. Ваша программа будет считать только до 3 с вашим массивом.)
Я не могу ничего исправить в вашем коде, потому что я слишком новичок в программировании, но, по крайней мере, это поможет вам избежать бесконечного цикла.