# MySQL 関数 (PDO_MYSQL)

## はじめに

PDO_MYSQL は、PHP から MySQL 3.x、4.x および 5.x データベースへのアクセスを可能にするための PHP Data Objects (PDO) インターフェイス を実装したドライバです。

PDO_MYSQL は、MySQL 4.1 以降に存在するプリペアドステートメントを ネイティブにサポートしているという利点があります。 古いバージョンの mysql クライアントライブラリを使用している場合は、 PDO がこの機能をエミュレートします。

警告

注意: MySQL のテーブル型 (ストレージエンジン) の中には、 トランザクションをサポートしていないものがあります。 トランザクションをサポートしていないテーブル型を使用して トランザクションを使用するコードを書くと、 MySQL はトランザクションが正常に使用できたかのように振舞います。 さらに、DDL クエリを実行する際には、 実行中のトランザクションが暗黙的にコミットされます。

## インストール手順

一般的な 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 ベースライブラリの場所です。どのライブラリを選べばいいのかについての詳細は 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 への接続 について確認しましょう。

変更履歴
バージョン | 説明
--- | ---
5.4.0 | PDO_MYSQL をコンパイルするときのデフォルトの MySQL ライブラリが mysqlnd になりました。 これまでは libmysqlclient をデフォルトで使っていました。
5.4.0 | MySQL クライアントライブラリ 4.1 を含む、それ以前のバージョンはサポートされなくなりました。
5.3.9 | mysqlnd と OpenSSL による SSL サポートが追加されました。
5.3.7 | libmysqlclient と OpenSSL による SSL サポートが追加されました。

## 定義済み定数

このドライバでは以下の定数が定義されて います。これは拡張モジュールが PHP に組み込まれているか、実行時に動的にロード されている場合のみ使用可能です。さらに、これらのドライバ固有の定数は そのドライバを使用している場合にのみ使用されます。 あるドライバ固有の属性を別のドライバで使うと、予期せぬ結果を引き起こします。 もし複数のドライバを使用しているコードを実行している場合、 PDO::getAttribute() で `PDO::ATTR_DRIVER_NAME` 属性を使用することで、使用中のドライバ名を調べることが可能です。

`PDO::MYSQL_ATTR_USE_BUFFERED_QUERY` (integer)
  PDOStatement でこの属性を `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` (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 MiB です。 mysqlnd を指定してコンパイルした場合は、この定数はサポートされていません。

`PDO::MYSQL_ATTR_DIRECT_QUERY` (integer)

  プリペアドステートメントではなく、直接クエリを実行します。

`PDO::MYSQL_ATTR_FOUND_ROWS` (integer)

  変更された行数ではなく、見つかった (マッチした) 行数を返します。

`PDO::MYSQL_ATTR_IGNORE_SPACE` (integer)

  関数名の後に続く空白を許可します。 すべての関数名を予約語にします。

`PDO::MYSQL_ATTR_COMPRESS` (integer)

  ネットワーク通信の圧縮を有効にします。PHP 5.3.11 以降では、 mysqlnd を使ってコンパイルした場合でもサポートされています。

`PDO::MYSQL_ATTR_SSL_CA` (integer)

  これが使えるようになった PHP のバージョンは 5.3.7.

`PDO::MYSQL_ATTR_SSL_CAPATH` (integer)

  これが使えるようになった PHP のバージョンは 5.3.7.

`PDO::MYSQL_ATTR_SSL_CERT` (integer)

  これが使えるようになった PHP のバージョンは 5.3.7.

`PDO::MYSQL_ATTR_SSL_CIPHER` (integer)

  これが使えるようになった PHP のバージョンは 5.3.7.

`PDO::MYSQL_ATTR_SSL_KEY` (integer)

  これが使えるようになった PHP のバージョンは 5.3.7.

`PDO::MYSQL_ATTR_MULTI_STATEMENTS` (integer)

  `FALSE` にすると、PDO::prepare() や PDO::query() でのマルチクエリの実行を無効にします。

  この定数が使えるのは、データベースハンドルを新規作成する際の `driver_options` 配列内だけであることに注意しましょう。

  これが使えるようになった PHP のバージョンは 5.5.21 および PHP 5.6.5。

## 実行時設定

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

PDO_MYSQL 設定オプション
名前 | デフォルト | 変更可能
--- | --- | ---
pdo_mysql.default_socket | "/tmp/mysql.sock" | PHP_INI_SYSTEM
pdo_mysql.debug | NULL | PHP_INI_SYSTEM

PHP_INI_* モードの詳細および定義については どこで設定を行うのか を参照してください。

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

`pdo_mysql.default_socket` string

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

`pdo_mysql.debug` boolean

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

## 目次

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