• 締切済み

PHP+MYSQLのストアドプロシージャでエラー

PHP+MySQL+PDOでストアドプロシージャを2回実行すると 「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」 のエラーが発生します。 いろいろ調べたのですが、回避方法が分かりません。 どなたか、お分かりの方がいらっしゃいましたら、ご教授下さい。 宜しくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

補足へのお返事遅くなりましたが、同じprocedure を2回ではないのですね。2回目っていうより、CALL GetMessage() で、返ってくる中身の問題のような気がします。 select 文一つなら、問題ないですけど、2つのselect文を発行していて、カラムリストが異なるとPDO側で受け取れないんじゃなかったかな? phpやMySQLの version にもよるのかもしれません。php5.2.4 の時は、エラーだった気がするけど、php5.3.0 , MySQL5.1.41 で2つのselect文を発行するprocedureのcallを実験したら、エラーにはならないけど、2つ目のselect文内容は受け取れませでした。 あんまり、原因解明にならなくてすみません。

xgolf
質問者

補足

ありがろうございます。 GetMessage()のSelect文は一つです。 問題はversionかも知れませんね。 ちなみに、現象が発生しているVersionはPHPが5.2.9、MySqlが5.1.33でversionを上げれば解決するかも知れませんが、私が使用しているレンタルサーバの各versionが、現象が出ているものより下なのでprocedureを使用するのを、あきらめます。 いろいろ、ご回答頂きありがとうございました。

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

2回実行って、query($sql) メソッドを続けて2回実行という意味ですか? 2回目の queryメソッド実行前に、「前回得られたデータを全部 fetchall() で取り出しておけ」というメッセージのように読みとれるんですが? それとも一回のqueryメソッド実行時に、2行のSQL文を入れたのでしょうか?クエリの発行を2回に分けて、おのおのfetchall()で取り出すしかないかと思いますけど?

xgolf
質問者

補足

ありがとうございます。 2回目のfatchをする前にエラーが返ります。また、1回目のfatchはfatchallで取り出しています。 説明不足でした。具体的なロジックは以下の通りです。 //1回目のストアド //PDO ストアド実行 $sth = $dbo->prepare('CALL login(?,?)'); $sth->bindParam(1,$UserId, PDO::PARAM_STR,10); $sth->bindParam(2,$Pasword, PDO::PARAM_STR,128); $sth->execute(); //ストアドから結果を取り出す $row = $sth->fetchAll(); $sth->closeCursor(); //2回目のストアド //PDO メッセージ取得ストアド実行 $next_sth = $dbo->prepare('CALL GetMessage()'); $next_sth->execute(); --ここでエラーが返ります //ストアドから結果を取り出す $MessageRow = $sth->fetchAll(); $next_sth->closeCursor(); 以上。宜しくお願い致します。

関連するQ&A

  • PHP pdo mysql 周りについて教えてください。

    現在PDOの勉強をしています。 ソースコードを見ると $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); というコードが書いてあって色々と調べたのですが、 fetch()を2回使用すると、エラーとなり、その対処として $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); を使っているのかなと思いました。 しかし、このコードはmysqlのみ対応となっていました。 汎用性を考えるともう一つの対処で、fetch allを使った対処の方が良いのかと思ったのですが、どうでしょうか。 fetchAllだと配列の配列となるそうなので、値をどうやって取れば良いのか悩むところです・・・ あとはmysqlの文字コードですが、よく掲載されているのが、my.cnfを設定し直すということが掲載されていますが、 サーバーに依存すると思ったのであまりこの対処は良くないのかなと思ったりしています。 現段階では、sqlquerybrowserなどで、DBを作成の前に、文字コードを設定して対処していますが、いかがでしょうか。 最後に、上記の対応を行っていた場合など、DBを他の文字コードに変更しなければいけない場合はみなさんはどのように対処しますか? 現場での経験がないので、この疑問に答えて頂けると嬉しいです。

    • 締切済み
    • PHP
  • ストアドプロシージャについて

    アドバイスを頂けたらと思います。 php   5.1.6 mysql   5.0.22 接続方法 PDO PHPよりストアドプロシージャを実行するとEXCUTEの部分で応答がなくなりMYSQLの SHOW PROCESSLIST を確認するとそのプロセスがSleep になってしまっています。 記述方法が間違っているか、またはどこか設定するのか、参考意見を 頂ければと思います。 PHP側 <?php try { $user = 'sys'; $pass = 'sys'; $dbh = new PDO('mysql:host=localhost;dbname=testDB', $user, $pass); if ($st = $dbh->prepare("CALL Listget()") ){ $st->execute(); while ($row = $st->fetch()) { print_r ($row); } } } catch (PDOException $e) { print 'Error: ' . $e->getMessage(). "\n"; } $dbh = null; ?> ストアド delimiter // CREATE PROCEDURE Listget ( ) BEGIN SELECT id FROM testTbl; END // よろしくお願いします。

    • ベストアンサー
    • PHP
  • SELECT文をinclude(SQLとPHP)

    SQLのデータを呼び出すときに <?php function connect() { return new PDO("mysql:dbname=★★★★★;host=★★★★★","★★★★★","★★★★★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } $pdo = connect(); $st = $pdo->query("SELECT * FROM table-name"); $word = $st->fetchAll(); ?> としています。 ここで、テーブル名(ここでは「table-name」)を外部のphpからincludeすることは可能でしょうか? 試したのは、 table-name という内容のphpを 「table.php」というファイル名で同じディレクトリ内に保存。 <?php function connect() { return new PDO("mysql:dbname=★★★★★;host=★★★★★","★★★★★","★★★★★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } $pdo = connect(); $st = $pdo->query("SELECT * FROM {<?php include('table.php'); ?>}"); $word = $st->fetchAll(); ?> としたのですが、反応しませんでした。 そもそもこのようなことが可能かどうかもわかりません。 良い方法がありましたら、ご指導ください。

    • ベストアンサー
    • PHP
  • SELECT文をinclude(SQLとPHP)2

    SQLのデータを呼び出すときに <?php function connect() { return new PDO("mysql:dbname=★★★★★;host=★★★★★","★★★★★","★★★★★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } $pdo = connect(); $st = $pdo->query("SELECT * FROM table-name"); $word = $st->fetchAll(); ?> としています。 ここで、テーブル名(ここでは「table-name」)を外部のphpからincludeすることは可能でしょうか? 試したのは、 table-name という内容のphpを 「table.php」というファイル名で同じディレクトリ内に保存。 <?php function connect() { return new PDO("mysql:dbname=★★★★★;host=★★★★★","★★★★★","★★★★★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } $pdo = connect(); $st = $pdo->query("SELECT * FROM {<?php include('table.php'); ?>}"); $word = $st->fetchAll(); ?> としたのですが、反応しませんでした。 そもそもこのようなことが可能かどうかもわかりません。 良い方法がありましたら、ご指導ください。

    • ベストアンサー
    • PHP
  • 【PHP】PDOでのMysqlから値を取り出す時に

    現在phpを勉強しております。 PDOオブジェクトを生成し、 prepareメソッドでMySQLで実行するクエリをセットして executeメソッドで実行する。 というのを以下のようにしております $pdo= new PDO($dsn, $user, $password); $query = "SELECT * FROM table_name"; $stmt = $pdo->prepare(); $stmt->execute; で、この場合でも正常に動くのですが MySQL内のテーブルに「?」が含まれる場合だと $query = "SELECT * FROM table_name?test"; $stmt = $pdo->prepare(); $stmt->execute; とすると$queryの「?」をバインド変数とみなしてしまい エラーで「?の数とバインド先の変数の数を合わせろ」と出てしまいます。 ですので、「?」をエスケープしようと思い $query = "SELECT * FROM table_name\?test"; としたのですが、結局エスケープされず 同じエラーが出てしまいました。 エスケープできるならエスケープの方法か ?をバインド変数としてみなさない方法か または他の解決方法かを よろしければご教授願います。

    • ベストアンサー
    • PHP
  • PHP disconnect()でエラー

    WAMP初級者です。 いままでPEAR::DBを使って書いていたサイトがあり、PDOを利用するように書き換えています。 画面が真っ白になる現象に陥り、他の投稿によりご指導いただき、画面にエラーが表示されるようになったものの、エラーの対処方法がわからず、どなたかご指導いただければと思います。 コードを一つずつコメントアウトして画面が真っ白になるポイントをさぐったところ、問題の箇所がみつかりました。(ここをコメントアウトすると画面がちゃんと表示され、コメントアウトしないとエラーのみの白い画面がでてしまいます。) ●問題の記述 $connection->disconnect(); ●表示されるエラー Fatal error: Call to undefined method PDO::disconnect() in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test\test2.php on line 406 そもそもこの記述は必要ないのでしょうか? このページ自体は、あるDBからユーザーが検索をした結果が表示されるページになっていて、 まず、以下のように接続をしています。 // 接続 $connection = new PDO('mysql:host=127.0.0.1;dbname=test_db;charset=utf8','root','root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ) ); そのあと、クエリをくみたて、prepareして、値をbindValueしてexecuteして、テーブルを表示させるようにしています。 不特定多数のユーザーが検索をするので、事が終えたらdisconnectしないとダメなんじゃないかな、と思ってつけてみたんですが。。特に不要なのでしょうか。 初歩的な質問ですみませんが、どなたお助けいただけますと幸いです。 環境はApache/2.2.4 (Win32) PHP/5.4.22です 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • SQLで抽出した数字の合計をPHPで算出

    SQLとPHPを使って計算表を作っています。 サンプルとして <?php <?php function connect() { return new PDO("mysql:dbname=★★★★★;host=★★★★★","★★★★★","★★★★★", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } ?> $pdo = connect(); $st = $pdo->query("SELECT * FROM test ORDER BY number"); $number = $st->fetchAll(); ?> <?php foreach ($number as $g) { ?> <?php } ?> で、 http://mottu.link/test/index.php という結果が出てきます。 この数字の合計を一番下に表示したいのですが、どのようにすればよいでしょうか? 何卒よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+MySQL PDOで上手く抽出するには?

    PDOでクエリを実行する際にIN句で該当するカラムを複数取得したいのですがうまく抽出できません。 下記のSQL文で抽出するとid = '104' の1件のみ抽出できて id = '101' と '103' は抽出できないのです。 $param = array(101, 103, 104); $place_holders = implode(',', array_fill(0, count($param), '?')); $wbl = $pdo->prepare("SELECT id FROM tables WHERE id IN ($place_holders)"); $wbl->execute($data); $ecs = $wbl->fetchAll(); foreach ($ecs as $val) { $result = $val; } print_r($result); 試しにphpMyAdmin上で直接クエリを実行すると抽出できるのですが PDOで残りの101と103を取得するにはどうしたら良いでしょうか? 何か良い方法はありますでしょうか? どうぞ宜しくお願いします。m(__)m

    • ベストアンサー
    • PHP
  • mysql_queryがある場所について

    ZendFramework-1.11.7を使用しています。 Zend_DbでPdo_Mysqlで接続して利用しています。 そこで、クエリを実際に実行している箇所を探しているのですが、 ソースの中にmysql_queryが見つからないのです・・・ PHPとかでSQLを発行したい場合にはmysql_queryでやるんですよね?? ┬ Zend │└ Db │ ├ Statement.php ファイルには public function execute(array $params = null) { /* * Simple case - no query profiler to manage. */ if ($this->_queryId === null) { return $this->_execute($params); } があるのですが、これは $this->_execute($params); を実行していて ┬ Zend │└ Db │ ├ Statement │ │ ├ Pdo.php ファイルには public function _execute(array $params = null) { try { if ($params !== null) { return $this->_stmt->execute($params); } else { return $this->_stmt->execute(); } があるのですが、これは $this->_stmt->execute(); を実行しているようなのです。 なんか行ったり来たり(^^;)していて最終的にどこでSQLを発行(mysql_queryを実行)しているのかが フォルダ全体を文字列検索しても見つからないのです・・・ _stmtが何のオブジェクトなのかが定かではないので、追跡しづらいのかもしれませんが、 どこでSQLを発行しているのか教えて頂けないでしょうか?

    • ベストアンサー
    • PHP
  • PHPでmysqlへの書き込みでエラー

    PHPとmysqlを最近勉強し始めました。 PHPでmysqlへデータベースの書き込みをする時に変数からデータを書き込むとエラーが出て、どうしてなのかが色々と検索してみたのですが、解決できずにいます。 どなたかご教示ください。 弁当の注文を把握するために作りました。 mysqlには ソースは以下の通りです。 表示だけなら、全項目表示は出来ます。 データベースに書き込みんで貯めたいのですが、phpmyadminでデータを記入し、SQL実行ならできました。 mysqlには order というテーブルに  orderid int(5) syain varchar(11) syohinmei varchar(11) kingaku int(11) timestamp datetime 上記のカラムが作成してあります。 <?php $gokojo = $_GET['gokojo']; $syain = $_GET['syain']; $bento = $_GET['bento']; $orderkojo = $_GET['orderkojo']; $syohinmei = $_GET['syohinmei']; $kingaku = $_GET['kingaku']; $db_user = "naka"; // ユーザー名 $db_pass = "naka"; // パスワード $db_host = "192.168.0.9"; // ホスト名 $db_name = "bento"; // データベース名 $db_type = "mysql"; // データベースの種類 $dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8"; try { $pdo = new PDO($dsn, $db_user,$db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch(PDOException $Exception) { die('エラー :' . $Exception->getMessage()); } $timestamp = date("Y-m-d H:i:s") ; try { $pdo->beginTransaction(); $sql = 'INSERT INTO order(syain,syohinmei,kingaku,timestamp) VALUES("'.$syain.'","'.$syohinmei.'",'.$kingaku.',"'.$timestamp.'")'; $stmh = $pdo->prepare($sql); $stmh->bindValue(':syain',$syain,PDO::PARAM_STR); $stmh->bindValue(':syohinmei',$syohinme,PDO::PARAM_STR); $stmh->bindValue(':kingaku',$kingaku,PDO::PARAM_INT); $stmh->bindValue(':timestamp',$timestamp,PDO::PARAM_STR); $stmh->execute(); $pdo->commit(); print "データを更新しました。<br>"; } catch (PDOException $Exception) { $pdo->rollBack(); print "エラー:" . $Exception->getMessage(); } ?> エラーは以下の通りです。 エラー:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order(syain,syohinmei,kingaku,timestamp) VALUES("中川","サンマ弁当",450,"' at line 1 Syntax error なので、コマンドの間違えなのだろうと思いますが、解決できません。 同じことを二回してますが、片方ずつでやってもダメなので、色々試してます。 よろしくお願いします。

    • ベストアンサー
    • MySQL