Я пытаюсь получить данные из БД и распечатать их на странице. Я использую следующий выбор:
$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>';