mysql_fetch_array и while loop in php

Я пытаюсь получить данные из БД и распечатать их на странице. Я использую следующий выбор:

$tableIndex=mysql_query('SELECT table_index FROM table_names'); 

Когда я использую цикл while для печати, все в порядке. Код:

 while($row = mysql_fetch_array($tableIndex) ){ echo $row[0].'<br>';} 

Результат:

 1st 2nd 3rd 

Но без цикла while он дает мне только первый элемент массива.

Код:

 $row = mysql_fetch_array($tableIndex); echo $row[0].'<br>'; echo $row[1].'<br>'; echo $row[2].'<br>'; 

Результат:

 1st _ _ 

(где «_» – пустое пространство)

Может ли кто-нибудь объяснить, почему это работает так странно?

Вы принципиально недопонимаете, как это работает.

«Массив» в mysql_fetch_array не является массивом всех записей, а массивом данных в текущей записи.

В вашем случае вы извлекаете только одно поле, поэтому массив будет содержать только один элемент (например, $row[0] ), но принцип тот же – это массив единственной записи, который у вас есть читать.

Только данные для текущей записи находятся в массиве в любой момент времени. Для этого while цикл while; он возвращает любые нагрузки по каждой записи один за другим.

Если вы хотите создать массив, содержащий все данные, вам нужно сделать это следующим образом:

 $fullData = array() while($row = mysql_fetch_array($tableIndex) ){ $fullData[] = $row[0]; } 

Это поместит все данные, которые вы читаете, в один большой массив, чего вы ожидаете. Теперь вы можете делать то, что вы хотели сделать в вопросе:

 echo $fullData[0].'<br>'; echo $fullData[1].'<br>'; echo $fullData[2].'<br>'; 

Надеюсь, это поможет.

Здесь стоит отметить, что семейство функций mysql_xxx() отработано и считается устаревшим. Если вы просто изучаете PHP (что бы это было так), я настоятельно рекомендую вам прекратить изучать эти функции и вместо этого изучить библиотеку PDO . Он более современен и обладает множеством функций, которые функции mysql не могут обеспечить. Кроме того, будущие версии PHP полностью удалят функции mysql , поэтому вам нужно будет переключиться в какой-то момент – возможно, теперь, пока вы все еще учитесь.

Также (чтобы учесть вещи, имеющие отношение к вопросу) библиотека PDO имеет функцию, которая фактически выполняет то, что вы ищете в одной функции: PDO::fetchAll() . Использование этого метода означает, что вы можете получить все данные в один большой массив в одной строке, без необходимости делать цикл while. Код выглядел бы примерно так:

 $sth = $dbh->prepare("SELECT name, colour FROM fruit"); $sth->execute(); $result = $sth->fetchAll(); 

(пример из руководства PHP для PDO::fetchAll )

Каждый раз, когда ваш цикл перемещается, этот код выполняется снова:

 $row = mysql_fetch_array($tableIndex); 

Поэтому каждый раз, когда $ row получает новое значение. Эквивалент без цикла:

 $row = mysql_fetch_array($tableIndex); echo $row[0].'<br>'; $row = mysql_fetch_array($tableIndex); echo $row[0].'<br>'; $row = mysql_fetch_array($tableIndex); echo $row[0].'<br>';