ConFoo 2025

MySQL 関数 (PDO_MYSQL)

はじめに

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 7.4.4 以降で完全にサポートされました。 これより前のバージョンでは、 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::ATTR_SSL_* を指定します。これは » 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)
Pdo\Mysql::ATTR_USE_BUFFERED_QUERY のエイリアス
PDO::MYSQL_ATTR_LOCAL_INFILE (int)
Pdo\Mysql::ATTR_LOCAL_INFILE のエイリアス
PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY (int)
Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY のエイリアス PHP 8.1.0 以降で利用可能です。
PDO::MYSQL_ATTR_INIT_COMMAND (int)
Pdo\Mysql::ATTR_INIT_COMMAND のエイリアス
PDO::MYSQL_ATTR_READ_DEFAULT_FILE (int)
Pdo\Mysql::ATTR_READ_DEFAULT_FILE のエイリアス
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (int)
Pdo\Mysql::ATTR_READ_DEFAULT_GROUP のエイリアス
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (int)
Pdo\Mysql::ATTR_MAX_BUFFER_SIZE のエイリアス
PDO::MYSQL_ATTR_DIRECT_QUERY (int)
PDO::ATTR_EMULATE_PREPARES のエイリアス
PDO::MYSQL_ATTR_FOUND_ROWS (int)
Pdo\Mysql::ATTR_FOUND_ROWS のエイリアス
PDO::MYSQL_ATTR_IGNORE_SPACE (int)
Pdo\Mysql::ATTR_IGNORE_SPACE のエイリアス
PDO::MYSQL_ATTR_COMPRESS (int)
Pdo\Mysql::ATTR_COMPRESS のエイリアス
PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY (int)
Pdo\Mysql::ATTR_SERVER_PUBLIC_KEY のエイリアス
PDO::MYSQL_ATTR_SSL_CA (int)
Pdo\Mysql::ATTR_SSL_CA のエイリアス
PDO::MYSQL_ATTR_SSL_CAPATH (int)
Pdo\Mysql::ATTR_SSL_CAPATH のエイリアス
PDO::MYSQL_ATTR_SSL_CERT (int)
Pdo\Mysql::ATTR_SSL_CERT のエイリアス
PDO::MYSQL_ATTR_SSL_CIPHER (int)
Pdo\Mysql::ATTR_SSL_CIPHER のエイリアス
PDO::MYSQL_ATTR_SSL_KEY (int)
Pdo\Mysql::ATTR_SSL_KEY のエイリアス
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (int)
Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT のエイリアス
PDO::MYSQL_ATTR_MULTI_STATEMENTS (int)
Pdo\Mysql::ATTR_MULTI_STATEMENTS のエイリアス

実行時設定

php.ini の設定により動作が変化します。

PDO_MYSQL 設定オプション
名前 デフォルト 変更可能
pdo_mysql.default_socket "/tmp/mysql.sock" INI_SYSTEM
pdo_mysql.debug NULL INI_SYSTEM
INI_* モードの詳細および定義については どこで設定を行うのか を参照してください。

以下に設定ディレクティブに関する 簡単な説明を示します。

pdo_mysql.default_socket string

Unix ドメインソケットを設定します。 configure の際にドメインソケットが見つかれば、 この値はコンパイル時にも設定されます。この ini 設定は Unix でのみ使えます。

pdo_mysql.debug bool

PDO_MYSQL のデバッグ機能を有効にします。 この設定が有効になるのは、mysqlnd を使って PDO_MYSQL をでコンパイルし、 かつ PDO がデバッグモードであるときだけです。

目次

add a note

User Contributed Notes 3 notes

up
6
davey at php dot net
17 years ago
To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

It will not work when passed into PDO::prepare()
up
5
brian at diamondsea dot com
16 years ago
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

After spending hours trying to track down why we were getting this error on a new server, after the same code ran fine on other servers, we found the problem to be an old MySQL _client_ library running on our web server, and a latest-version MySQL _server_ running on the database server's box.

Upgraded the MySQL client on the web server to the current revision and the problem went away.
up
-1
snoyes at gmail dot com
1 month ago
> change it by setting default_authentication_plugin=mysql_native_password in my.cnf

This only works in MySQL 8.0. The default_authentication_plugin variable has been removed from 8.4.
To Top