2012-03-18 2 views
3

Хорошо, так что я понимаю, что когда делать:Используйте цикл Еогеасп вместо в то время как с myslqli_fetch_array()

//connection code; 

//query code; 

//$result= mysqli_query(); 

$row= mysqli_fetch_array($result); 

создать ассоциативный массив, в котором имена столбцов из таблицы являются ключом для данных в соответствующая строка.

Затем вы можете использовать:

while ($row= mysqli_fetch_array($result)) 
{ 
//code to echo out table data. 
} 

Мой вопрос, как же цикл в то время как перейти к следующей строке после каждой итерации? Я думал, что для этого нужны петли foreach?

+1

Обратите внимание, что ['PDOStatement'] (http://php.net/PDOStatement) поддерживает интерфейс [' Traversable'] (http://php.net/Traversable), поэтому его можно использовать в 'foreach' петли напрямую, в отличие от результатов mysqli. – outis

+2

с PHP5.4 'mysqli_query' return [' mysql_result' object] (http://www.php.net/manual/en/class.mysqli-result.php), который является [Traversable] (http: // www .php.net/manual/en/class.traversable.php), поэтому использование 'foreach' тоже будет работать. –

ответ

4

От http://www.php.net/manual/en/function.mysql-fetch-array.php

массива mysql_fetch _array (ресурс $ result [, int $ result_type = MYSQL_BOTH]) Возвращает массив, соответствующий выбранной строке, и перемещает указатель внутренних данных вперед.

0

Эта часть выбирает одну строку, в то время

$row = mysqli_fetch_array($result); 

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

Альтернатива была бы извлечь все строки, а затем цикл через них с Еогеаспом

$rows = mysql_fetch_all($result); 
foreach($rows as $row){ 
    // do something with row 
} 

Для этого, чтобы работать, вы должны сделать себе mysql_fetch_all функцию, которая, конечно, имеет оригинальное время цикла в нем ...

function mysql_fetch_all($result) 
{ 
    $all = array(); 
    while($thing = mysql_fetch_assoc($result)) { 
    $all[] = $thing; 
    } 
    return $all; 
} 
0

Это работает из-за того, что соединитель SQL сохраняет текущее состояние запроса (то есть следующую возвращаемую строку результата) внутри результата.

Если вы хотите аналогичный пример, он работает, как чтение из файла, в котором вы можете использовать подобные конструкции:

while ($line = fgets($fp, 1000)) { 
    // ... 
} 

За кулисами (и в зависимости от языка, переводчика, составителя, и т. д.) for и while по существу приводят к тому же коду. Разница в том, что в зависимости от того, что должен делать ваш код, один подход может быть более читаемым, чем другой.

В качестве примера возьмем следующие две петли. Оба делают то же самое.

for ($i = 0; $i < 10; $i++) { 
    // ... 
} 

$i = 0; 
while ($i < 10) { 
    // ... 
    $i++; 
} 
+1

Это не PHP, который делает это, но клиентскую библиотеку MySQL. – glglgl

+0

Прошло? Хорошо, думал, что MySQL (или любая другая библиотека используется) к тому времени. Но опять же, тогда он будет использовать общие вызовы. Дело принято. – Mario

1

Многие функции, которые возвращают набор результатов сделать так, возвращая массив, который вы можете сделать foreach() на, как вы привыкли. Однако это не всегда так, особенно с функциями базы данных. mysqli_fetch_array извлекает только одну строку или возвращает boolean false, если их больше нет. Вот как работает цикл: выражение оценивается как true, пока существует строка для обработки.

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

У Mysqli фактически есть функция, которая извлекает весь набор результатов в массиве: mysqli_fetch_all. Вы сможете сделать foreach().

0

Каждый раз, когда цикл while работает, он выполняет функцию mysql_fetch_array и получает следующий результат. Он делает это, пока не будет видно больше результатов.

0

mysql_fetch_array возвращает массив строк, соответствующий выбранной строке, или FALSE, если больше строк нет. Если строка существует, то получите данные.

Я надеюсь, что это ответили вам q. Его трудно понять, что вы имеете в виду.

1

mysql_fetch_array просто извлекает следующую строку набора результатов из вашего запроса mysql и возвращает строку как массив или false, если больше нет строк для извлечения.

Циклы while непрерывно вытягивают результаты по одному из набора результатов и продолжаются до тех пор, пока mysql_fetch_array не станет ложным.

Цикл foreach проходит через каждое значение массива. Поскольку mysql_fetch_array извлекает только один результат, поэтому значение count ($ row) будет равно 1 каждый раз.