Хорошо, поэтому я понимаю, что когда делаю:
//connection code; //query code; //$result= mysqli_query(); $row= mysqli_fetch_array($result);
вы создаете ассоциативный массив, в котором имена столбцов из вашей таблицы являются ключами для данных в соответствующей строке.
Затем вы можете использовать:
while ($row= mysqli_fetch_array($result)) { //code to echo out table data. }
Мой вопрос в том, как цикл while переходит к следующей строке после каждой итерации? Я думал, что для этого нужны петли foreach?
С http://www.php.net/manual/en/function.mysql-fetch-array.php
array mysql_fetch_array (ресурс $ result [, int $ result_type = MYSQL_BOTH]) Возвращает массив, соответствующий выбранной строке, и перемещает внутренний указатель данных вперед.
Многие функции, возвращающие набор результатов, делают это, возвращая массив, в котором вы можете сделать foreach()
как вы привыкли. Однако это не всегда так, особенно с функциями базы данных. mysqli_fetch_array
извлекает только одну строку или возвращает boolean false
если больше не осталось. Так работает цикл: выражение оценивается как true
пока существует строка для обработки.
Причиной такой конструкции является, в основном, эффективность. Получение строк базы данных может быть критически важной операцией, и есть случаи, когда не все строки нужны. В этих ситуациях такой подход даст большую гибкость. Сбор строк один за другим также более удобен для памяти, так как не все данные результата должны быть загружены в память сразу.
На самом деле у Mysqli есть функция, которая извлекает весь набор результатов в массиве: mysqli_fetch_all
. Вы сможете сделать foreach()
над этим.
mysql_fetch_array просто извлекает следующую строку набора результатов из вашего запроса mysql и возвращает строку как массив или false, если больше нет строк для извлечения.
Циклы while непрерывно вытягивают результаты по одному из набора результатов и продолжаются до тех пор, пока mysql_fetch_array не станет ложным.
Цикл foreach проходит через каждое значение массива. Поскольку mysql_fetch_array извлекает только один результат, поэтому значение count ($ row) будет равно 1 каждый раз.
Каждый раз, когда цикл while работает, он выполняет функцию mysql_fetch_array и получает следующий результат. Он делает это, пока не будет видно больше результатов.
mysql_fetch_array возвращает массив строк, соответствующий выбранной строке, или FALSE, если больше строк нет. Если строка существует, то получите данные.
Надеюсь, это ответит вам. Его трудно понять, что вы имеете в виду
Эта часть выбирает одну строку за раз
$row = mysqli_fetch_array($result);
Ввод его в цикл while позволяет получить одну строку за раз, пока она не выберет строку, потому что больше не нужно извлекать.
Альтернативой было бы получить все строки, а затем пропустить их с помощью foreach
$rows = mysql_fetch_all($result); foreach($rows as $row){ // do something with row }
Чтобы это сработало, вы должны сделать себе функцию mysql_fetch_all
, которая, конечно же, имеет исходный цикл while …
function mysql_fetch_all($result) { $all = array(); while($thing = mysql_fetch_assoc($result)) { $all[] = $thing; } return $all; }
Это работает из-за того, что соединитель SQL сохраняет текущее состояние запроса (т. Е. Следующую строку результата для возврата) внутри результата.
Если вам нужен аналогичный пример, он работает как чтение из файла, где вы можете использовать похожие конструкции:
while ($line = fgets($fp, 1000)) { // ... }
За кулисами (и в зависимости от языка, интерпретатора, компилятора и т. Д.) for
и в то же while
существу приводят к одному и тому же коду. Разница в том, что в зависимости от того, что должен делать ваш код, один подход может быть более читаемым, чем другой.
В качестве примера возьмем следующие две петли. Оба делают то же самое.
for ($i = 0; $i < 10; $i++) { // ... } $i = 0; while ($i < 10) { // ... $i++; }