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()
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.default_socket | "/tmp/mysql.sock" | INI_SYSTEM |
pdo_mysql.debug | NULL | INI_SYSTEM |
以下に設定ディレクティブに関する 簡単な説明を示します。
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()
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.
> 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.