В PHP / Mysql array_pop отсутствует первое значение

0

В основном происходит следующее:

Человек идет в определенную галерею, скажем 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, первый результат отсутствует.

  • 0
    Он берет все значения из запроса Mysql и помещает его в массив для повторного использования, который я могу использовать снова и снова. Значения приходят из:
  • 0
    Ну, во- mysql_fetch_assoc(...) || array_pop(...) , вы будете mysql_fetch_assoc(...) || array_pop(...) значения bool в $Comments ... mysql_fetch_assoc(...) || array_pop(...) вычисляется перед присваиванием, а результатом всегда будет bool.
Показать ещё 3 комментария
Теги:
arrays

5 ответов

5

Эта конструкция выглядит совершенно безумной для меня. Я не понимаю, почему он отрезал бы первый элемент, но я действительно не чувствую склонности даже тратить время, чтобы узнать: вам нужно исправить это утверждение. Использование || в этом контексте никогда не даст вам желаемого результата.

Можете ли вы описать, что это должно делать?

  • 0
    Он принимает значения из набора записей: mysql_select_db ($ database_connUser, $ connUser); $ query_rsComments = sprintf ("SELECT Comment, CommentAuthor, CommentDate, ID ОТ комментариев WHERE CategoryID =% s", GetSQLValueString ($ colname_rsComments, "int"))); $ rsComments = mysql_query ($ query_rsComments, $ connUser) или die (mysql_error ()); $ row_rsComments = mysql_fetch_assoc ($ rsComments); $ totalRows_rsComments = mysql_num_rows ($ rsComments);
  • 1
    @ Рэнди, я не понимаю, что такое || array_pop($Comments) должна делать. Я думаю, вы можете просто оставить это, и это должно работать
3

Зачем вам нужен поп-код?

while($rsComment = mysql_fetch_assoc($rsComments)) {
    $Comments[] = $rsComment;
}

Не делает ли это все, что вам нужно, с тем, чтобы быть намного более подробным?

Изменить Причина, по которой ваш код не работает, заключается в том, когда while оценивает значение false, чтобы остановить цикл, он запускает array_pop, и это удаляет 1 элемент из массива.

  • 1
    Обратите внимание, что когда первый элемент выталкивается, bool возвращается обратно до конца.
0

Вам нужно поставить счетчик; например: $counter = 3 Затем оператор while содержит этот счетчик, например:

while ($ count < 3) {(Ваш счет начинается с 0, поэтому, хотя у вас есть всего 4 элемента, 0 считается одним из них. Ваша программа будет учитывать только до 3 с помощью массива, который у вас есть. )

Я не могу ничего исправить в вашем коде, потому что я слишком новичок в программировании, но, по крайней мере, это поможет вам избежать бесконечного цикла.

0

Я не могу понять, как это работает вообще.

Сначала я предположил, что он заполнит массив значениями 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,...);
0

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.

  • 0
    Некорректное; Это больше похоже на while ($Comments[] = (true || array_pop(...))); Это важное различие, так как значения array_push в массив, всегда являются bools .
  • 0
    В основном происходит следующее: человек идет в определенную галерею, скажем GalleryID = 42. Я делаю запрос, чтобы получить все комментарии, связанные со значением ID = 42. В галерее 400 изображений. Комментарии были сделаны только на несколько фотографий. Когда я перебираю изображения и показываю их, я ищу в массиве комментарии, которые были размещены для каждого изображения, когда оно повторяется. Если он находит идентификатор изображения, соответствующий конкретной картинке, он отображает значения комментариев (Comment, CommentAuthor и CommentDate). Имеет ли это смысл?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню