# MySQL PDO ドライバ (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` (bool)
  `PDO::ATTR_EMULATE_PREPARES` のエイリアス PHP 8.4.0 以降、この定数は bool として型付けされています。 それ以前は、int として型付けされていました。
`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` のエイリアス PHP 7.0.18 および、PHP 7.1.4 以降で利用可能です。
`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 がデバッグモードであるときだけです。

## 目次

- PDO_MYSQL DSN — MySQL データベースに接続する

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open