Php: работа с бд mysql
Содержание:
- Установка и использование
- Что?
- Как работает HTTP, и зачем нам это знать
- Что такое реляционная база данных
- PDO Выбрать данные (+ подготовленные инструкции)
- Объектно-ориентированный интерфейс mysqli
- Примеры работы с библиотекой
- Функция mysqli connect: соединение с MySQL
- Работа с заголовками в PHP
- Подключение к базе данных MySQL
- Выбор кодировки
- Почему стоит использовать PDO
- Задачи на PhpMyAdmin
- Должен ли я использовать mysqli или PDO?
- Тестовая база данных с таблицей
- Подготовленные и прямые запросы
- Что такое placeholders (заполнители)?
Установка и использование
На нашем интенсиве мы будем работать с версией PHP 7.1
Где скачать PHP?
Мы рекомендуем использовать программную сборку OpenServer. После загрузки и установки на вашем компьютере появятся свежая версия PHP, веб-сервер, база данных, и много других программ и инструментов для удобной работы. Подробнее об установке и использовании мы рассказываем на первой лекции.
Как выглядит PHP-сценарий
Типичный PHP-сценарий — это набор выражений. Каждое выражение начинается с новой строчки и заканчивается точкой с запятой.
Выражение — это инструкция, которая приказывает PHP-интерпретатору выполнить одно действие, например, сложить два числа или вывести на экран информацию. Давайте посмотрим на самый простой сценарий. Он будет выводить на экран одну строку: «Привет, Мир!»:
Важно отметить, что любой PHP-сценарий обязательно начинается с такой строки: — так мы сообщаем веб-серверу, что дальше в файле находится код на языке PHP. В нашем примере сценарий состоит из всего одной инструкции:
В нашем примере сценарий состоит из всего одной инструкции:
Здесь мы просим функцию вывести на экран наш текст — «Привет, Мир!». Это можно рассматривать как подлежащее и сказуемое в русском языке, где функция — это сказуемое, а «Привет, Мир!» — подлежащее.
Как мы уже знаем, PHP можно встроить в статичные HTML-файлы и модифицировать их с помощью инструкций. Вот как будет выглядеть тот же пример с выводом текста, но расположенный внутри HTML:
Обратите внимание, что в этом примере мы использовали дополнительный фрагмент —. С его помощью мы сообщаем серверу, где заканчивается наш PHP-сценарий
В случае, если наш код последний в документе, и после него ничего не следует, этот фрагмент не обязателен.
Потренироваться вставлять код на PHP в разметку можно в этом задании.
Что?
Для соединения с базой данных MySQL имеется три разных API:
- – MySQL Improved (улучшенная)
- – PHP Data Objects (объекты данных PHP)
Традиционный API хорошо выполняет свою работу и получил широкое распространение благодаря тому, что делает процесс получения записей из базы данных очень простым. Например:
/* * Демонстрация старого способа работы с базой данных MySQL */ # Соединение mysql_connect('localhost', 'username', 'password') or die('Could not connect: ' . mysql_error()); # Выбор базы данных mysql_select_db('someDatabase') or die('Не могу выбрать базу данных'); # Выполнение запроса $query = "SELECT * from someTable"; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); # Фильтрация строк и вывод нужной информации while ($row = mysql_fetch_object($result)) { echo $row->name; }
Да, приведенный пример очень прост. Но у него есть существенные недостатки:
- Устарел: хотя официально его не признают устаревшим, но для новых приложений и обучения лучше использовать другие API.
- Очистка: процесс очистки ввода пользователя от ненужного кода ложится на плечи разработчика.
- Гибкость: данный API не гибкий и работает только с базой данных MySQL. А если нужно перейти на другую?
PDO (PHP Data Objects) предоставляет более мощный инструмент для использования. Не нужно думать о драйвере базы данных, можно использовать подготовленные выражения, исключаются инъекции кода SQL.
Как работает HTTP, и зачем нам это знать
Программировать на PHP можно и без знания протокола HTTP, но есть ряд ситуаций, когда для решения задач нужно знать, как именно работает веб-сервер. Ведь PHP — это, в первую очередь, серверный язык программирования.
Протокол HTTP очень прост и состоит, по сути, из двух частей:
- Заголовков запроса/ответа;
- Тела запроса/ответа.
Сначала идёт список заголовков, затем пустая строка, а затем (если есть) тело запроса/ответа.
И клиент, и сервер могут посылать друг другу заголовки и тело ответа, но в случае с клиентом доступные заголовки будут одни, а с сервером — другие. Рассмотрим пошагово, как будет выглядеть работа по протоколу HTTP в случае, когда пользователь хочет загрузить главную страницу социальной сети «Вконтакте».
1. Браузер пользователя устанавливает соединение с сервером vk.com и отправляет следующий запрос:
GET / HTTP/1.1 Host: vk.com
2. Сервер принимает запрос и отправляет ответ:
3. Браузер принимает ответ и показывает готовую страницу
Больше всего нам интересен самый первый шаг, где браузер инициирует запрос к серверу vk.com
Рассмотрим подробнее, что там происходит. Первая строка запроса определяет несколько важных параметров, а именно:
- Метод, которым будет запрошен контент;
- Адрес страницы;
- Версию протокола.
— это метод (глагол), который мы применяем для доступа к указанной странице. является самым часто используемым методом, потому что он говорит серверу о том, что клиент всего лишь хочет прочитать указанный документ. Но помимо есть и другие методы, один из них мы рассмотрим уже в следующем разделе.
После метода идет указание на адрес страницы — URI (универсальный идентификатор ресурса). В нашем случае мы запрашиваем главную страницу сайта, поэтому используется просто слэш — .
Последним в этой строке идет версия протокола и почти всегда это будет
После строки с указанием основных параметров всегда следует перечисление заголовков, которые передают серверу дополнительную полезную информацию: название и версию браузера, язык, кодировку, параметры кэширования и так далее.
Среди всех этих заголовков, которые передаются при каждом запросе, есть один обязательный и самый важный — это заголовок . Он определяет адрес домена, который запрашивает браузер клиента.
Сервер, получив запрос, ищет у себя сайт с доменом из заголовка , а также указанную страницу.
Если запрошенный сайт и страница найдены, клиенту отправляется ответ:
Такой ответ означает, что всё хорошо, документ найден и будет отправлен клиенту. Если говорить более обобщённо, стартовая строка ответа имеет следующую структуру:
Больше всего здесь интересен именно код состояния, он же код ответа сервера.
В этом примере код ответа — 200, что означает: сервер работает, документ найден и будет передан клиенту. Но не всегда всё идет гладко.
Например, запрошенный документ может отсутствовать или сервер будет перегружен, в таком случае клиент не получит контент, а код ответа будет отличным от 200.
- 404 — если сервер доступен, но запрошённый документ не найден;
- 503 — если сервер не может обрабатывать запросы по техническим причинам.
Спецификация HTTP 1.1 определяет 40 различных кодов HTTP.
После стартовой строки следуют заголовки, а затем тело ответа.
Что такое реляционная база данных
Реляционная база данных – это база данных основанная на реляционной модели (от англ. relationship — отношение, связь) выражаясь по другому, это некий набор данных с определёнными связями между ними. Обычно такие базы организованны в виде таблиц. В отдельных таблицах хранится сгруппированная по определённому смыслу информация о какой-либо сущности, например данные о покупателях (сущность — покупатель) или данные о товарах (сущность — товар) и т.д. Каждый столбец таблицы отвечает за хранение одного свойства сущности, внутри ячейки хранится значение свойства сущности, например столбец — цена, значение — 1000.
Отношения между таблицами в БД
Для работы с реляционными базами данных существует множество инструментов, они позволяют «вытаскивать» из БД различные наборы данных, даже более сложные чем в приведённом примере, при этом, структура таблиц не требует реорганизации.
PDO Выбрать данные (+ подготовленные инструкции)
В следующем примере используются подготовленные операторы.
Он выбирает идентификатор, «Имя» и «Фамилию» из таблицы «Мои Гости» и отображает его в таблице HTML:
Пример PDO
<?php
echo «<table style=’border: solid 1px black;’>»;
echo «<tr><th>id</th><th>Имя</th><th>Фамилия</th></tr>»;
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return «<td style=’width:150px;border:1px solid black;’>» . parent::current(). «</td>»;
}
function beginChildren() {
echo «<tr>»;
}
function endChildren() {
echo «</tr>» . «\n»;
}}
// Подключение к MySQL
$servername = «localhost»; // локалхост
$username = «root»; // имя пользователя
$password = «»; // пароль если существует
$dbname = «myDBPDO»; // база данных
// Создание соединения и исключения
try {
$conn = new PDO(«mysql:host=$servername;dbname=$dbname», $username, $password);
// Установить режим ошибки PDO в исключение
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Выбрать данные
$stmt = $conn->prepare(«SELECT id, firstname, lastname FROM MyGuests»);
$stmt->execute();
// Установить результирующий массив в ассоциативный
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}}
catch(PDOException $e) {
echo «Ошибка: » . $e->getMessage();}
// Закрыть подключение
$conn = null;
echo «</table>»;?>
Объектно-ориентированный интерфейс mysqli
В представленном выше примере мы использовали процедурный стиль программирования с использованием расширения mysqli. Однако, одним из главных его преимуществ является то, что он поддерживает объекты, которые позволяют легко сгруппировать функции по цели их применения. В следующей таблице представлены все объекты расширения mysqli:
Класс | Описание |
---|---|
mysqli | Представляет связь между PHP и базой данных MySQL |
mysqli_driver | Позволяет выполнять остановку-запуск встроенного сервера |
mysqli_result | Представляет результирующий набор, полученный из запроса в базу данных |
mysqli_sql_exception | Специальный класс исключений mysqli |
Эти классы содержат огромное количество свойств и методов которые вы можете изучить по приведенной ссылке — MySQLi Summary. Я же перепишу предыдущий пример с выводом таблиц в объектно-ориентированном стиле (немного усложним этот пример и выведем данные таблиц):
Файл connect.php
Исходный файл
В результате получим полную структуру базы данных users:
Примеры работы с библиотекой
// Предположим, что установили библиотеку через composer require './vendor/autoload.php'; // Алиас для краткости use Krugozor\Database\Mysql\Mysql as Mysql; // Подключение к СУБД, выбор кодировки и базы данных. $db = Mysql::create('localhost', 'root', '') ->setCharset('utf8') ->setDatabaseName('test');
// Создаем таблицу пользователей с полями: // Первичный ключ, имя пользователя, возраст, адрес $db->query(' CREATE TABLE IF NOT EXISTS users( id int unsigned not null primary key auto_increment, name varchar(255), age tinyint, adress varchar(255) ) ');
Примеры для понимания сути заполнителей
Различные варианты INSERT:
Простая вставка данных через заполнители разных типов:
$db->query("INSERT INTO `users` VALUES (?n, '?s', ?i, '?s')", null, 'Иоанн Грозный', '54', 'в палатах');
SQL-запрос после преобразования шаблона:
INSERT INTO `users` VALUES (NULL, 'Иоанн Грозный', 54, 'в палатах')
Вставка значений через заполнитель ассоциативного множества типа string:
$user = array('name' => 'Пётр', 'age' => '30', 'adress' => "ООО 'Рога и Копыта'"); $db->query('INSERT INTO `users` SET ?As', $user);
SQL-запрос после преобразования шаблона:
INSERT INTO `users` SET `name` = "Пётр", `age` = "30", `adress` = "ООО \'Рога и Копыта\'"
$user = array('name' => "Д'Артаньян", 'age' => '19', 'adress' => 'замок Кастельмор'); $db->query('INSERT INTO `users` SET ?A', $user);
SQL-запрос после преобразования шаблона:
INSERT INTO `users` SET `name` = "Д\'Артаньян",`age` = 19,`adress` = "замок Кастельмор"
Различные варианты SELECT
Укажем некорректный числовой параметр — значение типа double:
$db->query('SELECT * FROM `users` WHERE `id` = ?i', '1.00');
SQL-запрос после преобразования шаблона:
SELECT * FROM `users` WHERE `id` = 1
—
$db->query( 'SELECT id, adress FROM `users` WHERE `name` IN (?a)', array('Василий', 'Иван', "Д'Артаньян") );
SQL-запрос после преобразования шаблона:
SELECT id, adress FROM `users` WHERE `name` IN ("Василий", "Иван", "Д\'Артаньян")
$db->query( 'SELECT * FROM ?f WHERE ?f IN (?as) OR `id` IN (?ai)', '.users', '.users.name', array('Василий'), array('2', 3.000) );
SQL-запрос после преобразования шаблона:
SELECT * FROM .`users` WHERE .`users`.`name` IN ("Василий") OR `id` IN ("2", "3")
Некоторые возможности API
Получить все в виде ассоциативных массивов:
// Получить все... $res = $db->query('SELECT * FROM users'); // Последовательно получать в виде ассоциативных массивов while (($data = $res->fetch_assoc()) !== null) { print_r($data); }
Функция mysqli connect: соединение с MySQL
Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД.
В PHP это делается с помощью стандартной функции . Функция возвращает результат — ресурс соединения. Данный ресурс используется для всех следующих операций с MySQL.
Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:
- Адрес сервера СУБД;
- Логин;
- Пароль.
Если вы следовали стандартной процедуре установки MySQL или используете OpenServer, то адресом сервера будет , логином — . При использовании OpenServer пароль для подключения — это пустая строка ‘’, а при самостоятельной установке MySQL пароль вы задавали в одном из шагов мастера установки.
Базовый синтаксис функции :
Проверка соединения
Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.
Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвеграть новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.
Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.
Результатом выполнения функции будет значение специального типа — ресурс.
Если подключение к MySQL не удалось, то функция вместо ресурса вернет логическое значение типа «ложь» — .
Хорошей практикой будет всегда проверять значение результа выполнения этой функции и сравнивать его с ложью.
Соединение с MySQL и проверка на ошибки:
Функция просто возвращает текстовое описание последней ошибки MySQL.
Установка кодировки
Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицей, можно получить последовательность из знаков вопроса: ‘?????????????????’.
Вызови эту функцию сразу после успешной установки соединения:
Работа с заголовками в PHP
В PHP есть все возможности для взаимодействия с протоколом HTTP:
- Получение тела запроса;
- Получение заголовков запроса;
- Добавление/изменение заголовков ответа;
- Управление телом ответа.
Разберём всё по порядку.
Получение тела запроса
Тело запроса — это информация, которую передал браузер при запросе страницы.
Но тело запроса присутствует только если браузер запросил страницу методом .
Дело в том, что — это метод, специально предназначенный для отправки данных на сайт. Чаще всего метод браузер задействует в момент отправки формы. В этом случае телом запроса будет содержимое формы.
В PHP-сценарии все данные отправленной формы будут доступны в специальном массиве . Более подробно об этом написано в следующей главе, посвящённой формам.
Получение заголовков запроса
Напомним ещё раз, что заголовки запроса — это мета-информация, отправленная браузером при запросе сценария.
PHP автоматически извлекает такие заголовки и помещает их в специальный массив — .
Стоит отметить, что в этом массиве, помимо заголовков, есть и другая информация. Значения заголовков запроса находятся под ключами, которые начинаются с . Подробно всё содержимое этого массива описано в официальной документации.
Пример, как получить предыдущую страницу, с которой перешёл пользователь:
Добавление/изменение заголовков ответа
В PHP-сценарии можно управлять всеми заголовками ответа, которые попадут к пользователю вместе с контентом страницы. Это возможно, потому что PHP работает на стороне веб-сервера и имеет с ним очень тесную интеграцию.
Вот примеры сценариев, когда пригодится управление заголовками ответа:
- Кэширование;
- Переадресация пользователя;
- Установка cookies;
- Отправка файлов;
- Передача дополнительной информации браузеру.
Заголовки ответа нужны для выполнения множества важных задач.
В PHP есть функция для отправки или смены заголовков: .
Она принимает имя и значение заголовка и добавляет его в список из всех заголовков, которые уйдут в браузер пользователя после окончания работы сценария.
Например, так выполняется перенаправление пользователя на другую страницу:
За переадресацию отвечает заголовок с именем , а через двоеточие задаётся значение — адрес страницы для перехода.
Важное замечание по использованию заголовков
Есть одно ограничение: заголовки нельзя отправлять, если пользователю к этому моменту уже отправили любой контент. То есть, если показать что-то на экране, например, через функцию , то после этого заголовки поменять уже не получится
Управление телом ответа
Всё, что PHP выводит на экран, является содержимым ответа. Иными словами, вызовы функций , или показ текста через шорт-теги являются телом ответа, которое попадает в браузер пользователю.
Подключение к базе данных MySQL
Сначала нужно сообщить вашему PHP-сценарию, как нужно подключиться к базе данных. Этот процесс, по сути, сообщает PHP, что нужно делать то же самое, что вы выполняли, начиная работу со своим клиентом командной строки MySQL. Чтобы подключиться к базе данных, PHP нужно будет передать следующую информацию: имя хоста вашей базы данных, имя пользователя, пароль и имя базы данных.
Запустите свой текстовый редактор и создайте новый сценарий, назвав его connect.php. Сценарий должен быть как можно проще, потому что вам нужно всего лишь подключиться к своей базе данных, воспользоваться с помощью команды USE необходимой базой данных и запустить пробный SQL-запрос, чтобы убедиться, что все работает. Введите в сценарий следующие строки:
Файл connect.php
Если база данных запускается на той же машине, на которой находятся PHP и файлы обслуживания сети, хост-именем базы данных будет, как правило, localhost, которое означает «локальная машина». После создания этого файла его удобно будет подключать на страницах сайта:
Файл index.php
Вот так все просто! И хотя здесь есть несколько новых для вас команд, вы, наверное, уже знаете почти все, что происходит в этом сценарии. Сначала в нем используется новая команда: mysqli_connect. Она просто получает имя хоста базы данных, имя пользователя, пароль, имя базы данных и осуществляет подключение. Происходит все то же самое, как и при запуске окна командной строки mysql и подключении к удаленной базе данных. В случае успешного выполнения этой команды она возвращает ресурс, содержащий ссылку на подключение к базе данных; если установить подключение не удалось функция mysqli_connect() возвращает значение false — мы проверяем это в условном операторе и, если соединения нет, прекращаем дальнейшее выполнение сценариев и выводим сообщение об ошибке.
Функция mysqli_connect_errno() возвращает код ошибки, а mysqli_connect_error() — текст ошибки. Если инструкция mysqli_connect сумела создать подключение без всяких проблем, она возвращает это подключение, PHP пропустит строку с инструкцией die, а затем выведет строку «Вы подключились к MySQL!».
Выбор кодировки
Довольно часто встречается ситуация, когда сайт создается в одной кодировке, а база данных использует другую, например в базе данных установлена кодировка utf8_general_ci, а на сайте — utf8. Получается, что содержимое (в том числе и навигация сайта выводится в кодировке utf8, а информация из базы данных — в utf8_general_ci). В результате одновременно прочитать вывод из базы данных и страницу сайта не удастся, кодировки-то разные. В качестве примера добавьте к исходной странице следующий сценарий (все дополнительные функции которые здесь используются будут описаны ниже):
Код PHP
В моем случае вывод окажется следующем:
В этом случае нужно установить требуемую кодировку для базы данных. Это можно сделать с помощью следующего запроса, который должен быть первым запросом после подключения к базе данных (измените файл connect.php):
Код PHP
В результате будет получен корректный вывод данных:
Почему стоит использовать PDO
Функции в PHP для работы с БД давно уже устарели, на сегодняшний день желательно использовать или (PHP Data Objects). Кроме того, — эта библиотека, которая по большому счёту, не предназначена для использования напрямую в коде. Она может послужить хорошим строительным материалом для создания библиотеки более высокого уровня. При работе с следует также помнить об обеспечении безопасности вашего приложения, в частности о защите от SQL-инъекций. В случае использования PDO (с его подготовленными запросами), такая защита идёт уже «из коробки», главное правильно применить необходимые методы.
Задачи на PhpMyAdmin
Давайте откроем PhpMyAdmin и приступим к изучению его интерфейса.
Чтобы вам было проще с ним освоится, сделайте следующие практические задачи:
- Создайте базу данных test.
- В ней создайте таблицу users.
- В этой таблице сделайте 4 поля (столбца):
- id (для него нужно поставить галочку AUTO_INCREMENT или A.I.), тип integer,
- name, тип varchar, 32 символа,
- age, тип integer,
- birthday (англ. день рождения), тип date.
- Найдите вкладку ‘вставить’ и с ее помощью вставьте несколько строк в эту таблицу При этом поле id заполнять не нужно! Оно заполнится автоматически!
- Поредактируйте какую-нибудь запись.
- Удалите какую-нибудь запись.
- Поменяйте кодировку для таблицы и для всей базы данных (на utf8_general_ci).
- Переименуйте таблицу.
- Переименуйте базу данных.
Должен ли я использовать mysqli или PDO?
Если вам нужен короткий ответ, это будет «все, что вам нравится».
Оба mysqli и PDO имеют свои преимущества:
PDO будет работать на 12 различных системах баз данных, в то время как mysqli будет работать только с базами данных MySQL.
Таким образом, если вам нужно переключить ваш проект на использование другой базы данных, PDO делает процесс легким. Необходимо только изменить строку подключения и несколько запросов. С mysqli вам потребуется переписать все включенные в код запросы.
Оба являются объектно-ориентированными, но mysqli также предлагает процедурный API.
Оба поддерживают подготовленные заявления. Подготовленные операторы защищают от внедрения SQL и очень важны для безопасности веб-приложений.
Тестовая база данных с таблицей
// Из консоли Windows mysql> CREATE DATABASE `pdo-test` CHARACTER SET utf8 COLLATE utf8_general_ci; USE pdo-test; CREATE TABLE categories ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), name VARCHAR(255) NOT NULL ); INSERT INTO `categories` (`name`) VALUES ('Ноутбуки и планшеты'), ('Компьютеры и периферия'), ('Комплектующие для ПК'), ('Смартфоны и смарт-часы'), ('Телевизоры и медиа'), ('Игры и приставки'), ('Аудиотехника'), ('Фото-видеоаппаратура'), ('Офисная техника и мебель'), ('Сетевое оборудование'), ('Крупная бытовая техника'), ('Товары для кухни'), ('Красота и здоровье'), ('Товары для дома'), ('Инструменты'), ('Автотовары');
Подготовленные и прямые запросы
В PDO два способа выполнения запросов:
- — состоит из одного шага;
- — состоит из двух шагов.
Прямые запросы
- используется для операторов, которые не вносят изменения, например . Возвращает объект , из которого с помощью методов или извлекаются результаты запроса. Можно его сравнить с , который возвращала .
- используется для операторов . Возвращает число обработанных запросом строк.
Прямые запросы используются только в том случае, если в запросе отсутствуют переменные и есть уверенность, что запрос безопасен и правильно экранирован.
$stmt = $db->query("SELECT * FROM categories"); while ($row = $stmt->fetch()) { echo '<pre>'; print_r($row); }
Подготовленные запросы
Если же в запрос передаётся хотя бы одна переменная, то этот запрос в обязательном порядке должен выполняться только через . Что это значит? Это обычный SQL запрос, в котором вместо переменной ставится специальный маркер — плейсхолдер. PDO поддерживает позиционные плейсхолдеры (), для которых важен порядок передаваемых переменных, и именованные (), для которых порядок не важен. Примеры:
$sql = "SELECT name FROM categories WHERE id = ?"; $sql = "SELECT name FROM categories WHERE name = :name";
Чтобы выполнить такой запрос, сначала его надо подготовить с помощью метода . Она также возвращает , но ещё без данных. Чтобы их получить, надо исполнить этот запрос, предварительно передав в него наши переменные. Передать можно двумя способами: Чаще всего можно просто выполнить метод , передав ему массив с переменными:
$stmt = $pdo->prepare("SELECT `name` FROM categories WHERE `id` = ?"); $stmt->execute(); $stmt = $pdo->prepare("SELECT `name` FROM categories WHERE `name` = :name"); $stmt->execute();
Как видно, в случае именованных плейсхолдеров в должен передаваться массив, в котором ключи должны совпадать с именами плейсхолдеров. После этого можно извлечь результаты запроса:
$id = 1; $stmt = $db->prepare("SELECT * FROM categories WHERE `id` = ?"); $stmt->execute(); $category = $stmt->fetch(PDO::FETCH_LAZY); echo '<pre>'; print_r($category);
Что такое placeholders (заполнители)?
Placeholders (англ. — заполнители) — специальные типизированные маркеры, которые пишутся в строке SQL запроса вместо явных значений (параметров запроса). А сами значения передаются «позже», в качестве последующих аргументов основного метода, выполняющего SQL-запрос:
<?php // Предположим, что установили библиотеку через composer require './vendor/autoload.php'; // Алиас для краткости use Krugozor\Database\Mysql\Mysql as Mysql; // Соединение с СУБД и получение объекта-"обертки" над "родным" mysqli $db = Mysql::create("localhost", "root", "password") // Выбор базы данных ->setDatabaseName("test") // Выбор кодировки ->setCharset("utf8"); // Получение объекта результата Statement // Statement - "обертка" над "родным" объектом mysqli_result $result = $db->query("SELECT * FROM `users` WHERE `name` = '?s' AND `age` = ?i", "Василий", 30); // Получаем данные (в виде ассоциативного массива, например) $data = $result->fetch_assoc(); // Не работает запрос? Не проблема - выведите его на печать: echo $db->getQueryString();
Параметры SQL-запроса, прошедшие через систему placeholders, обрабатываются специальными функциями экранирования, в зависимости от типа заполнителей. Т.е. вам теперь нет необходимости заключать переменные в функции экранирования типа или приводить их к числовому типу, как это было раньше:
<?php // Раньше перед каждым запросом в СУБД мы делали // примерно это (а многие и до сих пор `это` не делают): $id = (int) $_POST; $value = mysql_real_escape_string($_POST, $link); $result = mysql_query("SELECT * FROM `t` WHERE `f1` = '$value' AND `f2` = $id", $link);
Теперь запросы стало писать легко, быстро, а главное библиотека Database полностью предотвращает любые возможные SQL-инъекции.