php pdo mssql подключение
Подключения и управление подключениями
Соединения устанавливаются автоматически при создании объекта PDO от его базового класса. Не имеет значения, какой драйвер вы хотите использовать; вы всегда используете имя базового класса. Конструктор класса принимает аргументы для задания источника данных (DSN), а также необязательные имя пользователя и пароль (если есть).
Пример #1 Подключение к MySQL
Пример #2 Обработка ошибок подключения
При успешном подключении к базе данных в скрипт будет возвращён созданный объект PDO. Соединение остаётся активным на протяжении всего времени жизни объекта. Чтобы закрыть соединение, необходимо уничтожить объект путём удаления всех ссылок на него (этого можно добиться, присваивая null всем переменным, указывающим на объект). Если не сделать этого явно, PHP автоматически закроет соединение по окончании работы скрипта.
Замечание: Если существуют другие ссылки на данный экземпляр PDO (например, из объекта PDOStatement или другие переменные, ссылающиеся на него), они также должны быть удалены (например, присвоением null переменной, ссылающейся на PDOStatement).
Пример #3 Закрытие соединения
// соединение больше не нужно, закрываем
$sth = null ;
$dbh = null ;
?>
Во многих приложениях может оказаться полезным использование постоянных соединений к базам данных. Постоянные соединения не закрываются при завершении работы скрипта, они кешируются и используются повторно, когда другой скрипт запрашивает соединение с теми же учётными данными. Постоянные соединения позволяют избежать создания новых подключений каждый раз, когда требуется обмен данными с базой, что в результате даёт прирост скорости работы таких приложений.
Пример #4 Постоянные соединения
Чтобы использовать постоянные соединения, необходимо добавить константу PDO::ATTR_PERSISTENT в массив параметров драйвера, который передаётся конструктору PDO. Если просто задать этот атрибут функцией PDO::setAttribute() уже после создания объекта, драйвер не будет использовать постоянные соединения.
Если вы используете PDO ODBC драйвер и ваши ODBC библиотеки поддерживают объединение подключений в пул (ODBC Connection Pooling) (unixODBC и Windows точно поддерживают, но могут быть и другие), то рекомендуется вместо постоянных соединений пользоваться этим пулом. Пул подключений ODBC доступен всем модулям текущего процесса; если PDO сам кеширует соединение, то это соединение будет недоступно другим модулям и не попадёт в пул. В результате каждый модуль будет создавать дополнительные подключения для своих нужд.
Почему стоит пользоваться PDO для работы с базой данных
Перевод статьи Why you Should be using PHP’s PDO for Database Access.
Множество PHP-разработчиков привыкли использовать для работы с базами данных расширения mysql и mysqli. Но с версии 5.1 в PHP существует более удобный способ — PHP Data Objects. Этот класс, сокращенно именуемый PDO, предоставляет методы для работы с объектами и prepared statements, которые заметно повысят вашу продуктивность!
Введение в PDO
«PDO – PHP Data Objects – это прослойка, которая предлагает универсальный способ работы с несколькими базами данных.»
Поддержка СУБД
Подключение
Способы подключения к разным СУБД могут незначительно отличаться. Ниже приведены примеры подключения к наиболее популярным из них. Можно заметить, что первые три имеют идентичный синтаксис, в отличие от SQLite.
Пожалуйста, обратите внимание на блок try/catch – всегда стоит оборачивать в него все свои PDO-операции и использовать механизм исключений (об этом чуть дальше).
$DBH расшифровывается как «database handle» и будет использоваться на протяжении всей статьи.
Закрыть любое подключение можно путем переопределения его переменной в null.
Больше информации по теме отличительных опций разных СУБД и методах подключения к ним можно найти на php.net.
Исключения и PDO
PDO умеет выбрасывать исключения при ошибках, поэтому все должно находиться в блоке try/catch. Сразу после создания подключения, PDO можно перевести в любой из трех режимов ошибок:
Но стоит заметить, что ошибка при попытке соединения будет всегда вызывать исключение.
PDO::ERRMODE_SILENT
Это режим по умолчанию. Примерно то же самое вы, скорее всего, используете для отлавливания ошибок в расширениях mysql и mysqli. Следующие два режима больше подходят для DRY программирования.
PDO::ERRMODE_WARNING
Этот режим вызовет стандартный Warning и позволит скрипту продолжить выполнение. Удобен при отладке.
PDO::ERRMODE_EXCEPTION
В большинстве ситуаций этот тип контроля выполнения скрипта предпочтителен. Он выбрасывает исключение, что позволяет вам ловко обрабатывать ошибки и скрывать щепетильную информацию. Как, например, тут:
В SQL-выражении есть синтаксическая ошибка, которая вызовет исключение. Мы можем записать детали ошибки в лог-файл и человеческим языком намекнуть пользователю, что что-то случилось.
Insert и Update
Вставка новых и обновление существующих данных являются одними из наиболее частых операций с БД. В случае с PDO этот процесс обычно состоит из двух шагов. (В следующей секции все относится как к UPDATE, так и INSERT)
Тривиальный пример вставки новых данных:
Вообще-то можно сделать то же самое одним методом exec(), но двухшаговый способ дает все преимущества prepared statements. Они помогают в защите от SQL-инъекций, поэтому имеет смысл их использовать даже при однократном запросе.
Prepared Statements
Использование prepared statements укрепляет защиту от SQL-инъекций.
Prepared statement — это заранее скомпилированное SQL-выражение, которое может быть многократно выполнено путем отправки серверу лишь различных наборов данных. Дополнительным преимуществом является невозможность провести SQL-инъекцию через данные, используемые в placeholder’ах.
Ниже находятся три примера prepared statements.
Первый пример здесь лишь для сравнения, его стоит избегать. Разница между безымянными и именными placeholder’ами в том, как вы будете передавать данные в prepared statements.
Безымянные placeholder’ы
Здесь два шага. На первом мы назначаем всем placeholder’ам переменные (строки 2-4). Затем назначаем этим переменным значения и выполняем запрос. Чтобы послать новый набор данных, просто измените значения переменных и выполните запрос еще раз.
Если в вашем SQL-выражении много параметров, то назначать каждому по переменной весьма неудобно. В таких случаях можно хранить данные в массиве и передавать его:
Именные placeholder’ы
Здесь тоже можно передавать массив, но он должен быть ассоциативным. В роли ключей должны выступать, как можно догадаться, имена placeholder’ов.
Одним из удобств использования именных placeholder’ов является возможность вставки объектов напрямую в базу данных, если названия свойств совпадают с именами параметров. Вставку данных, к примеру, вы можете выполнить так:
Преобразование объекта в массив при execute() приводит к тому, что свойства считаются ключами массива.
Выборка данных
FETCH_ASSOC
При этом формате создается ассоциативный массив с названиями столбцов в виде индексов. Он должен быть знаком тем, кто использует расширения mysql/mysqli.
Цикл while() переберет весь результат запроса.
FETCH_OBJ
Данный тип получения данных создает экземпляр класса std для каждой строки.
FETCH_CLASS
При использовании fetch_class данные заносятся в экземпляры указанного класса. При этом значения назначаются свойствам объекта ДО вызова конструктора. Если свойства с именами, соответствующими названиям столбцов, не существуют, они будут созданы автоматически (с областью видимости public).
Если ваши данные нуждаются в обязательной обработке сразу после их получения из базы данных, ее можно реализовать в конструкторе класса.
Для примера возьмем ситуацию, когда вам нужно скрыть часть адреса проживания человека.
При создании объекта все латинские буквы в нижнем регистре должны замениться на x. Проверим:
Если в базе данных адрес выглядит как ’5 Rosebud’, то на выходе получится ’5 Rxxxxxx’.
Конечно, иногда будет требоваться, чтобы конструктор вызывался ПЕРЕД присваиванием значений. PDO такое тоже позволяет.
Теперь, когда вы дополнили предыдущий пример дополнительной опцией (PDO::FETCH_PROPS_LATE), адрес видоизменяться не будет, так как после записи значений ничего не происходит.
Наконец, при необходимости можно передавать конструктору аргументы прямо при создании объекта:
Можно даже передавать разные аргументы каждому объекту:
Другие полезные методы
Хотя эта статья не может (и не пытается) охватить все аспекты работы с PDO (это огромный модуль!), оставить без упоминания следующие несколько функций нельзя.
PHP: PDO быстрый старт, работа с MySQL
Содержание:
PDO (PHP Data Objects) — расширение PHP, которое реализует взаимодействие с базами данных при помощи объектов. Профит в том, что отсутствует привязка к конкретной системе управления базами данных. PDO поддерживает СУБД: MySQL, PostgreSQL, SQLite, Oracle, Microsoft SQL Server и другие.
Почему стоит использовать PDO
Тестовая база данных с таблицей
Установка PDO
Проверить доступные драйвера
Соединение с базой данных
Соединения устанавливаются автоматически при создании объекта PDO от его базового класса.
При ошибке подключения PHP выдаст ошибку:
Подготовленные и прямые запросы
В PDO два способа выполнения запросов:
Прямые запросы
Прямые запросы используются только в том случае, если в запросе отсутствуют переменные и есть уверенность, что запрос безопасен и правильно экранирован.
Подготовленные запросы
Как видно, в случае именованных плейсхолдеров в execute() должен передаваться массив, в котором ключи должны совпадать с именами плейсхолдеров. После этого можно извлечь результаты запроса:
Получение данных. Метод fetch()
Получение данных. Метод fetchColumn()
Получение данных. Метод fetchAll()
PDO и оператор LIKE
Работая с подготовленными запросами, следует понимать, что плейсхолдер может заменять только строку или число. Ни ключевое слово, ни идентификатор, ни часть строки или набор строк через плейсхолдер подставить нельзя. Поэтому для LIKE необходимо сначала подготовить строку поиска целиком, а потом ее подставлять в запрос:
Здесь может вознинуть проблема! Поиск может не работать, потому как из базы у вас приходят данные в неправильной кодировке. Необходимо добавить кодировку в подключение, если она там не указана!
PDO и оператор LIMIT
Решение #1 : Отключить режим эмуляции:
PDO и оператор IN
При выборке из таблицы необходимо доставать записи, соответствующие всем значениям массива.
Добавление записей
Изменение записей
Удаление записей
Использование транзакций
Важно! Транзакции в PDO работают только с таблицами InnoDB
В данной заметке мы познакомились с основными понятиями PDO, его установкой, подключением к БД и самые простые возможности выборки, изменения и удаления данных. В следующих заметках мы рассмотрим ещё несколько тем, касающихся PDO.
Подключение к базе данных в PHP через mysql, pdo и mysqli
Прежде чем подключиться к MySQL серверу необходимо определиться с PHP расширением, которое будет использоваться для работы с базой данных. Под расширением понимается драйвер — посредник между сервером базы и программистом. Он содержит набор функций или объектов, которые упрощают работу программиста. На данный момент выделяют 3 основных расширения.
Все 3 расширения являются стандартным набором для любой хорошей хостинг-площадки. Однако, по умолчанию некоторые могут быть отключены в настройках PHP модулей. Информацию о включенных модулях возвращает функция «phpinfo» с параметром «8».
Доступность модуля можно определить с помощью простой конструкции в коде.
Подключение к MySQL через одноименное расширение
Расширение MySQL появилось первым и долгое время не имело конкурентов. Сейчас считается устаревшим и в серьезных проектах не используется. На это есть ряд причин, основными из которых являются плохая оптимизация и безопасность, отсутствие многопоточности. Несмотря на это, оно ещё долго будет поддерживаться большинством хостингов.
Начиная с PHP версии 5.5 многие функции расширения стали устаревшими, а в PHP 7 и вовсе не поддерживаются.
Рассмотрим пример подключения к базе данных с комментариями.
В качестве запросов используется стандартный SQL. Рассмотрим простые примеры выборки и добавления записей.
В примере производим простую выборку записей из таблицы «books». Результат представлен в качестве ассоциативного массива, поэтому его содержимое можно получить в обычном цикле. Если запрос не возвращает набор данных, то в качестве результата возвращается «false» или «true».
Отличие MySQLi от MySQL
MySQLi пришло на смену MySQL. Буква «i» обозначает улучшенный (Improved). Имеет частичную совместимость со старой версией. Поддерживается всеми версиями PHP. Имеет чуть большую скорость работы и лучшую безопасность. Установлено на 99% хостинговых площадках.
Одной из важных особенностей является наличие объектно-ориентированного интерфейса. Если раньше работы с базой данных осуществлялись при помощи интерфейса функций, то теперь можно использовать оба подхода. Рассмотрим пример подключения к базе данных через MySQLi средствами «ООП».
Так осуществляется простая выборка названий книг из поля «BName» таблицы «books». Вставка и обновление существующих записей так же не отличается сложностью.
В конце запроса осуществляем проверку, удалось ли обновить запись.
Подключение к базе через PDO
PDO — расширение для PHP, которое расшифровывается как PHP Data Objects. Его особенностью является повышенная безопасность и универсальный интерфейс работы с различными базами данных. Другими словами, если с помощью MySQLi можно создавать запросы только для MySQL сервера, то PDO позволяет работать с различными серверами используя один и тот же синтаксис запросов. Это удобно если разработчик заранее не знает под управлением какого сервера будет работать конечный продукт.
У PDO есть свой механизм соединения с базой данных — «DSN» (Data Source Name). Кроме адреса сервера, логина и пароля, он должен принять тип базы данных. Посмотрим пример подключения.
Точно так же осуществляются и другие действия с записями и таблицами. Только меняем SQL запрос и вызываем выполнение методом «exec».
Метод «exec» в отличии от «query» не может получать данные из базы данных. Он возвращает количество записей, которые были затронуты в результате работы SQL запроса.
PDO To Connect to MSSQL Over MSSQL_* Functions
There is a range of mssql_* Which are not in the depreciation process.
They work the same as mysql_* functions; they need to me manually escaped, please find the link to the manual below:
MSSQL_* Functions was apart of php5-mssql but have now been moved into php5-sybase
Furthermore, using PDO for your Database Construct, is available but is experimental http://php.net/manual/en/ref.pdo-dblib.php
But my overall question, from the fact that PDO/MySQLI is being pushed as main database communication solution, should I stop using the functions mssql_*
Or is it possible for:
But if this process is still listed as experimental, should developers using Microsoft SQL Server for their databases, wait till this extension is stable for MSSQL Servers
So at the end of the day, PDO Extension or MSSQL_* Functions even though they are not depreciated.. If so, why?
4 Answers 4
My Own Opinion
I have been using PDO to connect to a MSSQL database for over a year now and so far I have found absolutely no issues.
Logically
I wrote a wrapper class for the PDO class that makes connecting to these databases very easy.
Consider this as an example:
So all that is needed here is a small extension for each database type and it will work.
Whereas, with the native mssql_* functions, if you were to decide to change database for any particular reason, you would have to rewrite everything. Not to mention, you would have to use PDO for MySQL anyway given that the mysql_* functions are now deprecated.
My Testing with PDO
References
Another reason not to use the mssql_* functions is that they are no longer supported on Windows with PHP version 5.3 or later:
The SyBase Extension falls under the same category as the mssql_* functions. They are procedural, impractical and not portable at all!
Functionality
At a glance, I have noticed that none of these extensions have a function equivalent to the mysql_real_escape_string() function. Whereas, in PDO, there is no need for this
Conclusion
It goes without saying that I am a moral PDO supporter (and this has only come after using it for 1 year!). That is not to say I will not listen to other peoples opinions on the mssql_* functions, it will just be very hard to persuade me, and I think most people, that these functions can even compete the PDO.
So to conclude, in my opinion, PDO is the way forward for the following key reasons:
I asked a similar question a while back, and the same conclusion was drawn: