Php pdo dll
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’ и очевидным образом вызывает ошибку синтаксиса и, соответственно, пустой массив данных.
Решение #1 : Отключить режим эмуляции:
Решение #2 : Биндить эти цифры через bindValue() , принудительно выставляя им тип PDO::PARAM_INT :
PDO и оператор IN
При выборке из таблицы необходимо доставать записи, соответствующие всем значениям массива.
Добавление записей
Изменение записей
Удаление записей
Использование транзакций
Важно! Транзакции в PDO работают только с таблицами InnoDB
В данной заметке мы познакомились с основными понятиями PDO, его установкой, подключением к БД и самые простые возможности выборки, изменения и удаления данных. В следующих заметках мы рассмотрим ещё несколько тем, касающихся PDO.
проверен файл php.ini «extension = php_pdo_mysql.dll», но все же ошибка
Я проверил файл php.ini, что расширения включены:
но все же, когда я пытаюсь открыть страницу, она дает ошибку
500 | Внутренняя ошибка сервера | PropelException Не удалось открыть PDO-соединение [wrapped: не удалось найти драйвер]
что мне теперь нужно делать? устранить эту ошибку
Узнайте, какой драйвер PDO вам действительно нужен (MySQL, MS SQL …?)
Проверьте, создав экземпляр PDO самостоятельно, чтобы избежать ошибок в другом месте:
$db = new PDO(‘mysql:host=127.0.0.1;dbname=testdb’, ‘username’, ‘password’);
Если вы все еще получаете «не можете найти драйвер», теперь вы можете быть уверены, что вам действительно не хватает его
Как установить его, если у вас его нет, многое зависит от вашей системы. Например, в Debian Linux вам нужно выполнить apt-get install php5-mysql , который устанавливает расширения mysql , mysqli и pdo_mysql .
После его установки убедитесь, что он включен в php.ini . убедитесь, что вы редактируете правильный файл – тот, который используется вашим веб-сервером.
После этого, чтобы проверить правильность загрузки расширения, выполните следующие действия:
создайте скрипт, который выполняет phpinfo() . Вы должны увидеть раздел PDO с ключевыми PDO-драйверами и значением, например « mysql, pgsql », или
запустите php -m из командной строки, и вы, например, увидите pdo_mysql .
Php_pdo_mysql.dll в каталоге расширения может пытаться загрузить libmysql.dll или mysql.dll, который по умолчанию находится в каталоге php (я думаю, что они по крайней мере в моем php-каталоге, но я установил его так давно Не помните, были ли они там по умолчанию или я их скопировал). Если в php-каталоге нет вашего PATH, эти последние dll не будут найдены и вызывают ошибку.
Я бы предложил проверить, что libmysql.dll и / или mysql.dll находятся в вашем каталоге php. Если это так, добавьте ваш php-каталог в PATH вашей системы и REBOOT на свой компьютер. У меня была та же проблема, добавлен каталог php на путь системы, перезапущен Apache, и проблема не была решена. Мне нужно было перезагрузиться, прежде чем Apache / PHP найдет dll в каталоге php.
Альтернативой является копирование libmysql.dll и mysql.dll в каталог, поиск по умолчанию (это каталог Windows или, возможно, каталог Window System32). Когда php_pdo_mysql.dll будет загружен, он сможет найти зависимые dll.
Если эти две библиотеки не находятся в вашем php-каталоге, попробуйте загрузить и установить MySQL. Вы можете найти эти DLL среди файлов, установленных моим установщиком MySQL.
Если вы используете Apache, он должен сообщать в журнале ошибок, что он не может загрузить php_pdo_mysql.dll. Если нет, возможно, он сообщает о другой ошибке при запуске. Проводка любых ошибок из журнала может быть полезной для диагностики.
Надеюсь это поможет.
В php.ini установите следующее, чтобы проверить, есть ли проблема с загрузкой расширений.
У меня были проблемы в прошлом, когда, несмотря на то, что DLL находилась в каталоге php / ext /, и, несмотря на правильность установки php-пути, мне пришлось указать абсолютный путь к расширению.
Проверьте журналы ошибок Apache, чтобы увидеть, была ли проблема с загрузкой расширения
Вы работаете с командной строкой?
Часто в командной строке и PHP в браузере используются разные файлы PHP.ini.
Используйте phpinfo (), чтобы проверить модули, включенные в borwser. Используйте PHP -m, чтобы увидеть модули, установленные через CLI