Введение в PDO


Содержание материала:

Урок — Знакомство с PDO.

↑ PHP5, PDO — PHP Data Objects
Урок — Знакомство с PDO.
Текущий урок — первый. Следующий урок →

Введение в PHP PDO

PHP Data Objects (PDO) — это расширение для PHP, предоставляющее разработчику простой и универсальный интерфейс для доступа к различным базам данных.

PDO входит в состав PHP с версии 5.1, и поставлялось как PECL-расширение для PHP с версии 5.0. В более ранних версиях PDO не работает, так как требует новых функций ядра PHP-интерпретатора.

PDO предлагает единые методы для работы с различными базами данных, хотя текст запросов может немного отличаться. Так как многие СУБД реализуют свой диалект SQL, который в той или иной мере поддерживает стандарты ANSI и ISO, то при использовании простых запросов можно добиться совместимости между различными языками. На практике это означает, что можно достаточно легко перейти на другую СУБД, при этом не меняя или частично изменяя код программы.

PDO не использует абстрактных слоёв для подключения к БД, наподобие ODBC, а использует для разных БД их «родные» драйверы, что позволяет добиться высокой производительности. В настоящее время для PDO существуют драйверы практически ко всем общеизвестным СУБД и интерфейсам. Впрочем, есть и драйвер для подключения к ODBC.

Имя драйвера Поддерживаемые СУБД
PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD Firebird / Interbase 6
PDO_IBM IBM DB2
PDO_INFORMIX IBM Informix Dynamic Server
PDO_MYSQL MySQL 3.x, MySQL 4.x, MySQL 5.x
PDO_OCI Oracle Call Interface
PDO_ODBC ODBC v3 (IBM DB2, unixODBC и win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 2 и SQLite 3
PDO_4D 4D

Каждый драйвер базы данных, который реализует интерфейс PDO может выставить специфичные для используемой базы данных характеристики в качестве расширений регулярных функций. Обратите внимание, что вы не можете исполнять любые функции для базы данных с использованием расширения PDO непосредственно, вы обязательно должны использовать специфичный для базы данных PDO драйвер для доступа к серверу базы данных.

Преимущества PDO

  • Общий интерфейс доступа к любому числу БД.
  • Скорость. PDO — Самый быстрый в работе с базами данных модуль, позволяющий работать с различными базами данных, такими как MySQL от v3, PostgreSQL, SQLite от v2, ODBC, DB2, Oracle, Firebird.
  • Безопасность. Наиболее полезная вещь — то, что с PDO повышена безопасность во избежание выполнения SQL-инъекций(SQL-Injection).
  • Обработка ошибок. Мы можем использовать механизм исключений или механизм критических ошибок.
  • Расширяемость. С mysql_*() функциями приходилось использовать базу данных mysql. Если в будущем нам понадоббится использовать другую базу данных — тогда придется переписать все наши соединения, запросы и код выдачи. Если вы используете MySQL с PDO, это не имеет значения для нас, нам придется переписать только часть кода базы данных.
  • Простота. Упрощенный интерфейс работы Базами данных.

Практика применения PHP PDO

Нет смысла говорить про PDO, если не попытаться использовать его на практике, вот мы и попытаемся.

Для работы нам потребуется установленный PDO-драйвер сервера базы данных, с которой мы хотим работать. В наших примерах мы используем драйвер mySql, то есть нам нужно, чтобы PHP был собран с указанием ключа —with-pdo-mysql. Расширение PDO компилируется по умолчанию, так что всё, что вам надо — это указать базы данных, к которым вам потребуется доступ. Кроме MySQL, существуют драйвера для PostgreSQL (—with-pdo-pgsql), Oracle (—with-pdo-oci), и так далее.

Подробная установка PDO рассматривается в следующем уроке.

Наш первый пример будет выполнять соединение с сервером MySQL под именем пользователя «user» и с паролем «psw», открывать базу данных «dbase» и сохранять соединение для дальнейшего использования.

Это всё, что нужно сделать, чтобы подключиться и приготовиться к выполнению запросов. Если вы привыкли вызывать mysql_connect() и mysql_select_db(), то вы заметите, что тут их параметры были объединены в единый «источник данных» (DSN) в стиле Pear::DB. PDO DSN состоит из нескольких пар параметр=значение, перед которыми стоит тип сервера подключаемой базы данных. В этом примере:

  • mysql — тип сервера
  • dbase — имя нужной базы данных (параметр dbname)
  • 127.0.0.1 — IP адрес сервера (параметр host)
  • root — имя пользователя
  • psw — пароль.

PDO в PHP

PDO (PHP Data Objects) — расширение для PHP, предоставляющее простой интерфейс для доступа к различным базам данных. Если говорить очень просто и коротко, при помощи PDO в PHP подключаются к базам данных разных типов.

В этом уроке мы будем подключаться к базе данных MySQL, так как это самая распространённая база данных.

Подключение к базе данных

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

Пример того, как мы можем подключиться к базе данных:

Я думаю если вы интересуетесь PDO, то ваших знаний достаточно и этот синтаксис вам объяснять не нужно.

Итак, у нас есть объект подключения для доступа к базе данных.

Обработка исключений

Когда используется PDO, то ошибки подключений советуюю ловить при помощи конструкции try<. >catch <. >. Вот пример такого кода:

Есть разные мнения, по поводу обработки ошибок, например не все советуют всегда использовать конструкцию try<. >catch <. >. Дело в том, что PHP и так выведет сообщение об ошибке на экран, так что этот код избыточен. Хотя если вы хотите например откатить транзакцию, то эта конструкция вам пригодится, но об этом ниже.

Получение данных из базы используя PDO, метод query

Для выборки из базы данных используется метод query , которому мы передаём строку запроса SQL.

Не забывайте, что для всех типов баз данных этот синтаксис сработает.

Также не забывайте про безопасность данных, передаваемых в SQL запросах. В PDO есть аналог функции mysql_real_escape_string() это метод quote .

Обработка результата, методы FETCH и FETCHALL.

Теперь нам нужно преобразовать результат из переменной $res в массив. Это делается при помощи метода FETCH , которому передаётся константа.

Очевидно, что константа FETCH_LAZY замедляет работу скрипта, поэтому её желательно не использовать.

Метод FETCH возвращает одну запись из результата. Если требуется получить все записи, нужно использовать метод FETCHALL . В дальнейшем результат, полученный в результате использования FETCHALL обрабаьываем в цикле foreach , как показано в примере:

Константа FETCH_CLASS

Особого объяснения требует константа FETCH_CLASS , она позволяет заполнить предварительно созданный класс данными из результата запроса к базе данных.

Давайте рассмотрим пример, с использованием константы FETCH_CLASS :

Не забывайте важное правило — названия свойств в созданном классе обязаны быть такими же, как и названия полей в базе данных.

Подготовленные выражения

Подготовленные выражения нужно обязательно использовать если ваш SQL запрос содержит переменные.

Подготовленные выражения PDO — основная причина использовать PHP Data Objects, поскольку это единственный безопасный способ выполнения SQL запросов, в которых есть переменные, созданные пользователем.

Подготовленные выражения в PDO — это обычный SQL запрос, в котором переменная заменяется специальным маркером — плейсхолдером.

Именнованные плейсхолдеры

Сначала давайте рассмотрим именнованный плейсхолдер, его синтаксис например такой: :email .

Давайте рассмотрим пример запроса INSERT с использованием плейсхолдеров.

В этом примере вместо переменных в запросе мы использовали два плейсхолдера (:email, :message)») .

Обратите внимание, что чтобы подготовить SQL запрос, мы пишем его в методе prepare() . Потом, чтобы указать к какому плейсхолдеру какую переменную привязать, используем метод bindParam() . Чтобы выполнить SQL запрос, мы вызываем метод execute() .

Итак, ещё раз последовательность работы с подготовленными выражениями по шагам:

  1. Присваиваем переменной $stmt результат выполнения метода prepare() .
  2. При помощи метода bindParam() мы связываем переменные и плейсхолдеры.
  3. Назначаем значения переменных.
  4. При помощи метода execute() выполняем запрос к базе данных.

Этот синтаксис можно записать

Видно, что в метод execute() должен передаваться массив, в котором ключи должны совпадать с именами плейсхолдеров.

Кстати, у метода bindParam() есть синоним bindValue() .

Неименованные плейсхолдеры

Теперь рассмотрим работу с неименованными плейсхолдерами.

В этом синтаксисе вместо записи плейсхолдера :название указывается другая форма его записи — знак вопроса 😕 .

Тут значения массива $email будут поочерёдно присвоены плейсхолдерам 😕 , но в нашем примере плейсхолдер один.

Вот другой пример применения неименованных плейсхолдеров, с использованием метода bindParam() :

Вставка в базу данных, метод exec()

Если мы хотим что-нибудь записать в базу, тогда можно также использовать метод PDO::exec() .

Если этот запрос будет выполнен, то в переменную $result попадёт количество затронутых в таблице строк.

PDO::exec() выполняет INSERT запросы, но не может получить данные из БД, этим занимается метод PDO::query() . PDO::exec() только запускает SQL запрос на выполнение и возвращает количество строк, задействованных в ходе его выполнения, он не возвращает результат выборки оператором SELECT .

Примеры использования PDO MySQL

Ниже приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и удаление данных. Подробнее о методах PDO можно узнать на php.net.

Для примеров используется таблица `category` с полями `id` , `name` и `parent` .

Подключение к серверу MySQL

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

Чтобы отследить ошибку подключения к БД используется исключение:

Выборка из БД

Выборка одной записи

PDO позволяет использовать в запросах псевдопеременные чтобы исключить SQL инъекции. В самом запросе в место данных указывается ? или :id , а в методе execute() указываются реальные значения этих переменных.

Выборка всех записей таблицы

Данный пример получает всю таблицу в виде ассоциативного массива:

Получить значение поля одной записи

Получение всех значений одного столбца таблицы


Пример получает все значения поля `name` из таблицы `category` .

PDO::__construct — Создает экземпляр PDO, предоставляющий соединение с базой данных

(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)

PDO::__construct — Создает экземпляр PDO, предоставляющий соединение с базой данных

Описание

Создает экземпляр PDO, предоставляющий подключение к необходимой базе данных.

Список параметров

Имя источника данных или DSN, содержащее информацию, необходимую для подключения к базе данных.

В общем, DSN состоит из имени драйвера PDO, за которым следует двоеточие и специфический синтаксис подключения драйвера PDO. Дополнительную информацию можно получить из раздела Документация по специфическим драйверам PDO.

Параметр dsn поддерживает три разные метода указания аргументов, необходимых для создания соединения с базой данных:

dsn содержит полный DSN.

Параметр dsn состоит из строки uri: с последующим URI, который определяет расположение файла, содержащего строку DSN. URI может указывать на локальный файл или удаленный URL.

dsn состоит из имени name , которое соответствует параметру pdo.dsn. name в php.ini , определяющему строку DSN.

Псевдоним должен быть определен в php.ini , но не в .htaccess или httpd.conf

Имя пользователя для строки DSN. Этот параметр опционален для некоторых драйверов PDO.

Пароль для строки DSN. Этот параметр опционален для некоторых драйверов PDO.

Массив специфичных для драйвера настроек подключения ключ=>значение.

Возвращаемые значения

Возвращает объект PDO в случае успеха.

Ошибки

PDO::__construct() выбрасывает исключение PDOException, если попытка соединения с необходимой базой данных не удается.

Примеры

Пример #1 Создание экземпляра PDO через вызов драйвера

/* Подключение к базе данных ODBC, используя вызов драйвера */
$dsn = ‘mysql:dbname=testdb;host=127.0.0.1’ ;
$user = ‘dbuser’ ;
$password = ‘dbpass’ ;

try <
$dbh = new PDO ( $dsn , $user , $password );
> catch ( PDOException $e ) <
echo ‘Подключение не удалось: ‘ . $e -> getMessage ();
>

Пример #2 Создание экземпляра PDO через вызов URI

В следующем примере предполагается, что файл /usr/local/dbconnect существует с правами доступа, которые позволяют PHP прочитать файл. Файл содержит PDO DSN для подключения к базе данных DB2 через драйвер PDO_ODBC:

PHP-скрипт может создать подключение к базе данных путем простой передачи параметра uri:, указывающим на на файл URI:

/* Подключение к базе данных ODBC, используя вызов драйвера */
$dsn = ‘uri:file:///usr/local/dbconnect’ ;
$user = » ;
$password = » ;

try <
$dbh = new PDO ( $dsn , $user , $password );
> catch ( PDOException $e ) <
echo ‘Подключение не удалось: ‘ . $e -> getMessage ();
>

Пример #3 Создание экземпляра PDO, используя псевдоним

В следующем примере предполагается, что php.ini содержит следующую запись, позволяющую подключение к базе данных MySQL, используя только псевдонимmydb:

/* Подключение к базе данных ODBC, используя псевдоним */
$dsn = ‘mydb’ ;
$user = » ;
$password = » ;

try <
$dbh = new PDO ( $dsn , $user , $password );
> catch ( PDOException $e ) <
echo ‘Подключение не удалось: ‘ . $e -> getMessage ();
>

До PHP 5.3, класс, наследуемый от PDO и реализующий магический метод __call, всегда получал параметр $method в нижнем регистре.

Labdes

Я думаю настало время повысить свой экспириенс, и перейти при работе с базой данных с mysql_ функций на PDO. Эта библиотека является мощным и быстрым дополнением к PHP. Одно из ее преимуществ – работа со многими базами данных (MS SQL , MySQL , PostgreSQL , Oracle и др.). Также отличительной характеристикой этой библиотеки являются подготовленные выражения, так называемые prepared statements, которые должны ускорить работу с базой, а главное сделать обмен данным безопасными и забыть о таких уязвимостях как sql-enjection. Кроме того, есть и другие очень полезные возможности. В этой статье я попытался собрать часто используемые примеры работ, по которым можно сразу понять суть работы PDO.

PDO Соединение с БД

Как только будет установлено успешное соединение с конкретным сервером базы данных, то будет возвращен объект PDO. Этот объект позволяет выполнять самые разнообразные задачи баз данных.

Если есть какие-либо ошибки подключения, то сработает механизм исключений – PDOException. Нужно всегда оборачивать операции PDO в блок try/catch. Вы можете поймать исключение, если вы хотите обрабатывать ошибки, или вы можете оставить его для глобального обработчика исключений (exception), которые вы создали с помощью set_exception_handler (). В PDO есть специальные функции для ошибок: errorCode() – вернет номер ошибки, errorInfo() – вернет массив с номером ошибки и описанием. Они нужны так как по умолчанию режим работы с ошибками стоит ERRMODE_SILENT. В этом случае чтобы увидеть эти ошибки придется их вызвать:

Чтобы этого не делать, в режиме разработке проще сразу выставить нужный режим работы с ошибками: ATTR_ERRMODE и ERRMODE_EXCEPTION. Можно также прописать кодировку работы с базой. В итоге у нас получится такой вот код подключения:

После успешного подключения к базе данных, экземпляр класса PDO возвращается в сценарий. $db содержит дескриптор базы данных. Соединение остается активным в течение всей жизни объекта PDO. Чтобы закрыть соединение, вам нужно уничтожить объект с гарантией, что все остальные ссылки на него будут удалены. Сделать это можно путем присвоения переменной, которая содержит объект, значения NULL. Если вы не сделаете этого явно, PHP будет автоматически закрывать соединение после завершения работы скрипта.

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

Теперь, когда вы увидели, как открывать и закрывать соединение, давайте рассмотрим другие примеры работы с PDO. В данном случае я собираюсь показать вам, как выполнять запросы к конкретной базе данных. Запросы можно делать 3 функциями: exec(), query() и prepare+execute.

Первый – exec вернет только кол-во задействованных строк или FALSE при ошибке и используется там, где не возвращаются данные, например при удалении:

Query()

Второй – query() вернет результат в объекте PDOStatement. Также возвращает результат или FALSE при ошибке. Ему можно доверить простые запросы. Можно использовать query() с условием (я правда не знаю зачем кому то это может понадобиться), но тогда все равно придется экранировать данные методом PDO::quote

lastInsertId() возвращает идентификатор последней вставленной строки базы данных.

Подготовленные выражения – prepared statments.

Третий способ prepare+execute — Подготовленные выражения, они же подготовленные инструкции они же плейсхолдеры они же prepared statments или связываемые переменные, позволяют определить выражение один раз, а затем многократно его выполнять с разными параметрами. Также они позволяют отделить переменные от запроса, что делает код безопаснее и повышает скорость выполнения. В вашем коде больше не надо будет пытаться очистить передаваемые данные. Мы сделаем это только один раз перед выполнением запроса к БД. Для этого используем функцию Prepare(); В качестве параметра она принимает SQL запрос, но в нем, вместо переменных используются метки, в виде знака вопроса ‘?’ или номеров ‘:1′, или переменой, имя которой начинается с двоеточия ‘:’. Если вы остановились на знаках вопроса (:цифрах), то вам надо в функцию execute передать массив значений, в соответствующей последовательности. Если ваш выбор именованные переменные, то надо назначить каждой переменной значение через одну из двух функций: либо bindValue(), которая присваивает псевдо-переменной значение, либо bindParam(), которая связывает псевдо-переменную с настоящей переменной. Третьим параметром можно указать тип переменной, например $db->bindParam(‘:id’,$id, PDO::PARAM_INT).

Еще раз напомню, что если вы не используете подготовленные выражения но все-таки хотите обезопасить передаваемые данные, то это можно сделать при помощи функции PDO:quote.

PDO SELECT данных

Для выборки данных используются методы fetch() или fetchAll(). Перед вызовом функции нужно указать PDO как Вы будете доставать данные из базы. PDO::FETCH_ASSOC вернет строки в виде ассоциативного массива с именами полей в качестве ключей. PDO::FETCH_NUM вернет строки в виде числового массива. По умолчанию выборка происходит с PDO::FETCH_BOTH, который дублирует данные как с численными так и с ассоциативными ключами, поэтому рекомендуется указать один способ, чтобы не иметь дублирующих массивов:

Либо можно указать метод выборки в самом методе ->fetch()

PDO UPDATE данных

Происходит по существу также как и INSERT и SELECT (в данном случае опять же будем использовать именованные метки (placeholders)):

DELETE Удаление происходит простейшим образом:

Конечно вы можете также использовать именованные параметры (placeholders) при удалении.

Если у вас есть свои часто используемые заготовки при работе с расширением PHP PDO, буду признателен если вы ими поделитесь. Ссылка на мануал

Если у вас возникла ошибка Undefined variable: DBH… то можете почитать как это исправить.

Google помог найти шпаргалку по PDO, может кому пригодится:

PDO. Часть 1.

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

Наверняка, многие уже слышали аббревиатуру PDO, но мало кто знает, что же это. Вот давайте сегодня об этом и поговорим.

Что такое PDO?

PDO(PHP Data Objects) — это просто интерфейс, позволяющий нам абстрагироваться от конкретной базы данных. Лучше всего показать на примере.

mysql_connect($host, $user, $pass); // MySQL
mysql_select_db($db);

pg_connect(«host=$host, dbname=$db, user=$user, password=$pass»); // PostgreSQL

В коде выше представлены способы для подключения к трём разным базам данных: MySQL, sqlite и PostgreSQL. Как видите, функции у каждой БД отличаются.

То же самое с другими действиями. Например, выборка данных из БД.

$sql = «INSERT INTO(name, pass) VALUES($name, $pass)»;

mysql_query($sql); // MySQL
sqlite_query($sql); // sqlite
pg_query($sql); // PostgreSQL

Зачем нужен PDO?

Представим, что у нас есть огромная база данных PostgreSQL, и мы решили сменить её на MySQL. Нам придётся переписывать очень много кода, и, скорее всего, без ошибок не обойдётся. Чтобы решить эту проблему и существует PDO, позволяющий нам не зависеть от конкретной базы.

Давайте рассмотрим, как мы теперь можем подключиться.

$db = new PDO(«mysql:host=$host;dbname=$db», $user, $pass); // MySQL
$db = new PDO(«sqlite:host=$host;dbname=$db», $user, $pass); // sqlite
$db = new PDO(«pgsql:host=$host;dbname=$db», $user, $pass); // PostgreSQL

Как видно из кода выше, в этих трёх подключениях меняется только строчка с названием БД, а остальное всё то же самое.

Чтобы что-нибудь выбрать, мы можем написать так:

Всё! Запрос выполнится независимо от того, какая у нас база данных.

Поддержка

PDO доступен с PHP 5.1. Чтобы мы могли «забыть», какую базу данных мы используем, за нас всё делают их драйверы. Чтобы их активировать, зайдите в файл php.ini и найдите там строчки, которые начинаются на extension=php_pdo_, а затем идёт название базы данных, и раскоментируйте их.

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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


Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 8 ):

    Теперь понятно стало. Спасибо за статью!

    А как работать с базой данных на простом текстовом файле ? Например с расширением .dat ? Как подключаться к такой базе данных ? Как делать выборку ? И так далее. И ещё :»Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.» Перехожу по ссылке : «Михаил ограничил доступ к своей странице.» Это что за такое странное приглашение добавиться .

    База данных на простом текстовом файле — это sqlite. Работать с ним через PDO точно так же, как и с MySQL. Об этом написано в статье, так что читайте внимательней. Если Вы хотите работать с обычным текстовым файлом, то Вам нужно использовать соответствующие функции. О них было написано на сайте ранее. На счёт вконтакте написано, что Вы можете добавиться в друзья и оставлять отзывы на стене страницы, а все вопросы пишите в службу тех. поддержки.

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

    http://myrusakov.ru/file-php.html Судя по вашим вопросам, Вы не совсем понимаете работу php и баз данных. Советую приобрести курс «PHP и MySQL с нуля до гуру», и тогда вопросы отпадут.

    Всё понял. Этот момент, работу с файлами я знаю. Просто может я не так изъясняюсь. Мне не просто даётся всё это, мозг не так работает, как у молодого поколения. А изучать хочется, интересно. И Вам ОГРОМНОЕ спасибо за то что Вы помогаете ! А что насчёт «В КОНТАКТЕ» ?

    Создание веб приложения на php+MySql. Введение в PDO

    В данном видеоуроке мы продолжим создавать веб приложение в связке с MySQL. Мы напишем функцию получения всех игроков при помощи PHP PDO и выведем полученные данные из БД в браузер.

    Но сначала мы ответим на вопрос, почему код из прошлого урока является избыточным? Дело в том, что try..catch в примере просто выводит сообщение об ошибке, но если вы уберете try…catch и зададите некорректные данные, то получите аналогичный вывод об ошибке, которая сообщит вам о некорректности конфигурации подключения к вашей базе данных. Поэтому имеет смысл заключать приведенный в уроке код в try…catch, если вы будете отлавливать и обрабатывать ошибку каким-либо определенным образом.

    Что касается функции getAllPlayers, которую мы напишем, то логика ее работы довольно проста: во-первых в функцию необоходимо передать объект $db, определенный в файле db.php. Это необходимо, потому что данная и последующие наши функции будут непосредственно обращаться к базе данных. Далее мы создаем строковую переменную в виде SQL запроса и подготавливаем его.

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

    После этого запрос выполняется при помощи функции execute. А далее начинается работа с данными. Важно понимать, что эти данные надо разобрать для вида, понятного и удобного для php. Для этого существуют функции fetch, fetchAll и пр. Функции fetch имеют один важный параметр — стиль разбора. Выражаясь проще, функция разбирает данные в определенной структуре для php (массив, объект и пр.).

    Далее данные получаются из вызова функции и выводятся в бразуер.

    p0vidl0.info

    Кодинг, админинг и прочие развлечения

    PHP PDO — работаем с базами данных правильно

    Термин PDO является сокращением понятия PHP Data Objects. Как можно судить по названию, эта технология позволяет работать с содержимым базы данных через объекты.

    Почему не myqli или mysql?

    Чаще всего, в отношении новых технологий, встает вопрос их преимуществ перед старыми-добрыми и проверенными инструментами, а также, перевода на них текущих и старых проектов.

    Объектная ориентированность PDO

    PHP развивается очень активно и стремится стать одним из лучших инструментов для быстрой разработки веб приложений как массового, так и корпоративного уровня.

    Говоря о PHP, будем подразумевать современный объектно-ориентированный PHP, позволяющий писать универсальный код, удобный для тестирования и повторного использования.

    Использование PDO позволяет вынести работу с базой данных на объектно-ориентированный уровень и улучшить переносимость кода. На самом деле, использование PDO не так сложно, как можно было бы подумать.

    Абстракция

    Представим, что мы уже продолжительное время разрабатываем приложение, с использованием MySQL. И вот, в один прекрасный момент, появляется необходимость заменить MySQL на PostgreSQL.

    Как минимум, нам придется заменить все вызовы mysqli_connect() (mysql_connect()) на pg_connect() и, по аналогии, другие функции, используемые для запроса и обработки данных.

    При использовании PDO, мы ограничимся изменением нескольких параметров в файлах конфигурации.

    Связывание параметров

    Использование связанных параметров предоставляет большую гибкость в составлении запросов и позволяет улучшить защиту от SQL инъекций.

    Получение данных в виде объектов

    Те, кто уже использует ORM (object-relational mapping — объектно-реляционное отображение данных), например, Doctrine, знают удобство представления данных из таблиц БД в виде объектов. PDO позволяет получать данные в виде объектов и без использования ORM.

    Расширение mysql больше не поддерживается

    Поддержка расширения mysql окончательно удалена из нового PHP 7. Если вы планируете переносить проект на новую версию PHP, уже сейчас следует использовать в нем, как минимум, mysqli. Конечно же, лучше начинать использовать PDO, если вы еще не сделали этого.

    Мне кажется, что этих причин достаточно для склонения весов в сторону использования PDO. Тем более, не нужно ничего дополнительно устанавливать.

    Проверяем наличие PDO в системе

    Версии PHP 5.5 и выше, чаще всего, уже содержать расширение для работы с PDO. Для проверки достаточно выполнить в консоли простую команду:

    Либо найти информацию в выводе встроенной PHP функции phpinfo() . Создадим для этого простой скрипт:

    Теперь откроем его в любом браузере и найдем нужные данные поиском по строке PDO.

    Знакомимся с PDO

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

    1. Подключение к базе данных;
    2. По необходимости, подготовка запроса и связывание параметров;
    3. Выполнение запроса.

    Подключение к базе данных

    Для подключения к базе данных нужно создать новый объект PDO и передать ему имя источника данных, так же известного как DSN.

    В общем случае, DSN состоит из имени драйвера, отделенного двоеточием от строки подключения, специфичной для каждого драйвера PDO.

    Для MySQL, подключение выполняется так:

    В данном случае, DSN содержит имя драйвера mysql, указание хоста (возможен формат host=ИМЯ_ХОСТА:ПОРТ), имя базы данных, кодировка, имя пользователя MySQL и его пароль.

    Запросы

    В отличие от mysqli_query(), в PDO есть два типа запросов:

    • Возвращающие результат (select, show);
    • Не возвращающие результат (insert, detele и другие).

    Первым делом, рассмотрим второй вариант.

    Выполнение запросов

    Рассмотрим пример выполнения запроса на примере insert.

    Конечно же, данный запрос возвращает количество затронутых строк и увидеть его можно следующим образом.

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

    В случае использования mysqli_query() , код мог бы быть следующим.

    Для PDO, код будет проще и лаконичнее.

    Режимы получения данных

    Как и в mysqli, PDO позволяет получать данные в разных режимах. Для определения режима, класс PDO содержит соответствующие константы.

    • PDO::FETCH_ASSOC — возвращает массив, индексированный по имени столбца в таблице базы данных;
    • PDO::FETCH_NUM — возвращает массив, индексированный по номеру столбца;
    • PDO::FETCH_OBJ — возвращает анонимный объект с именами свойств, соответствующими именам столбцов. Например, $row-> >PDO::FETCH_CLASS — возвращает новый экземпляр класса, со значениями свойств, соответствующими данным из строки таблицы. В случае, если указан параметр PDO::FETCH_CLASSTYPE (например PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE ), имя класса будет определено из значения первого столбца.

    Примечание: это не полный список, все возможные константы и варианты их комбинации доступны в документации.

    Пример получения ассоциативного массива:

    Примечание: Рекомендуется всегда указывать режим выборки, так как режим PDO::FETCH_BOTH потребует вдвое больше памяти — фактически, будут созданы два массива, ассоциативный и обычный.

    Рассмотрим использование режима выборки PDO::FETCH_CLASS . Создадим класс User :

    Теперь выберем данные и отобразим данные при помощи методов класса:

    Подготовленные запросы и связывание параметров

    Для понимания сути и всех преимуществ связывания параметров нужно более подробно рассмотреть механизмы PDO. При вызове $statement->query() в коде выше, PDO подготовит запрос, выполнит его и вернет результат.

    При вызове $connection->prepare() создается подготовленный запрос. Подготовленные запросы — это способность системы управления базами данных получить шаблон запроса, скомпилировать его и выполнить после получения значений переменных, использованных в шаблоне. Похожим образом работают шаблонизаторы Smarty и Twig.

    При вызове $statement->execute() передаются значения для подстановки в шаблон запроса и СУБД выполняет запрос. Это действие аналогично вызову функции шаблонизатора render() .

    Пример использования подготовленных запросов в PHP PDO:

    В коде выше подготовлен запрос выборки записи с полем id равным значению, которое будет подставлено вместо :id . На данном этапе СУБД выполнит анализ и компиляцию запроса, возможно с использованием кеширования (зависит от настроек).

    Теперь нужно передать недостающий параметр и выполнить запрос:

    И получить данные:

    Преимущества использования связанных параметров

    Возможно, после рассмотрения механизма работы подготовленных запросов и связанных параметров, преимущества их использования стали очевидными.

    PDO предоставляет удобную возможность экранирования пользовательских данных, например, такой код больше не нужен:


    Вместо этого, теперь целесообразно делать так:

    Можно, даже, еще укоротить код, используя нумерованные параметры вместо именованных:

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

    При вызове метода prepare() , СУБД проведет анализ и скомпилирует запрос, при необходимости использует кеширование. Позже, в цикле for , происходит только выборка данных с указанным параметром. Такой подход позволяет быстрее получить данные, уменьшив время работы приложения.

    При получении общего количества пользователей в базе данных был использован метод fetchColumn() . Этот метод позволяет получить значение одного столбца и является полезным при получении скалярных значений, таких как количество, сумма, максимально или минимальное значения.

    Связанные значения и оператор IN

    Часто, при начале работы с PDO, возникают трудности с оператором IN . Например, представим, что пользователь вводит несколько имен, разделенных запятыми. Пользовательский ввод хранится в переменной $names :

    НЕ корректный код:

    Этот код не будет работать потому, что параметр в шаблоне представлен скалярным значением (например, целое число или строка).

    Правильным подходом будет создание специальной строки:

    Как видно из код, в строке 2 создаем массив размером как $names и заполняем его символами ? , а затем, формируем из него строку, содержащую элементы массива, разделенные запятыми. В результате получается строка наподобие . . При передаче массива $names в методе execute() , первый элемент массива будет сопоставлен первому знаку вопроса, второй второму и так далее.

    Типизированные связанные параметры

    Рассмотренные выше примеры были намеренно упрощены и не содержали указания типов параметров. Однако, в реальном коде лучше использовать указание типов.

    • Читабельность. Для читающих код проще будет его понять;
    • Обслуживаемость. Знание типов передаваемых параметров упрощает отладку кода. Например, при передаче строкового значения в параметр, который ожидает целое число, вызовет соответствующую ошибку;
    • Ускорение. Явное указание типа параметра избавляет СУБД от необходимости приведения типов.

    Для явного указания типов параметров лучше использовать метод bindValue() . Например,

    В коде выше параметр определен в вызове метода bindValue() , а метод execute() вызывается без параметров.

    Примечание: В примере выше, первым параметром метода bindValue() , является 1 . При использовании именованных параметров, первым параметром передается соответствующее имя переменной в шаблоне. В противном случае. первым параметром передается порядковый номер переменной в шаблоне. Обратите внимание, что нумерация начинается с 1, а не с !

    Заключение

    PHP развивается, программисты не должны отставать. Использование расширения PDO позволяет писать более краткий, лаконичный, быстрый и безопасный код. Почему бы не начать использовать его уже сейчас?

    PDO в PHP

    PDO (PHP Data Objects) — расширение для PHP, предоставляющее простой интерфейс для доступа к различным базам данных. Если говорить очень просто и коротко, при помощи PDO в PHP подключаются к базам данных разных типов.

    В этом уроке мы будем подключаться к базе данных MySQL, так как это самая распространённая база данных.

    Подключение к базе данных

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

    Пример того, как мы можем подключиться к базе данных:

    Я думаю если вы интересуетесь PDO, то ваших знаний достаточно и этот синтаксис вам объяснять не нужно.

    Итак, у нас есть объект подключения для доступа к базе данных.

    Обработка исключений

    Когда используется PDO, то ошибки подключений советуюю ловить при помощи конструкции try<. >catch <. >. Вот пример такого кода:

    Есть разные мнения, по поводу обработки ошибок, например не все советуют всегда использовать конструкцию try<. >catch <. >. Дело в том, что PHP и так выведет сообщение об ошибке на экран, так что этот код избыточен. Хотя если вы хотите например откатить транзакцию, то эта конструкция вам пригодится, но об этом ниже.

    Получение данных из базы используя PDO, метод query

    Для выборки из базы данных используется метод query , которому мы передаём строку запроса SQL.

    Не забывайте, что для всех типов баз данных этот синтаксис сработает.

    Также не забывайте про безопасность данных, передаваемых в SQL запросах. В PDO есть аналог функции mysql_real_escape_string() это метод quote .

    Обработка результата, методы FETCH и FETCHALL.

    Теперь нам нужно преобразовать результат из переменной $res в массив. Это делается при помощи метода FETCH , которому передаётся константа.

    Очевидно, что константа FETCH_LAZY замедляет работу скрипта, поэтому её желательно не использовать.

    Метод FETCH возвращает одну запись из результата. Если требуется получить все записи, нужно использовать метод FETCHALL . В дальнейшем результат, полученный в результате использования FETCHALL обрабаьываем в цикле foreach , как показано в примере:

    Константа FETCH_CLASS

    Особого объяснения требует константа FETCH_CLASS , она позволяет заполнить предварительно созданный класс данными из результата запроса к базе данных.

    Давайте рассмотрим пример, с использованием константы FETCH_CLASS :

    Не забывайте важное правило — названия свойств в созданном классе обязаны быть такими же, как и названия полей в базе данных.

    Подготовленные выражения

    Подготовленные выражения нужно обязательно использовать если ваш SQL запрос содержит переменные.

    Подготовленные выражения PDO — основная причина использовать PHP Data Objects, поскольку это единственный безопасный способ выполнения SQL запросов, в которых есть переменные, созданные пользователем.

    Подготовленные выражения в PDO — это обычный SQL запрос, в котором переменная заменяется специальным маркером — плейсхолдером.

    Именнованные плейсхолдеры

    Сначала давайте рассмотрим именнованный плейсхолдер, его синтаксис например такой: :email .

    Давайте рассмотрим пример запроса INSERT с использованием плейсхолдеров.

    В этом примере вместо переменных в запросе мы использовали два плейсхолдера (:email, :message)») .

    Обратите внимание, что чтобы подготовить SQL запрос, мы пишем его в методе prepare() . Потом, чтобы указать к какому плейсхолдеру какую переменную привязать, используем метод bindParam() . Чтобы выполнить SQL запрос, мы вызываем метод execute() .

    Итак, ещё раз последовательность работы с подготовленными выражениями по шагам:

    1. Присваиваем переменной $stmt результат выполнения метода prepare() .
    2. При помощи метода bindParam() мы связываем переменные и плейсхолдеры.
    3. Назначаем значения переменных.
    4. При помощи метода execute() выполняем запрос к базе данных.

    Этот синтаксис можно записать

    Видно, что в метод execute() должен передаваться массив, в котором ключи должны совпадать с именами плейсхолдеров.

    Кстати, у метода bindParam() есть синоним bindValue() .

    Неименованные плейсхолдеры

    Теперь рассмотрим работу с неименованными плейсхолдерами.

    В этом синтаксисе вместо записи плейсхолдера :название указывается другая форма его записи — знак вопроса 😕 .

    Тут значения массива $email будут поочерёдно присвоены плейсхолдерам 😕 , но в нашем примере плейсхолдер один.

    Вот другой пример применения неименованных плейсхолдеров, с использованием метода bindParam() :

    Вставка в базу данных, метод exec()

    Если мы хотим что-нибудь записать в базу, тогда можно также использовать метод PDO::exec() .

    Если этот запрос будет выполнен, то в переменную $result попадёт количество затронутых в таблице строк.

    PDO::exec() выполняет INSERT запросы, но не может получить данные из БД, этим занимается метод PDO::query() . PDO::exec() только запускает SQL запрос на выполнение и возвращает количество строк, задействованных в ходе его выполнения, он не возвращает результат выборки оператором SELECT .

    Labdes

    Я думаю настало время повысить свой экспириенс, и перейти при работе с базой данных с mysql_ функций на PDO. Эта библиотека является мощным и быстрым дополнением к PHP. Одно из ее преимуществ – работа со многими базами данных (MS SQL , MySQL , PostgreSQL , Oracle и др.). Также отличительной характеристикой этой библиотеки являются подготовленные выражения, так называемые prepared statements, которые должны ускорить работу с базой, а главное сделать обмен данным безопасными и забыть о таких уязвимостях как sql-enjection. Кроме того, есть и другие очень полезные возможности. В этой статье я попытался собрать часто используемые примеры работ, по которым можно сразу понять суть работы PDO.

    PDO Соединение с БД

    Как только будет установлено успешное соединение с конкретным сервером базы данных, то будет возвращен объект PDO. Этот объект позволяет выполнять самые разнообразные задачи баз данных.

    Если есть какие-либо ошибки подключения, то сработает механизм исключений – PDOException. Нужно всегда оборачивать операции PDO в блок try/catch. Вы можете поймать исключение, если вы хотите обрабатывать ошибки, или вы можете оставить его для глобального обработчика исключений (exception), которые вы создали с помощью set_exception_handler (). В PDO есть специальные функции для ошибок: errorCode() – вернет номер ошибки, errorInfo() – вернет массив с номером ошибки и описанием. Они нужны так как по умолчанию режим работы с ошибками стоит ERRMODE_SILENT. В этом случае чтобы увидеть эти ошибки придется их вызвать:

    Чтобы этого не делать, в режиме разработке проще сразу выставить нужный режим работы с ошибками: ATTR_ERRMODE и ERRMODE_EXCEPTION. Можно также прописать кодировку работы с базой. В итоге у нас получится такой вот код подключения:

    После успешного подключения к базе данных, экземпляр класса PDO возвращается в сценарий. $db содержит дескриптор базы данных. Соединение остается активным в течение всей жизни объекта PDO. Чтобы закрыть соединение, вам нужно уничтожить объект с гарантией, что все остальные ссылки на него будут удалены. Сделать это можно путем присвоения переменной, которая содержит объект, значения NULL. Если вы не сделаете этого явно, PHP будет автоматически закрывать соединение после завершения работы скрипта.

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

    Теперь, когда вы увидели, как открывать и закрывать соединение, давайте рассмотрим другие примеры работы с PDO. В данном случае я собираюсь показать вам, как выполнять запросы к конкретной базе данных. Запросы можно делать 3 функциями: exec(), query() и prepare+execute.

    Первый – exec вернет только кол-во задействованных строк или FALSE при ошибке и используется там, где не возвращаются данные, например при удалении:

    Query()

    Второй – query() вернет результат в объекте PDOStatement. Также возвращает результат или FALSE при ошибке. Ему можно доверить простые запросы. Можно использовать query() с условием (я правда не знаю зачем кому то это может понадобиться), но тогда все равно придется экранировать данные методом PDO::quote

    lastInsertId() возвращает идентификатор последней вставленной строки базы данных.

    Подготовленные выражения – prepared statments.

    Третий способ prepare+execute — Подготовленные выражения, они же подготовленные инструкции они же плейсхолдеры они же prepared statments или связываемые переменные, позволяют определить выражение один раз, а затем многократно его выполнять с разными параметрами. Также они позволяют отделить переменные от запроса, что делает код безопаснее и повышает скорость выполнения. В вашем коде больше не надо будет пытаться очистить передаваемые данные. Мы сделаем это только один раз перед выполнением запроса к БД. Для этого используем функцию Prepare(); В качестве параметра она принимает SQL запрос, но в нем, вместо переменных используются метки, в виде знака вопроса ‘?’ или номеров ‘:1′, или переменой, имя которой начинается с двоеточия ‘:’. Если вы остановились на знаках вопроса (:цифрах), то вам надо в функцию execute передать массив значений, в соответствующей последовательности. Если ваш выбор именованные переменные, то надо назначить каждой переменной значение через одну из двух функций: либо bindValue(), которая присваивает псевдо-переменной значение, либо bindParam(), которая связывает псевдо-переменную с настоящей переменной. Третьим параметром можно указать тип переменной, например $db->bindParam(‘:id’,$id, PDO::PARAM_INT).

    Еще раз напомню, что если вы не используете подготовленные выражения но все-таки хотите обезопасить передаваемые данные, то это можно сделать при помощи функции PDO:quote.

    PDO SELECT данных

    Для выборки данных используются методы fetch() или fetchAll(). Перед вызовом функции нужно указать PDO как Вы будете доставать данные из базы. PDO::FETCH_ASSOC вернет строки в виде ассоциативного массива с именами полей в качестве ключей. PDO::FETCH_NUM вернет строки в виде числового массива. По умолчанию выборка происходит с PDO::FETCH_BOTH, который дублирует данные как с численными так и с ассоциативными ключами, поэтому рекомендуется указать один способ, чтобы не иметь дублирующих массивов:

    Либо можно указать метод выборки в самом методе ->fetch()

    PDO UPDATE данных

    Происходит по существу также как и INSERT и SELECT (в данном случае опять же будем использовать именованные метки (placeholders)):

    DELETE Удаление происходит простейшим образом:

    Конечно вы можете также использовать именованные параметры (placeholders) при удалении.

    Если у вас есть свои часто используемые заготовки при работе с расширением PHP PDO, буду признателен если вы ими поделитесь. Ссылка на мануал

    Если у вас возникла ошибка Undefined variable: DBH… то можете почитать как это исправить.

    Google помог найти шпаргалку по PDO, может кому пригодится:

    Топ-пост этого месяца:  Как перейти с jQuery на обычный JavaScript работа с функциями, событиями и стилями
    Добавить комментарий