Я довольно новичок в разработке PHP, но я бы хотел подумать, что я подбираю его быстрыми темпами, но я столкнулся с проблемой, когда перешел с XAMPP на настоящий хост. Я пытаюсь сделать что-то подобное.
$cast_list = mysqli_query($dblink, $sql); foreach ($cast_list as $role) { echo "<tr><td width='50%'>".$role['appeared_as']."</td>"; }
Он работает на XAMPP, который я установил на своем домашнем ПК, но он не работает на хостинге, который я организовал для тестирования. Фактический запрос работает отлично, так что это не проблема. Я вижу правильные результаты в PHPMyAdmin, на XAMPP, и когда я меняю код следующим образом.
$cast_list = mysqli_query($dblink, $sql); $y = mysqli_num_rows($cast_list); for ($x = 0; $x <$y; $x++) { $role = mysqli_fetch_assoc($cast_list); echo "<tr><td width='50%'>".$role['appeared_as']."</td>"; }
Второй кодовый блок даст желаемый эффект. Первый блок кода, по-видимому, будет повторяться 5 раз, но не будет содержать сколько-нибудь значимых данных. Фактически var_dump($role)
для первого блока кода показывает, что он NULL
.
Я могу приспособиться к этому, если нужно, но, может быть, есть логическая причина, почему foreach
не работает должным образом для меня?
mysqli_query()
не возвращает массив или объект массива, который можно использовать с foreach (). Возвращаемый тип mysqli_query () – это ресурс. Вы получаете от него в цикле, как и ваше второе решение.
Это проще использовать while () вместо for ():
$cast_list = mysqli_query($dblink, $sql); while ($role = mysqli_fetch_assoc($cast_list)) { echo "<tr><td width='50%'>".$role['appeared_as']."</td>"; }
Цикл будет автоматически завершен, когда строка будет NULL в конце результирующего набора. Вам не нужно знать количество строк перед циклом.
Ваш комментарий:
Изучив некоторые факты , я должен признать, что мой ответ выше не совсем прав. Или это неверно для некоторых версий PHP.
В PHP 5.4 ресурс mysqli_result добавляет функциональность Iterator
, вы фактически можете использовать его в foreach()
. Но ваш хост, очевидно, использует старую версию PHP.
Лучшей практикой является разработка на той же версии всего программного обеспечения, к которой вы будете развертываться, поэтому вы не пойманы таким сюрпризом.