Как установить драйвер pdo mysql

Обновлено: 17.05.2024

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

Предоставляемый интерфейс поддерживает, среди прочих, такие популярные СУБД:

  • MySQL;
  • SQLite;
  • PostgreSQL;
  • Microsoft SQL Server.

В этом руководстве представлен обзор PDO:

    , начиная с установки соединения до выполнения выборки. . .

Для работы потребуются:

  • базовые знания MySQL и опыт использования команды mysql в консоли;
  • понимание основ объектно-ориентированного программирования;
  • PHP >= 5.1;
  • рабочая СУБД MySQL/MariaDB.

Создание тестовой базы данных и таблицы

Для начала создадим базу данных для этого руководства:

Пользователю с логином testuser и паролем testpassword предоставили полные права доступа к базе solar_system .

Теперь создадим таблицу и заполним данными, астрономическая точность которых не подразумевается:

Описание соединения

Теперь, когда создана база, определим DSN (Data Source Name) — сведения для подключения к базе, представленные в виде строки. Синтаксис описания отличается в зависимости от используемой СУБД. В примере работаем с MySQL/MariaDB, поэтому указываем:

    ;
  • имя хоста, где расположена СУБД;
  • порт (необязательно, если используется стандартный порт 3306 );
  • имя базы данных;
  • кодировку (необязательно).

Строка DSN в этом случае выглядит следующим образом:

Первым указывается database prefix . В примере — mysql . Префикс отделяется от остальной части строки двоеточием, а каждый следующий параметр — точкой с запятой.

Создание PDO-объекта

Теперь, когда строка DSN готова, создадим PDO-объект. Конструктор на входе принимает следующие параметры:

  1. Строку DSN.
  2. Имя пользователя, имеющего доступ к базе данных.
  3. Пароль этого пользователя.
  4. Массив с дополнительными параметрами (необязательно).

Дополнительные параметры можно также определить после создания объекта с помощью метода SetAttribute :

Определение метода выборки по умолчанию

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

PDO::FETCH_BOTH

Режим по умолчанию. Результат выборки индексируется как номерами (начиная с 0), так и именами столбцов:

После выполнения запроса с этим режимом к тестовой таблице планет получим следующий результат:

PDO::FETCH_ASSOC

Результат сохраняется в ассоциативном массиве, в котором ключ — имя столбца, а значение — соответствующее значение строки:

В результате получим:

PDO::FETCH_NUM

При использовании этого режима результат представляется в виде массива, индексированного номерами столбцов (начиная с 0):

PDO::FETCH_COLUMN

Этот вариант полезен, если нужно получить перечень значений одного поля в виде одномерного массива, нумерация которого начинается с 0. Например:

В результате получим:

PDO::FETCH_KEY_PAIR

Используем этот вариант, если нужно получить перечень значений двух полей в виде ассоциативного массива. Ключи массива — это данные первого столбца выборки, значения массива — данные второго столбца. Например:

В результате получим:

PDO::FETCH_OBJECT

При использовании PDO::FETCH_OBJECT для каждой извлеченной строки создаётся анонимный объект. Его общедоступные (public) свойства — имена столбцов выборки, а результаты запроса используются в качестве их значений:

В результате получим:

PDO::FETCH_CLASS

В этом случае, как и в предыдущем, значения столбцов становятся свойствами объекта. Однако требуется указать существующий класс, который будет использоваться для создания объекта. Рассмотрим это на примере. Для начала создадим класс:

Обратите внимание, что у класса Planet закрытые (private) свойства и нет конструктора. Теперь выполним запрос.

Если используется метод fetch с PDO::FETCH_CLASS , перед отправкой запроса на получение данных нужно применить метод setFetchMode :

Первый параметр, который передаем методу setFetchMode , — константа PDO::FETCH_CLASS . Второй параметр — имя класса, который будет использоваться при создании объекта. Теперь выполним:

В результате получим объект Planet :

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

Определение свойств после выполнения конструктора

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

25–27 ноября, Онлайн, Беcплатно

При использовании константы FETCH_PROPS_LATE значения свойств будут присваиваться после выполнения конструктора:

Мы изменили класс Planet , добавив конструктор, который принимает на входе два аргумента: name (имя) и color (цвет). Значения этих полей по умолчанию: moon (луна) и gray (серый) соответственно.

Если не использовать FETCH_PROPS_LATE , при создании объекта свойства будут перезаписаны значениями по умолчанию. Проверим это. Сначала выполним запрос:

В результате получим:

Как и ожидалось, извлеченные из базы данных значения перезаписаны. Теперь рассмотрим решение задачи с помощью FETCH_PROPS_LATE (запрос аналогичный):

В результате получим то, что нужно:

Если у конструктора класса нет значений по умолчанию, а они нужны, параметры конструктора задаются при вызове метода setFetchMode третьим аргументом в виде массива. Например:

Аргументы конструктора обязательны, поэтому выполним:

Получение нескольких объектов

Множественные результаты извлекаются в виде объектов с помощью метода fetch внутри цикла while :

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

PDO::FETCH_INTO

При выборе этого варианта выборки PDO не создаёт новый объект, а обновляет свойства существующего. Однако это возможно только для общедоступных (public) свойств или при использовании в объекте «магического» метода __set .

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

В PDO два способа выполнения запросов:

  • прямой, который состоит из одного шага;
  • подготовленный, который состоит из двух шагов.

Прямые запросы

Существует два метода выполнения прямых запросов:

  • query используется для операторов, которые не вносят изменения, например SELECT . Возвращает объект PDOStatemnt , из которого с помощью методов fetch или fetchAll извлекаются результаты запроса;
  • exec используется для операторов вроде INSERT , DELETE или UPDATE . Возвращает число обработанных запросом строк.

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

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

PDO поддерживает подготовленные запросы (prepared statements), которые полезны для защиты приложения от SQL-инъекций: метод prepare выполняет необходимые экранирования.

Рассмотрим пример. Требуется вставить свойства объекта Planet в таблицу Planets . Сначала подготовим запрос:

Используем метод prepare , который принимает как аргумент SQL-запрос с псевдопеременными (placeholders). Псевдопеременные могут быть двух типов: неименнованые и именованные.

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

Неименованные псевдопеременные (positional placeholders) отмечаются символом ? . Запрос в результате получается компактным, но требуется предоставить значения для подстановки, размещенные в том же порядке. Они передаются в виде массива через метод execute :

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

При использовании именованных псевдопеременных (named placeholders) порядок передачи значений для подстановки не важен, но код в этом случае становится не таким компактным. В метод execute данные передаются в виде ассоциативного массива, в котором каждый ключ соответствует имени псевдопеременной, а значение массива — значению, которое требуется подставить в запрос. Переделаем предыдущий пример:

Методы prepare и execute используются как при выполнении запросов на изменение, так и при выборке.

А информацию о количестве обработанных строк при необходимости предоставит метод rowCount .

Управление поведением PDO при ошибках

Параметр выбора режима ошибок PDO::ATTR_ERRMODE используется для определения поведения PDO в случае ошибок. Доступно три варианта: PDO::ERRMODE_SILENT , PDO::ERRMODE_EXCEPTION и PDO::ERRMODE_WARNING .

PDO::ERRMODE_SILENT

Вариант по умолчанию. PDO просто запишет информацию об ошибке, которую помогут получить методы errorCode и errorInfo.

PDO::ERRMODE_EXCEPTION

Это предпочтительный вариант, при котором в дополнение к информации об ошибке PDO выбрасывает исключение (PDOException). Исключение прерывает выполнение скрипта, что полезно при использовании транзакций PDO. Пример приведён ниже при описании транзакций.

PDO::ERRMODE_WARNING

В этом случае PDO также записывает информацию об ошибке. Поток выполнения скрипта не прерывается, но выдаются предупреждения.

Методы bindValue и bindParam

Для подстановки значений в запросе можно также использовать методы bindValue и bindParam . Первый связывает значение переменной с псевдопеременной, которая использована при подготовке запроса:

Связали значение переменной $planet->name с псевдопеременной :name . Обратите внимание, что при использовании методов bindValue и bindParam как третий аргумент указывается тип переменной, используя соответствующие константы PDO. В примере — PDO::PARAM_STR .

Метод bindParam привязывает переменную к псевдопеременной. В этом случае переменная связана с псевдопеременной ссылкой, а значение будет подставлено в запрос только после вызова метода execute . Рассмотрим на примере:

Транзакции в PDO

Транзакции позволяют сохранить на некоторое время и организовать выполнение нескольких запросов «пакетом». Запросы, включённые в транзакцию, применяются только в том случае, если при выполнении отсутствуют ошибки. Транзакции поддерживаются не всеми СУБД и работают не со всеми SQL-конструкциями, так как некоторые из них вызывают неявное выполнение. Список таких конструкций можно найти на сайте MariaDB.

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

Метод beginTransaction отключает автоматическое выполнение запросов, а внутри конструкции try-catch запросы выполняются в нужном порядке. Если не возникнет исключений PDOException , запросы выполнятся с помощью метода commit . В противном случае откатятся с помощью метода rollback , а автоматическое выполнение запросов восстановится.

Таким образом появилась согласованность выполнения запросов. Очевидно, что для этого параметру PDO::ATTR_ERRMODE необходимо установить значение PDO::ERRMODE_EXCEPTION .

PHP: PDO быстрый старт, работа с MySQL

PDO (PHP Data Objects) — расширение PHP, которое реализует взаимодействие с базами данных при помощи объектов. Профит в том, что отсутствует привязка к конкретной системе управления базами данных. PDO поддерживает СУБД: MySQL, PostgreSQL, SQLite, Oracle, Microsoft SQL Server и другие.

Официальный мануал по PHP PDO здесь . Там же можно найти и сам класс PDO .

Почему стоит использовать PDO

Функции mysql в PHP для работы с БД давно уже устарели, на сегодняшний день желательно использовать mysqli или PDO (PHP Data Objects). Кроме того, mysqli - эта библиотека, которая по большому счёту, не предназначена для использования напрямую в коде. Она может послужить хорошим строительным материалом для создания библиотеки более высокого уровня. При работе с mysqli следует также помнить об обеспечении безопасности вашего приложения, в частности о защите от SQL-инъекций. В случае использования PDO (с его подготовленными запросами), такая защита идёт уже "из коробки", главное правильно применить необходимые методы.

Тестовая база данных с таблицей

Установка PDO

Проверить доступные драйвера

Соединение с базой данных

Соединения устанавливаются автоматически при создании объекта PDO от его базового класса.

При ошибке подключения PHP выдаст ошибку:

В этом примере подключения мы используем конструкцию try. catch . Многие спорят о целесообразности её использования. Лично я использую try. catch , она мне не мешает.

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

В PDO два способа выполнения запросов:

  • Прямой - состоит из одного шага;
  • Подготовленный - состоит из двух шагов.

Прямые запросы

  • query() используется для операторов, которые не вносят изменения, например SELECT . Возвращает объект PDOStatemnt , из которого с помощью методов fetch() или fetchAll извлекаются результаты запроса. Можно его сравнить с mysql resource , который возвращала mysql_query() .
  • exec() используется для операторов INSERT, DELETE, UPDATE . Возвращает число обработанных запросом строк.

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

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

Если же в запрос передаётся хотя бы одна переменная, то этот запрос в обязательном порядке должен выполняться только через подготовленные выражения . Что это значит? Это обычный SQL запрос, в котором вместо переменной ставится специальный маркер - плейсхолдер. PDO поддерживает позиционные плейсхолдеры ( ? ), для которых важен порядок передаваемых переменных, и именованные ( :name ), для которых порядок не важен. Примеры:

Чтобы выполнить такой запрос, сначала его надо подготовить с помощью метода prepare() . Она также возвращает PDO statement , но ещё без данных. Чтобы их получить, надо исполнить этот запрос, предварительно передав в него наши переменные. Передать можно двумя способами: Чаще всего можно просто выполнить метод execute() , передав ему массив с переменными:

Как видно, в случае именованных плейсхолдеров в execute() должен передаваться массив, в котором ключи должны совпадать с именами плейсхолдеров. После этого можно извлечь результаты запроса:

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

Получение данных. Метод fetch()

Мы уже выше познакомились с методом fetch() , который служит для последовательного получения строк из БД. Этот метод является аналогом функции mysq_fetch_array() и ей подобных, но действует по-другому: вместо множества функций здесь используется одна, но ее поведение задается переданным параметром. В подробностях об этих параметрах будет написано в другой заметке, а в качестве краткой рекомендации посоветую применять fetch() в режиме FETCH_LAZY

В этом режиме не тратится лишняя память, и к тому же к колонкам можно обращаться любым из трех способов - через индекс, имя, или свойство (через -> ). Недостатком же данного режима является то, что он не работает с fetchAll()

Получение данных. Метод fetchColumn()

Также у PDO statement есть метод для получения значения единственной колонки. Очень удобно, если мы запрашиваем только одно поле - в этом случае значительно сокращается количество кода:

Получение данных. Метод fetchAll()

PDO и оператор LIKE

Работая с подготовленными запросами, следует понимать, что плейсхолдер может заменять только строку или число. Ни ключевое слово, ни идентификатор, ни часть строки или набор строк через плейсхолдер подставить нельзя. Поэтому для LIKE необходимо сначала подготовить строку поиска целиком, а потом ее подставлять в запрос:

Здесь может вознинуть проблема! Поиск может не работать, потому как из базы у вас приходят данные в неправильной кодировке. Необходимо добавить кодировку в подключение, если она там не указана!

PDO и оператор LIMIT

Важно! Когда PDO работает в режиме эмуляции, все данные, которые были переданы напрямую в execute() , форматируются как строки. То есть, эскейпятся и обрамляются кавычками. Поэтому LIMIT . превращается в LIMIT '10', '10' и очевидным образом вызывает ошибку синтаксиса и, соответственно, пустой массив данных.

PDO и оператор IN

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

Добавление записей

Изменение записей

Удаление записей

Использование транзакций

Важно! Транзакции в PDO работают только с таблицами InnoDB

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

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

Ну, вот основные проблемы:

сайт, который я создаю, на самом деле требует PDO только для одной страницы. Хотя я могу подумать о переписывании это займет некоторое время, и мне нужно, чтобы страницы были запущены в ближайшее время, поэтому я не могу полностью отключить MySQL. Если я установлю PDO, смогу ли я использовать mysql_* обработчики?

на рассматриваемом сервере работает PHP версии 5.4.6-1ubuntu1 и Apache/2.2.22 (Ubuntu). Я также запускаю базу данных phpMyAdmin, если это имеет значение.

на Ubuntu вы должны иметь возможность установить необходимые части PDO из apt с помощью sudo apt-get install php5-mysql

нет никаких ограничений между использованием PDO и mysql_ одновременно. Однако вам нужно будет создать два соединения с вашей БД, одно с mysql_ и одно с помощью PDO.

это хороший вопрос, но я думаю, что вы просто неправильно понимаете то, что читаете.

на ./config --with-pdo-mysql Это то, что вы должны надеть только при компиляции PHP-кода. Если вы устанавливаете его с менеджерами пакетов, вам просто нужно использовать командную строку, заданную Jany Hartikainen: sudo apt-get install php5-mysql и sudo apt-get install pdo-mysql

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

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

несколько лет назад команда MySQL опубликовала сценарий к миграция в MySQLi. Я не знаю, можно ли это настроить, но это официально.

в основном ответ от Яни Хартикайнена прав! Я поддержал его ответ. Чего не хватало в моей системе (на основе Ubuntu 15.04), так это включить расширение PDO в моем php.ini

перезапустите веб-сервер (например, с помощью " sudo service apache2 restart") - >каждый штраф : -)

  1. PDO означает объект данных PHP.
  2. PDO_MYSQL-это драйвер, который будет реализовывать интерфейс между dataobject (database) и пользовательским вводом (слой под пользовательским интерфейсом под названием "Code behind"), обращающимся к вашему объекту данных, базе данных MySQL.

цель использования это реализовать дополнительный уровень безопасности между пользовательским интерфейсом и базой данных. Используя этот слой, данные можно нормализовать перед вставкой в ваша структура данных. (Заглавные буквы-это заглавные буквы, без ведущих или конечных пробелов, все даты правильно сформированы.)

но есть несколько нюансов, о которых вы, возможно, не знаете.

прежде всего, до сих пор вы, вероятно, написали все свои запросы в чем-то похожем на URL, и вы передаете параметры, используя сам URL. Используя PDO, все это делается на уровне пользовательского интерфейса. Пользовательский интерфейс передает мяч PDO, который несет его вниз поле и устанавливает его в базу данных для 7-точечного приземления.. он получает семь очков, потому что он получил его там и сделал это намного безопаснее, чем передача информации через URL.

вы также можете укрепить свой сайт до SQL-инъекций С помощью данных слоя. Используя этот промежуточный уровень, который является единственным "игроком", который разговаривает с самой базой данных, я уверен, что вы можете увидеть, как это может быть гораздо более безопасным. Интерфейс к datalayer к базе данных, datalayer к базе данных к уровень данных для интерфейса.

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

Ре: MySQL-функции в URL в PHP точка нетто/руководство по эксплуатации/ванными/Реф дот ПДО-точка с MySQL в PHP

или проверьте с помощью bitmonkey. Там есть группа, я уверен, вы могли бы многому научиться. с.

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

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

Затем самым последним расширением является PDO, которое обозначает «Объекты данных PHP». PDO предлагает API, объединяющий большинство функций, которые ранее были распространены на основные расширения доступа к базе данных, то есть MySQL, PostgreSQL, SQLite, MSSQL и т. Д. Интерфейс предоставляет высокоуровневые объекты для программиста для работы с соединениями с базой данных, запросами и наборами результатов, а низкоуровневые драйверы осуществляют связь и обработку ресурсов с сервером базы данных. Много дискуссий и работы идет о PDO, и он считается подходящим методом работы с базами данных в современном профессиональном коде.

Когда это возможно, я рекомендую людям пропустить посредника, так сказать, и перейти с расширения MySQL на PDO, а не на MySQLi. PDO предлагает согласованный API для работы с различными базами данных, поэтому вам не придется изменять свой код PHP, если вам когда-либо придется использовать другую базу данных. Кроме того, в то время как расширение MySQLi в настоящее время поддерживается, всегда есть вероятность, что оно может быть объявлено устаревшим в будущем. Выбор перехода на PDO теперь означает, что вам не придется переходить на него позже и обновлять свой код дважды. Я использую PDO, и вы тоже должны!

Установка и настройка PDO

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

PDO и специфичный для SQLite драйвер должны быть частью установки PHP по умолчанию начиная с версии 5.1.0, и специфичный для MySQL драйвер по-прежнему должен быть установлен, но большинство дистрибутивов Linux часто имеют разные идеи о том, как PHP следует компилировать и упаковывать. Фактически, многие из основных дистрибутивов теперь упаковывают расширение MySQL, расширение MySQLi и драйвер MySQL PDO вместе в одном пакете. Скорее всего, если вы используете MySQL в такой системе, вероятно, PDO уже настроен для вас.

  • Ubuntu собирает PHP с PDO (но по умолчанию не упаковывает драйвер SQLite) и объединяет расширения и драйвер MySQL. Вы можете установить расширения и драйвер, запустив sudo apt-get install php5-mysql
  • Fedora также связывает расширения и драйвер вместе, но упаковывает PDO как загружаемый модуль. При запуске sudo yum install php-mysql php-pdo
  • SUSE является единственным дистрибутивом из трех, который создает PHP так, как команда PHP рекомендует в отношении PDO; они собирают PHP с PDO и включают драйвер SQLite. yast2 --install php5-mysql

В Windows все драйверы PDO включены в папку ext, которая была создана при установке PHP из архива скомпилированного двоичного файла. Вам нужно только обновить php.ini

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

Основные запросы

Основной рабочий процесс использования функций расширения MySQL для работы с базой данных можно представить как 5-шаговый процесс:

Читайте также: