Перейти к содержимому

Mysql fetch array что делает

  • автор:

Особенности работы функции mysql_fetch_array

Особенностью функции mysql_fetch_array() и вообще все курсорных функций является то, что они извлекая строку из результирующей таблицы продвигают курсор вперед. Поэтому если у вас в таблице лишь две записи и вы два раза вызываете mysql_fetch_array() , то последующие вызовы ни к чему не приводят, так как курсор указывает на конец результирующей таблицы. Для того, чтобы установить курсор в начало, вам потребуется выполнить функцию mysql_data_seek() .

$str = "show TABLEs LIKE 'dialog_".$_POST['login']."%'"; $res = mysql_query($str); $num = mysql_num_rows($res); $row = mysql_fetch_array($res); print $row[0]; $row = mysql_fetch_array($res); print $row[0]; mysql_data_seek($res); for ($i=0; $i

Отслеживать
ответ дан 16 июл 2016 в 9:58
19.4k 29 29 золотых знаков 47 47 серебряных знаков 139 139 бронзовых знаков

mysql_fetch_array — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба.Возвращает массив, соответствующий обработанному ряду результата запроса и сдвигает внутренний указатель данных вперед. Это означает что надо пользоваться этой возможностью.То Есть бросить ее в цикл который при каждой итераций будет передвигать внутренний курсор в перед.возвращать либо данное значение либо false если курсор дошел до конца.

Без цикла,то есть присвоив ее переменной (в вашем случае) мы получим текущее одно значение массива.

Для понимания что такое курсор в массивах изучи функции next(), current(),prev(),reset(),end()

 mysql_free_result($result); ?> 

Отслеживать
ответ дан 16 июл 2016 в 10:04
Vanya Avchyan Vanya Avchyan
4,960 1 1 золотой знак 17 17 серебряных знаков 42 42 бронзовых знака

  • php
  • mysql
  • sql
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.8.3130

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Получение строки данных в виде массива. Функции mysqli_fetch_array() (или mysql_fetch_array())

Функция mysqli_fetch_array() (mysql_fetch_array()) используется для получения одной строки из результирующего набора, которую она помещает в массив. При этом можно получить как ассоциативный массив, так и массив с числовыми индексами. Кроме того, можно вернуть сразу оба типа массива, передав соответствующий параметр.

Так как функция mysql_fetch_array() сейчас является устаревшей и имеет статус «depricated», то рекомендуется в коде использовать ее модификацию — mysqli_fetch_array(). При этом разницы в использовании практически нет никакой.

Данную функцию можно использовать в «объектно-ориентированном» или «процедурном» стиле. Рассмотрим сначала «объектно-ориентированный» стиль. Допустим у нас имеется база данных «my_dbbase», в которой есть таблица «users». Из нее нам необходимо достать 10 строк (id пользователя и его имя) и вывести эти данные построчно:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
 //создаем и выполняем запрос к таблице пользователей $query = "SELECT id, name FROM users ORDER BY id LIMIT 10"; $result = $mysqli->query($query); //выводим данные while($row = $result->fetch_array()) < echo $row['id']." ".$row['name']."
"; > // очищаем result-объект $result->close(); // закрываем соединение $mysqli->close();

В данном примере мы использовали константу MYSQLI_ASSOC, чтобы получить данные в виде ассоциативного массива. Ключом при этом будет является название колонки в таблице. Если же нам нужен обычный массив с числовыми ключами, то можно использовать константу MYSQLI_NUM:

1 2 3
while($row = $result->fetch_array(MYSQLI_NUM)) < echo $row[0]." ".$row[1]."
"; >

Но в большинстве случаев использование ассоциативного массива все же более оправдано, т.к. код при этом становится более читабельным (мы четко видим, какой элемент мы используем). Единственное, о чем здесь нужно помнить, что если вы делаете выборку из нескольких таблиц одним запросом, то в случае совпадения имен колонок, они будут перетираться. В этом случае целесообразно использовать алиасы для колонок.

Существует и второй способ использования функции mysqli_fetch_array — процедурный:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
 //создаем и выполняем запрос к таблице пользователей $query = "SELECT id, name FROM users ORDER BY id LIMIT 10"; $result = mysqli_query($connectLink, $query); //преобразуем данные в ассоциативный массив, выводим их построчно while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) < echo $row['id']." ".$row['name']."
"; > // очищаем result-объект mysqli_free_result($result); // закрываем соединение mysqli_close($connectLink);

Каждый раз, когда мы выполняем

$row = mysqli_fetch_array($result, MYSQLI_ASSOC)

, то в $row помещается новая строка из выборки, а указатель в результирующей выборке при этом смещается на следующую строку. Таким образом, мы можем пройтись по всем строкам.

Какой способ выбрать — решать вам.

Другие посты

  • Замена строки другой строкой. Функции str_replace() и substr_replace() в PHP
  • Ошибка при работе с Doctrine: No identifier/primary key specified for Entity
  • Форматирование даты в PHP
  • Как добавить к дате секунды, минуты, часы, дни и т.д. (php)
  • Форматирование чисел. Как использовать функцию number_format() в php

mysql_fetch_array

Функция mysql_fetch_array — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба.

array mysql_fetch_array (resource result [, int result_type])

Возвращает массив с обработанным рядом результата запроса, или FALSE, если рядов больше нет.

mysql_fetch_array() расширенная версия функции mysql_fetch_row(). В дополнении к хранению значений в массиве с численными индексами, функция возвращает значения в массиве с индексами по названию колонок.

Если несколько колонок в результате будут иметь одинаковые названия, последняя колонка будет возвращена. Чтобы получить доступ к первым, используйте численные индексы массива или алиасы в запросе. В случае алиасов используйте именно их — вы не сможете использовать настоящие имена колонок, как например не сможете использовать ‘field’ в нижеописанном примере.

select table1.field as foo, table2.field as bar from table1, table2

Важно заметить, что mysql_fetch_array() работает НЕ медленне, чем mysql_fetch_row(), в то время, как предоставляет более удобный доступ к данным.

Второй опциональный аргумент result_type в функции mysql_fetch_array() — константа и может принимать следующие значения: MYSQL_ASSOC, MYSQL_NUM и MYSQL_BOTH. Эта возможность добавлена в PHP 3.0.7. Значением по умолчанию является: MYSQL_BOTH.

Используя MYSQL_BOTH, вы получите массив, состоящий как из ассоциативных индексов, так и из численных. MYSQL_ASSOC вернёт только ассоциативные соответствия (аналогично функции mysql_fetch_assoc() и MYSQL_NUM только численные (аналогично функции mysql_fetch_row()).

mysql_connect ( «localhost» , «mysql_user» , «mysql_password» ) or
die( «Could not connect: » . mysql_error ());
mysql_select_db ( «mydb» );

$result = mysql_query ( «SELECT id, name FROM mytable» );

while ( $row = mysql_fetch_array ( $result , MYSQL_NUM )) <
printf ( «ID: %s Name: %s» , $row [ 0 ], $row [ 1 ]);
>

mysql_connect ( «localhost» , «mysql_user» , «mysql_password» ) or
die( «Could not connect: » . mysql_error ());
mysql_select_db ( «mydb» );

$result = mysql_query ( «SELECT id, name FROM mytable» );

while ( $row = mysql_fetch_array ( $result , MYSQL_ASSOC )) <
printf ( «ID: %s Name: %s» , $row [ «id» ], $row [ «name» ]);
>

mysql_connect ( «localhost» , «mysql_user» , «mysql_password» ) or
die( «Could not connect: » . mysql_error ());
mysql_select_db ( «mydb» );

$result = mysql_query ( «SELECT id, name FROM mytable» );

while ( $row = mysql_fetch_array ( $result , MYSQL_BOTH )) <
printf ( «ID: %s Name: %s» , $row [ 0 ], $row [ «name» ]);
>

Если Вам нужна частная профессиональная консультация от авторов многих книг Кузнецова М.В. и Симдянова И.В., добро пожаловать в наш Консультационный Центр SoftTime.

Цикл mysql_fetch_array — зачем он нужен?

/* fetch associative array */
//.
while ( $row = mysqli_fetch_assoc ( $result ) ) <
printf ( » %s ( %s ) \n » , $row [ «Name» ] , $row [ «CountryCode» ] ) ;
>
//.

/* free result set */
mysqli_free_result ( $result ) ;

Исходя из этого когда, после этой строки:

$result = mysqli_query ( $link , $query )

в переменной $result появляется вся таблица выборки (или, если хотите, двумерный массив) в нечитаемой форме (бинарной или какой-то ещё, неважно). Почему я так решил? Потому что больше нигде ничего в переменную $result не заносится. Теперь вопрос — не должно ли быть какой-либо функции, возвращающей сразу двумерный массив, а не перебирающего по ряду (row) цикла?

Вся логика цикла понятна — при присвоении функции $row = mysql_fetch_array($result) производится чтение и увеличение внутри $result на единицу после каждого обращения/присвоения. И каждый раз в цикле переменная $row «затирается».

Но зачем реализовать цикл, если в $result уже сразу вся выборка из базы данных есть и её просто можно было бы присвоить двумерному массиву?

$query = «SELECT Name, CountryCode FROM City WHERE CountryCode = ‘NLD’ ORDER BY ID DESC»

$result = mysql_query ( $query ) ;

$arr2d = mysql_fetch_table ( $result )

echo $arr2d [ 0 ] [ ‘Name’ ] ; // должно было бы вывести «Alkmaar»

Разработчики PHP не додумались до такой функции?

На мой взгляд, она была бы очень удобна.

Как вы считаете?

7 ответов

20 ноября 2012 года
14 / / 26.02.2012
Или такая функция есть, но я о ней не знаю?
20 ноября 2012 года
668 / / 30.03.2005
http://www.php.net/manual/en/function.mysql-result.php
20 ноября 2012 года
228 / / 18.04.2012

Я не ПХП шник, но эта ваша «переменная» ($result = mysql_query($query) — вовсе даже похожа на «датаридер» . А датаридер не содержит всех записей а читает их с сервера по команде, одну за другой и только в одном направлении.
Это довольно низкий уровень взаимодействия с базой, но он же самый быстрый.

20 ноября 2012 года
14 / / 26.02.2012
http://www.php.net/manual/en/function.mysql-result.php

Эта функция позволяет обратиться сразу к элементу по порядковому номеру (без цикла), но не извлекает сразу всю выборку в массив. Немного не то. Т.е. чтобы извлечь всю выборку, мне опять-таки надо организовать цикл.

Я не ПХП шник, но эта ваша «переменная» ($result = mysql_query($query) — вовсе даже похожа на «датаридер» . А датаридер не содержит всех записей а читает их с сервера по команде, одну за другой и только в одном направлении.
Это довольно низкий уровень взаимодействия с базой, но он же самый быстрый.

Т.е., другими словами, хотя в коде явно в $result переменную заносится значение один раз:

$result = mysqli_query ( $link , $query )

на самом деле в $result попадает только первый ряд (row) выборки из базы данных, а потом по мере обращения через

$row = mysqli_fetch_assoc ( $result )

в $result появляется следующий ряд(row), пока не закрыто соединение с базой данных с помощью mysqli_close($link) ? Я правильно вас понял?

Если так, то этот код должен быть нерабочим:

$link = mysqli_connect ( «localhost» , «root» , «root» ) ;

mysqli_select_db ( $link , «world» ) ;

$sql = «SELECT * FROM country WHERE Continent = ‘Europe'» ;

$res = mysqli_query ( $link , $sql ) ; // здесь якобы получили только первый ряд (row)

mysqli_close ( $link ) ; // здесь закрываем соединение и по идее, не можем больше взаимодействовать с базой данных

foreach ( $row as $key => $value )
<
echo «

» . $value . «

» ;
>

в силу того, что мы сначала выбрали из базы данных то, что нам надо, закрыли соединение с базой данных ( mysqli_close($link) ) и затем организовали цикл обращения к $result-датаридеру. Если каждый раз при присвоении $row = mysqli_fetch_assoc($res) происходило бы чтение из базы данных сервера, то мы бы не могли ничего прочитать после закрытия соединения.

Тем не менее, этот код работает. Значит, в $result появилась сразу вся выборка, не так ли?

Значит, или я не понял вашу мысль, или ваше утверждение неверно. Если я неправильно понял, пожалуйста, потрудитесь яснее описать, что имеете в виду.
Ещё это может быть баг PHP, хотя я так не думаю, так как мой код (где сначала mysqli_close($link), потом цикл) не противоречит логике (по крайней мере той, которую я описал).

21 ноября 2012 года
228 / / 18.04.2012

>>>>> Тем не менее, этот код работает. Значит, в $result появилась сразу вся выборка, не так ли?
Это можно узнать, если разобрать детально реализацию функций. Может быть закрыло, а может быть и проверило — что еще используется и не закрыло, а может быть и кэш какой-нибудь сработал, проверьте ваш код на миллионе записей.

>>>>> Значит, или я не понял вашу мысль, или ваше утверждение неверно.

— это следует понимать так — » Гарри, сдается мне, что он хочет нас обидеть». 🙂
Вы поняли правильно. Но я не писал что утверждаю, а только предполагаю на основании сходства.

>>>>> Ещё это может быть баг PHP, хотя я так не думаю

Вот и правильно. Не стоит искать баги в системе, которую используют миллионы. 🙂
Я не пишу на PHP, но из опыта работы с другими системами — могу сказать, что если кажется, что функцию добавили зря, то это только кажется.
Без нее не обойтись, а это значит, что сам обьект, который для вас как бы очевидно что двумерный массив, на самом деле не так уж прост, и не может быть приведен к двумерному массиву автоматически.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *