PDOのエラー

PHP

PDOのエラー

General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

メッセージの通り、fetchで値を取得すると↑のようなエラーメッセージが出るようです。
PDOのモードを

 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY

にするとエラーはでなくなりますが、思った通りの動きをしないことも。

値をfetchAllで取るようにした方がよいようです。

参考:http://php.oss.eznetsols.org/manual/ja/function.PDO-exec.php

PDOでMySQLに接続

PHP
MySQL

PDOでMySQLに接続

PDOはPHP Data Objects (PDO) 拡張モジュールの略で、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイス、だそうです。
PEARとどっちがいいのでしょうか?
とりあえず、使ってみました。

MySQLへの接続方法です。

解説:tryブロックで接続を試し、catchでエラーを取得します。

 <?php
 try{
 //dbnameにはデータベース名、hostはホスト名、user1の部分はデータベースアカウント名、passの部分はデータベースパスワードです。
 $dbh = new  PDO('mysql:dbname=PDOtest;host=localhost','user1','pass');
 //エラーモードの指定
 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 //試しにデータを入れてみます。testテーブル内にhogegeというデータを入れます。
 //testテーブルは別途作成しておいてください。
 $sql='INSERT INTO test VALUES("hogege")';
 $stmt=$dbh->query($sql);
 }
 //エラーがあれば、出力します。
 catch(PDOException $e){
 echo $e->getMessage();
  }
  
 ?>

以上です。

PDO prepareメソッド

PHP

PDOを使用する際、query()メソッドでもSQL文を実行することができますが、prepare()というメソッドを使用すると、値だけが変わるSQL文を何度も実行する場合は、変化する値だけを与えて実行することで、実行のコストを下げることができます。

また、SQLインジェクション対策にもなりますので、やってみましょう!

例:(id=1, name=’naruto’),(id=2, name=’sasuke’)という配列を、namelistというテーブルに挿入する

 //データベースへ接続 例ではsqliteになってますが、適宜環境に応じて変更してください
 $dbh=newPDO('sqlite:/******');
 
 //prepareによる実行準備
 
 $sql="INSERT INTO namelist (id,name)
 VALUES(:id,:name)";
 
 $stmt=$dbh->prepare($sql);
 
 //データの配列
 
 $names=array(array('id'=>1, 'name'=> 'naruto'),
 array('id'=>2, 'name' => 'sasuke')); 
 
 //配列の値を、一つずつexecuteを使って実行
 foreach($names as $name){	
 $stmt->execute($name);
 }

参考
PDOでMySQLに接続

PDO General error 2014

PHP
MySQL

サーバーによっては、次のようなエラーが出ることがあります。

 SQLSTATE[HY000]: 
 General error: 2014 Cannot execute queries while other unbuffered queries are active. 
 Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, 
 you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

私の場合は、fetchで取得していたデータをfetchAllで取得するように直したら治りました。(エラーメッセージの指示の通りですが)

ほかにも、下記のPHPサイトでは、MySQLクライアントをアップデートしたら治ったとか、SQLを一個ずつ処理するようにすれば治る、などと記載があります。
http://php.net/manual/en/ref.pdo-mysql.php

PDO

PHP
PDOのエラー

PDOは PHP Data Objects (PDO)の略で、この拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。

参考:http://php.oss.eznetsols.org/manual/ja/ref.pdo.php