Php: работа с бд mysql

Содержание:

Установка и использование

На нашем интенсиве мы будем работать с версией 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
Класс Описание
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 и приступим к изучению его интерфейса.

Чтобы вам было проще с ним освоится, сделайте следующие практические задачи:

  1. Создайте базу данных test.
  2. В ней создайте таблицу users.
  3. В этой таблице сделайте 4 поля (столбца):
  4. id (для него нужно поставить галочку AUTO_INCREMENT или A.I.), тип integer,
  5. name, тип varchar, 32 символа,
  6. age, тип integer,
  7. birthday (англ. день рождения), тип date.
  8. Найдите вкладку ‘вставить’ и с ее помощью вставьте несколько строк в эту таблицу При этом поле id заполнять не нужно! Оно заполнится автоматически!
  9. Поредактируйте какую-нибудь запись.
  10. Удалите какую-нибудь запись.
  11. Поменяйте кодировку для таблицы и для всей базы данных (на utf8_general_ci).
  12. Переименуйте таблицу.
  13. Переименуйте базу данных.

Должен ли я использовать 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-инъекции.

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

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

Adblock
detector