базовый курс

ГРУППА КУРСА

Получение результата выборки в PHP

Функции для получения результата

Когда скрипт отправляет запрос на получение данных из БД, то MySQL возвращает результат выборки, который содержит выбранные записи. Из этих записей нужно получить данные, с которыми может работать PHP программа. Для этого используются такие функции:

mysqli_fetch_row (результат) - возвращает одну запись выборки в виде индексированного массива. Значение каждого поля помещено в отдельный элемент массива.

mysqli_fetch_assoc (результат) - возвращает одну запись выборки в виде ассоциативного массива. Значения полей также помещены в элементы массива. Названия элементов совпадают с названиями полей.

Эти функции может заменить функция mysqli_fetch_array(), которая в зависимости от параметров может вернуть либо индексированный массив, либо ассоциативный массив, либо массив, содержащий и индексы и строковые ключи.

mysqli_fetch_array (результат, тип массива)

Параметры:

результат - результат выборки

тип массива - тип массива, который возвращает функция. Принимает значения: MYSQLI_NUM - индексированный, MYSQLI_ASSOC - ассоциативный, MYSQLI_BOTH - массив, в котором одновременно есть и индексы и строковые ключи. Такой массив получается в два раза больше, потому что каждое значение поля повторяется в двух элементах массива. По умолчанию установлено значение MYSQLI_BOTH.

Создадим скрипт, который получает выборку из базы данных и выводит первую строку результата:

+
1
2
<?php
header('Content-type: text/html; charset=utf-8');
3
4
5
6
7
8
$db = mysqli_connect('localhost', 'root', '', 'mybase');
$query = "SELECT * FROM users";
$result = mysqli_query($db, $query);
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
print_r($row);
mysqli_close($db);

Каждая из описанных функций возвращает только одну запись из выборки. На первом запуске она возвращает первую запись, на следующем вторую и так далее. Чтобы получить всю выборку, нужно запустить функцию в цикле. Чтобы узнать количество записей в выборке, используется функция mysqli_num_rows(). Напишем скрипт так, чтобы он выводил все записи выборки:

3
4
5
6
7
8
9
10
11
12
$db = mysqli_connect('localhost', 'root', '', 'mybase');
$query = "SELECT * FROM users";
$result = mysqli_query($db, $query);
for ($i=0; $i < mysqli_num_rows($result); $i++)
  {
  $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
  print_r($row);
  echo '<br>';
  }
mysqli_close($db);

Перемещение указателя

Для того, чтобы из результата бралась нужная запись, в нём есть указатель. Когда результат только получен, указатель находится на самой первой записи, её инднкс - 0. Функции, которые выводят записи, сдвигают указатель на следующую запись и таким образом указатель доходит до конца выборки. Есть возможность переместить указатель на какую-то строку результата для работы с ней. Для этого применяется функция mysqli_data_seek(). Она перемещает указатель на любую запись независимо от того, где он находится в данный момент.

mysqli_data_seek (результат, позиця)

Параметры:

результат - результат выборки

позиция - позиция в результате, на которую нужно переместить указатель

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

12
mysqli_data_seek($result, 0);

Получение всего результата

Функция mysqli_fetch_all() возвращает двухмерный массив, содержащий все записи, начиная от указателя и до конца результата. Если с результатом ещё не производилось никаких действий, получается вся выборка. Эта функция работает начиная с версии PHP 5.3.

mysqli_fetch_all (результат, тип массива)

Параметры:

результат - результат выборки

тип массива - тип массива, который возвращает функция. Принимает значения: MYSQLI_NUM, MYSQLI_ASSOC, MYSQLI_BOTH. По умолчанию установлено значение MYSQLI_NUM.

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

Если указатель в результате уже был перемещён, то его нужно установить на нужной записи перед запуском функции mysqli_fetch_all(). В нашем примере это уже сделано. Выведем результат при помощи этой функии:

13
14
$all = mysqli_fetch_all($result);
print_r($all);