Назад | Начало урока | Вперед
Содержание

Глава 19

Класс mysqli_result

Если запрос возвращает результирующую выборку, то тут уже создается новый объект -
экземпляр класса mysqli_result.

if($result = $mysqli->query("SELECT name FROM cities LIMIT 10"))
printf(" результат запроса - %d строк, \n", $result->num_rows);

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

Метод fetch_row() позволяет получить результат в виде численно-индексированного
массива.
Объектно ориентированный код запроса данных из базы:
<?php

$query = "SELECT name, description FROM cities LIMIT 5";
if ($result = mysqli->query($query)) {
while ($row = $result->fetch_row()) {
printf ("%s (%s)\n", $row[0], $row[1]);
}
}
?>

При каждом проходе цикла while массиву $row будут присваиваться новые значения,
так что после выхода из цила в нем останется только последний - пятый - набор значений.

Как вы уже видели класс mysqli_result описывает объекты, являющиеся результатами
запроса к БД. Его метод fetch_array() представляет строку результирующей выборки в виде
ассоциативного или численно-индексированного массива. Тип массива определяется тем,
какая из определенных в этом классе констант указывается в качестве параметра метода:
MYSQLI_ASSOC, MYSQLI_NUM или MYSQLI_BOTH. Эти константы определены как константы класса
- в соответствии с объекной моделью PHP5.

$row = $result->fetch_array(MYSQLI_ASSOC);
printf("%s(%s)\n", $row["name"]);

Есть методы, которые возвращают результат запроса в виде объекта - fetch_object(),
и в виде только ассоциативного массива - fetch_assoc(). Кроме того есть методы,
предоставляющие информацию о результатах запроса - число строк, имена столбцов и тд.
Есть метод, очищающий память сервера от результата запроса:

$result->close();

Класс mysql_stmt

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

Есть для их создания и процедурный интерфейс, но едва ли он будет широко применяться.

Рассмотрим пример подготовленных запросов с заданными параметрами. Создадим
ВЕБ-страницу, используемую сотрудниками для пополнения БД в случае, когда надо добавить
инф о некоторых странах в таб с именем countries. На такой странице сотрудник должен
ввести название и описание страны. Допустим, что для этого есть форма, куда и вводятся
нужные значения. Они передаются в сценарий, где становятся значениями переменных:

$name = 'Portugal';
$description = 'The country is near Atlantic ocean';

Подключимся к серверу:

$mysqli = new mysqli('localhost', 'root', 'secret', 'firma');
if (mysqli_connect_errno()) {

printf("Подключение невозможно: %s\n", mysqli_connect_error());
exit();
}

Метод prepare() класса mysqli позволяет создать подготовленное выражение:

$stmt = $mysqli->prepare("INSERT INTO countries VALUES (?, ?)");

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

В результате работы метода prepare() мы получаем объект $stmt класса mysqli_stmt. Метод
bind_param() этого класса позволяет указать имена переменных, чьи значения заполнят
шаблоны:

$stmt->bind_param('ss', $name, $description);

Обратите внимание на то, что первым параметром метода bind_param() является короткая
строка. Это строка формата, используемая для определения того, как объявленные
параметры должны быть интерпретированы. В данном случае эта строка указывает, что оба
требуемых параметра должны быть строковыми. Допустимые типы, используемые в качестве
первого параметра функции перечислены в таб 19.1

I - тип int, d - типы double и float, s - тип string, b - тип BLOB.

Теперь надо выполнить подготовленное выражение:

$stmt->execute();
printf("%d Row inserted.\n", $stmt->affected_rows);

Закрытие соединения и выражения:

$stmt->close();
$mysqli->close();

Ниже приведен этот сценарий целиком.
Листинг 19.3 Запрос с использованием подготовленного выражения.


<?php
$mysqli = new mysqli('localhost', 'root', 'secret', 'firma');
if (mysqli_connect_errno()) {
printf("Подключение невозможно: %s\n", mysqli_connect_error());
exit();
}
$stmt = $mysqli->prepare("INSERT INTO countries VALUES (?, ?)");
$stmt->bind_param('ss', $name, $description);
$name = 'Portugal';
$description = 'The country is near Atlantic ocean';
$stmt->execute();
printf("%d Row inserted.\n", $stmt->affected_rows);
$stmt->close();
$mysqli->close();
?>

Но запросы часто возвращают результат, к которому надо получить доступ, а для этого
надо назначить результату имя. Если пользоваться подготовленными выражениями, то тут
следует создавать так называемые подготовленные выражения с объявленными результатами.

Сформировав с помощью метода prepare() запрос, мы запускаем его на исполнение методом
execute() класса, а вот те результаты, которые вернет нам запрос, должны представлять
собой данные из двух столбцлв - name и description. Назовем их $col1 и $col2 и вызовем
метод bind_result(), способный привязать имена этих столбцов к нашему результату выборки.


<?php
$mysqli = new mysqli('localhost', 'root', 'secret', 'firma');
if (mysqli_connect_errno()) {
printf("Подключение невозможно: %s\n", mysqli_connect_error());
exit();
}
if($stmt = $mysqli->prepare("SELECT NAME, description FROM countries ORDER BY name LIMIT 5"))
{
$stmt->execute();
$stmt->bind_result($col1,$col2);
//Теперь применим метод fetch() для выборки результата
while($stmt->fetch()) {
printf("%s,%s\n", $col1,$col2);
}
}
/* Закрытие соединения и выражения*/
$stmt->close();
$mysqli->close();
?>

Результат:

France,country description
Portugal,The country is near Atlantic ocean
Russia,country description

Как видим из здесь связка PHP, Apach, MySQL сработала. Запрос был послан на сервер,
там обработан, и возвращен был результат - ответ на запрос. Можно было вывести
его в виде таблицы, как в предыдущем примере с автомобилями.

Далее нас ждут новые горизонты - разработка сайта электронной коммерции!
С использованием вышеописанной техники работы с БД.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz