PHP PDO PDO: connecting to MySQL/MariaDB server
There are two ways to connect to a MySQL/MariaDB server, depending on your infrastructure.
Standard (TCP/IP) connection
$dsn = 'mysql:dbname=demo;host=server;port=3306;charset=utf8'; $connection = new \PDO($dsn, $username, $password); // throw exceptions, when SQL error is caused $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); // prevent emulation of prepared statements $connection->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
Since PDO was designed to be compatible with older MySQL server versions (which did not have support for prepared statements), you have to explicitly disable the emulation. Otherwise, you will lose the added injection prevention benefits, that are usually granted by using prepared statements.
Another design compromise, that you have to keep in mind, is the default error handling behavior. If not otherwise configured, PDO will not show any indications of SQL errors.
It is strongly recommended setting it to «exception mode», because that gains you additional functionality, when writing persistence abstractions (for example: having an exception, when violating UNIQUE constraint).
Socket connection
$dsn = 'mysql:unix_socket=/tmp/mysql.sock;dbname=demo;charset=utf8'; $connection = new \PDO($dsn, $username, $password); // throw exceptions, when SQL error is caused $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); // prevent emulation of prepared statements $connection->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
On unix-like systems, if host name is ‘localhost’ , then the connection to the server is made through a domain socket.
PDF — Download PHP for free
MySQL Functions (PDO_MYSQL)
PDO_MYSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to MySQL 3.x, 4.x and 5.x databases.
PDO_MYSQL will take advantage of native prepared statement support present in MySQL 4.1 and higher. If you’re using an older version of the mysql client libraries, PDO will emulate them for you.
Beware: Some MySQL table types (storage engines) do not support transactions. When writing transactional database code using a table type that does not support transactions, MySQL will pretend that a transaction was initiated successfully. In addition, any DDL queries issued will implicitly commit any pending transactions.
Установка
Используйте —with-pdo-mysql[=DIR] для установки расширения PDO MySQL, где необязательный параметр [=DIR] указывает директорию, где установлена MySQL. Если mysqlnd передается в параметре [=DIR], то будет использован родной драйвер MySQL.
Дополнительный параметр —with-mysql-sock[=DIR] указывает расположение unix-сокета MySQL для всех MySQL расширений, включая PDO_MYSQL. Если параметр не указан, поиск производится в директориях по умолчанию.
Дополнительный параметр —with-zlib-dir[=DIR] используется как префикс пути к libz.
$ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock
Поддержка SSL включается, используя соответствующую константу PDO_MySQL, которая эквивалентна вызову » MySQL C API функции mysql_ssl_set(). К тому же SSL не может быть включен с помощью PDO::setAttribute, потому что соединение уже существует. Смотрите документацию MySQL о » подключении к MySQL с SSL.
Версия | Описание |
---|---|
5.4.0 | Клиентские библиотеки MySQL версии 4.1 и ниже больше не поддерживаются. |
5.3.9 | Добавлена поддержка SSL в mysqlnd с OpenSSL. |
5.3.7 | Добавлена поддержка SSL в libmysqlclient с OpenSSL. |
Предопределенные константы
Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого расширения или данное расширение было подгружено динамически во время выполнения. Вдобавок, эти драйверо-зависимые константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO_ATTR_DRIVER_NAME для проверки драйвера.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY ( integer ) Если этот атрибут установлен в TRUE в PDOStatement, MySQL драйвер будет использовать буферизованные версии MySQL API. Если вы пишете переносимый на другие библиотеки код, вы должны использовать PDOStatement::fetchAll() .
Пример #1 Буферизация запросов в MySQL
if ( $db -> getAttribute ( PDO :: ATTR_DRIVER_NAME ) == ‘mysql’ ) $stmt = $db -> prepare ( ‘select * from foo’ ,
array( PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY => true ));
> else die( «my application only works with mysql; I should use \$stmt->fetchAll() instead» );
>
?>?php
PDO::MYSQL_ATTR_LOCAL_INFILE ( integer )
Включить LOAD LOCAL INFILE.
Обратите внимание, что эта константа может быть использована только в массиве driver_options при создании дескриптора новой базы данных.
PDO::MYSQL_ATTR_INIT_COMMAND ( integer )
Команда, которую необходимо выполнить при подключении к MySQL серверу. Также будет автоматически выполнена при переподключении.
Обратите внимание, что эта константа может быть использована только в массиве driver_options при создании дескриптора новой базы данных.
PDO::MYSQL_ATTR_READ_DEFAULT_FILE ( integer )
Чтение именованных параметров из файла my.cnf . Эта опция не доступна, если используется mysqlnd, потому что mysqlnd не читает файлы конфигурации MySQL.
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP ( integer )
Чтение именованной группы параметров из файла my.cnf или из файла, определенного в константе MYSQL_READ_DEFAULT_FILE . Эта опция не доступна, если используется mysqlnd, потому что mysqlnd не читает файлы конфигурации MySQL.
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE ( integer )
Максимальный размер буфера. По умолчанию равен 1 Мб. Эта константа не поддерживается при компиляции вместе с mysqlnd.
PDO::MYSQL_ATTR_DIRECT_QUERY ( integer )
Выполнять прямые запросы, не использовать подготовленные конструкции.
PDO::MYSQL_ATTR_FOUND_ROWS ( integer )
Возвращает количество найденных (совпавших) строк (не количество измененных строк).
PDO::MYSQL_ATTR_IGNORE_SPACE ( integer )
Разрешает пробелы после имен функций. Делает все имена функций зарезервированными словами.
PDO::MYSQL_ATTR_COMPRESS ( integer )
Включить сжатие сетевого соединения. Эта константа не поддерживается при компиляции вместе с mysqlnd.
PDO::MYSQL_ATTR_SSL_CA ( integer )
Путь к файлу сертификата SSL.
Существует, начиная с PHP 5.3.7.
PDO::MYSQL_ATTR_SSL_CAPATH ( integer )
Путь к директории, которая содержит SSL сертификаты доверенных центров (CA), хранящиеся в формате PEM.
Существует, начиная с PHP 5.3.7.
PDO::MYSQL_ATTR_SSL_CERT ( integer )
Путь к файлу с SSL сертификатом.
Существует, начиная с PHP 5.3.7.
PDO::MYSQL_ATTR_SSL_CIPHER ( integer )
Список из одного или более допустимых шифров для использования в SSL шифровании в формате, который понимает OpenSSL. Например: DHE-RSA-AES256-SHA:AES128-SHA
Существует, начиная с PHP 5.3.7.
PDO::MYSQL_ATTR_SSL_KEY ( integer )
Путь к файлу с ключом SSL.
Существует, начиная с PHP 5.3.7.
Настройка во время выполнения
Поведение этих функций зависит от установок в php.ini .
Имя | По умолчанию | Меняемо |
---|---|---|
pdo_mysql.default_socket | «/tmp/mysql.sock» | PHP_INI_SYSTEM |
pdo_mysql.debug | NULL | PHP_INI_SYSTEM |
Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.
Краткое разъяснение конфигурационных директив.
Sets a Unix domain socket. This value can either be set at compile time if a domain socket is found at configure. This ini setting is Unix only.
Enables debugging for PDO_MYSQL. This setting is only available when PDO_MYSQL is compiled against mysqlnd and in PDO debug mode.