Почему мой цикл foreach работает не так, как ожидалось?

Я довольно новичок в разработке 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.

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