Глава 19
Если запрос возвращает результирующую выборку, то тут уже создается новый объект -
if($result = $mysqli->query("SELECT name FROM cities LIMIT 10"))
экземпляр класса mysqli_result.
printf(" результат запроса - %d строк, \n", $result->num_rows);
В приведенном примере используется и свойство num_rows класса mysqli_result, значение
которого - число строк в результирующей выборке.
Метод fetch_row() позволяет получить результат в виде численно-индексированного
массива.
Объектно ориентированный код запроса данных из базы:
<?php
if ($result = mysqli->query($query))
{
При каждом проходе цикла while массиву $row будут присваиваться новые значения,
так что после выхода из цила в нем останется только последний - пятый - набор значений.
Как вы уже видели класс mysqli_result описывает объекты, являющиеся результатами
$row = $result->fetch_array(MYSQLI_ASSOC);
запроса к БД. Его метод fetch_array() представляет строку результирующей выборки в виде
ассоциативного или численно-индексированного массива. Тип массива определяется тем,
какая из определенных в этом классе констант указывается в качестве параметра метода:
MYSQLI_ASSOC, MYSQLI_NUM или MYSQLI_BOTH. Эти константы определены как константы класса
- в соответствии с объекной моделью PHP5.
printf("%s(%s)\n", $row["name"]);
Есть методы, которые возвращают результат запроса в виде объекта - fetch_object(),
$result->close();
и в виде только ассоциативного массива - fetch_assoc(). Кроме того есть методы,
предоставляющие информацию о результатах запроса - число строк, имена столбцов и тд.
Есть метод, очищающий память сервера от результата запроса:
Класс mysql_stmt предназначен для создания подготовленных выражений. Представьте себе,
что на сайте нужно выводить результаты запросов к базе. Запросы обычно формируются
сложные, требующие выборки данных из нескольких таблиц. Значения выбираемых полей
разные, а структура запросов - одинаковая. Хочется сформировать запросы раз и навсегда,
отправить их на сервер, а потом только отправлять запрашиваемые значения полей с
указанием вставить эти значения в сформированные запросы. Вот это и есть суть того, что
называется подготовленными запросами.
Есть для их создания и процедурный интерфейс, но едва ли он будет широко применяться.
Рассмотрим пример подготовленных запросов с заданными параметрами. Создадим
$name = 'Portugal';
ВЕБ-страницу, используемую сотрудниками для пополнения БД в случае, когда надо добавить
инф о некоторых странах в таб с именем countries. На такой странице сотрудник должен
ввести название и описание страны. Допустим, что для этого есть форма, куда и вводятся
нужные значения. Они передаются в сценарий, где становятся значениями переменных:
$description = 'The country is near Atlantic ocean';
Подключимся к серверу:
$mysqli = new mysqli('localhost', 'root', 'secret', 'firma');
if (mysqli_connect_errno()) {
exit();
Метод prepare() класса mysqli позволяет создать подготовленное выражение:
$stmt = $mysqli->prepare("INSERT INTO countries VALUES (?, ?)");
В команде INSERT вместо значений столбцов, добавляемых в таблицу, стоят знаки вопроса.
Они являются шаблонами, которые при отправке запроса заполняются реальными значениями,
вопросительные знаки как клеточки в кроссвордах - их надо заполнить.
В результате работы метода prepare() мы получаем объект $stmt класса mysqli_stmt. Метод
$stmt->bind_param('ss', $name, $description);
bind_param() этого класса позволяет указать имена переменных, чьи значения заполнят
шаблоны:
Обратите внимание на то, что первым параметром метода 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 сработала. Запрос был послан на сервер,
там обработан, и возвращен был результат - ответ на запрос. Можно было вывести
его в виде таблицы, как в предыдущем примере с автомобилями.
Далее нас ждут новые горизонты - разработка сайта электронной коммерции!
С использованием вышеописанной техники работы с БД.
Назад |
Начало урока |
Вверх |
Вперед
Содержание