PDO_MYSQL は、PHP から MySQL データベースへのアクセスを可能にするための PHP Data Objects (PDO) インターフェイス を実装したドライバです。
PDO_MYSQLは、 デフォルトでエミュレートされたプリペアドステートメントを使います。
MySQL 8
PHP 7.1.16 より前のバージョン、もしくは PHP 7.2.4 より前の 7.2系の PHP では、 MySQL 8 サーバのデフォルトパスワードプラグインを mysql_native_password に設定するようにしてください。 さもないと、 The server requested authentication method unknown to the client [caching_sha2_password] のようなエラーを見ることになります。たとえあなたが caching_sha2_password を使っていなくても、です。
これは MySQL 8 のデフォルトが 古い PHP (mysqlnd)
のリリースが認識していないプラグイン caching_sha2_password だからです。
かわりに、my.cnf の設定を
default_authentication_plugin=mysql_native_password
と変更してください。
caching_sha2_password プラグインは、
将来のPHPのリリースでサポートされます。
しばらくの間は、 mysql_xdevapi
拡張機能がサポートを行うことになるでしょう。
注意: MySQL のテーブル型 (ストレージエンジン) の中には、 トランザクションをサポートしていないものがあります。 トランザクションをサポートしていないテーブル型を使用して トランザクションを使用するコードを書くと、 MySQL はトランザクションが正常に使用できたかのように振舞います。 さらに、DDL クエリを実行する際には、 実行中のトランザクションが暗黙的にコミットされます。
注意:
MySQL ドライバは、 PDOStatement::bindParam() メソッドで
PDO::PARAM_INPUT_OUTPUT
を適切にサポートしていません。使うことはできますが、 値が更新されません。(つまり、出力が無視されています)
一般的な Unix ディストリビューションには、バイナリ版の PHP がインストールされています。 これらのバイナリ版は、通常は MySQL 拡張モジュールを有効にしてビルドされています。 しかし、拡張モジュールのライブラリ自身を別パッケージでインストールする必要があるでしょう。 使用しているディストリビューションのパッケージマネージャで確認してみましょう。
たとえば Ubuntu なら、php5-mysql
パッケージをインストールすれば、
ext/mysql、ext/mysqli、そして pdo_mysql をインストールできます。CentOS の場合は
php-mysql
パッケージを使えば、同じものをインストールできます。
この拡張モジュールを自分でコンパイルすることもできます。 PHP をソースからビルドすれば、使いたい MySQL 拡張モジュールを指定したり 各拡張モジュールが使用するクライアントライブラリを選択したりすることができます。
--with-pdo-mysql[=DIR] で
PDO MySQL 拡張モジュールをインストールします。オプションの [=DIR]
は、MySQL ベースライブラリの場所です。
Mysqlnd
がデフォルトのベースライブラリです。
どのライブラリを選べばいいのかについての詳細は
MySQL ライブラリの選択
を参照ください。
オプションの --with-mysql-sock[=DIR] で MySQL unix ソケットの場所を指定することができます。これは PDO_MYSQL を含むすべての 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 のドキュメントで » SSL を使った MySQL への接続 について確認しましょう。
このドライバでは以下の定数が定義されて
います。これは拡張モジュールが PHP に組み込まれているか、実行時に動的にロード
されている場合のみ使用可能です。さらに、これらのドライバ固有の定数は
そのドライバを使用している場合にのみ使用されます。
あるドライバ固有の属性を別のドライバで使うと、予期せぬ結果を引き起こします。
もし複数のドライバを使用しているコードを実行している場合、
PDO::getAttribute() で PDO::ATTR_DRIVER_NAME
属性を使用することで、使用中のドライバ名を調べることが可能です。
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
(int)
true
に設定すると、
MySQL ドライバはバッファ版の MySQL API を使用します。
移植性の高いコードを書くには、代わりに
PDOStatement::fetchAll() を使用すべきです。
例1 mysql でクエリのバッファリングを強制する
<?php
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
$stmt = $db->prepare('select * from foo',
array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
} else {
die("このアプリケーションは mysql でしか動作しません。代わりに \$stmt->fetchAll() を使用すべきです");
}
?>
PDO::MYSQL_ATTR_LOCAL_INFILE
(int)
LOAD LOCAL INFILE
を有効にします。
この定数を使うのは、新しいデータベースハンドルを作るときの
driver_options
配列内だけであることに注意しましょう。
PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY
(string)
LOCAL DATA 文によるファイルのロードを、 ここで指定したディレクトリに制限する機能を有効にします。 PHP 8.1.0 以降で利用可能です。
この定数を使うのは、新しいデータベースハンドルを作るときの
driver_options
配列内だけであることに注意しましょう。
PDO::MYSQL_ATTR_INIT_COMMAND
(string)
MySQL サーバーへの接続時に実行するコマンドを指定します。 再接続の際には自動的に再実行されます。
この定数を使うのは、新しいデータベースハンドルを作るときの
driver_options
配列内だけであることに注意しましょう。
PDO::MYSQL_ATTR_READ_DEFAULT_FILE
(int)
my.cnf ではなく、 指定した名前のファイルからオプションを読み込みます。 このオプションは、mysqlnd を使っている場合は利用できません。 mysqlnd は mysql の設定ファイルを読んでいないからです。
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP
(int)
my.cnf あるいは
別のファイル (MYSQL_READ_DEFAULT_FILE
で指定したもの) の中の、指定した名前のグループからオプションを読み込みます。
このオプションは、mysqlnd を使っている場合は利用できません。
mysqlnd は mysql の設定ファイルを読んでいないからです。
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE
(int)
バッファの最大サイズ。デフォルトは 1 MiB です。 mysqlnd を指定してコンパイルした場合は、この定数はサポートされていません。
PDO::MYSQL_ATTR_DIRECT_QUERY
(int)
プリペアドステートメントではなく、直接クエリを実行します。
PDO::MYSQL_ATTR_FOUND_ROWS
(int)
変更された行数ではなく、見つかった (マッチした) 行数を返します。
PDO::MYSQL_ATTR_IGNORE_SPACE
(int)
関数名の後に続く空白を許可します。 すべての関数名を予約語にします。
PDO::MYSQL_ATTR_COMPRESS
(int)
ネットワーク通信の圧縮を有効にします。
PDO::MYSQL_ATTR_SSL_CA
(int)
SSL 認証局のファイルパス。
PDO::MYSQL_ATTR_SSL_CAPATH
(int)
信頼済みのSSL認証局の証明書が入ったディレクトリパス。 証明書は、PEM フォーマットで格納されています。
PDO::MYSQL_ATTR_SSL_CERT
(int)
SSL 証明書のファイルパス。
PDO::MYSQL_ATTR_SSL_CIPHER
(int)
SSL 暗号化に使うひとつ以上の暗号の一覧。
OpenSSL で有効なフォーマットで指定します。
例: DHE-RSA-AES256-SHA:AES128-SHA
PDO::MYSQL_ATTR_SSL_KEY
(int)
SSL キーのファイルパス。
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT
(int)
サーバの SSL 証明書の検証を無効にする方法を提供します。
これが使えるようになった PHP のバージョンは 7.0.18 および PHP 7.1.4.
PDO::MYSQL_ATTR_MULTI_STATEMENTS
(int)
false
にすると、PDO::prepare()
や PDO::query() でのマルチクエリの実行を無効にします。
この定数が使えるのは、データベースハンドルを新規作成する際の driver_options
配列内だけであることに注意しましょう。
php.ini の設定により動作が変化します。
名前 | デフォルト | 変更可能 |
---|---|---|
pdo_mysql.default_socket | "/tmp/mysql.sock" | PHP_INI_SYSTEM |
pdo_mysql.debug | NULL | PHP_INI_SYSTEM |
以下に設定ディレクティブに関する 簡単な説明を示します。
pdo_mysql.default_socket
string
Unix ドメインソケットを設定します。 configure の際にドメインソケットが見つかれば、 この値はコンパイル時にも設定されます。この ini 設定は Unix でのみ使えます。
pdo_mysql.debug
bool
PDO_MYSQL のデバッグ機能を有効にします。 この設定が有効になるのは、mysqlnd を使って PDO_MYSQL をでコンパイルし、 かつ PDO がデバッグモードであるときだけです。