• 締切済み

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を他の文字コードに変更しなければいけない場合はみなさんはどのように対処しますか? 現場での経験がないので、この疑問に答えて頂けると嬉しいです。

みんなの回答

noname#90314
noname#90314
回答No.1

fetch は 結果をバッファにおいた状態で行読み fetchall は 結果全体を取り込むので即リソース開放されます。 fetch で データを所得し終わったら closeCursor などしてあげると 次のSQLを投げられるようになります。 また 単一レコードを所得するSQLでのfetch all の場合は $result = $res->fetchall() された場合は $result[0] に fetch したのと同じデータが入ります。

apache2009
質問者

補足

回答ありがとうございました。 >fetch は 結果をバッファにおいた状態で行読み fetchall は 結果全体を取り込むので即リソース開放されます。 要するにバッファとはメモリのようなものでしょうか。 fetchallの場合、バッファに置いた状態で読み込むことができないので、 closeCursorが使えないという認識で大丈夫ですか? Mysqlじゃなくても、 fecth(),closeCursorは使えますよね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PDOで取得される値がすべて文字列になる

    xamppを標準インストールした環境にてPHPのPDOを利用したデータベース処理を試しているのですが、SELECTで取得した値がすべて文字列として返されます。 $db = new PDO("sqlite:sample.db"); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $rs = $db->query("select 1 as res"); $rs = $rs->fetch(); 結果: array(1) ( [res] => (string) 1 ) これに加え、やや強引なテストを行ってみたのですが、こちらも結果は同じく文字列となりました $db = new PDO("sqlite:sample.db"); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $rs = $db->prepare("select ? as res"); $rs->bindValue(1, 1, PDO::PARAM_INT); $rs->execute(); $rs = $rs->fetch(); この現象を回避するにはどのようにすればよいでしょうか。

    • ベストアンサー
    • 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
  • DB接続の関数化

    下記のデータベースに接続する関数の意味は「MySQLに接続して、PDOクラスで接続したデータベース情報を返す」で合っていますか? function get_db_connect(){ // MySQL用のDSN文字列 $dsn = 'mysql:dbname='. DB_NAME .';host='. DB_HOST .';charset='.DB_CHARSET; try { // データベースに接続する $dbh = new PDO($dsn, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4')); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch (PDOException $e) { exit('接続できませんでした。理由:'.$e->getMessage() ); } return $dbh; }

    • ベストアンサー
    • PHP
  • PDOを使いたい

    PHP初心者です PHP 5.2.5 MySQL 5.1.22 PDOでMYSQLに接続するにはどうすればいいのでしょうか? いままではこんな感じでしたがPDOにするとどんな感じになるんですか? $link=mysql_connect('localhost', 'user', 'pass')or die(mysql_error()); mysql_select_db(user'); mysql_query('SET NAMES UTF8'); PDOで接続する方法らしいのですが疑問を持ってしまったので教えてください 質問1 最初の$db_nameや$passなどの変数のとこに直接、localhostと書くのはまずいですか? 質問2 古いMYSQL系はカッコで囲めばいいので簡単だったのですがPDOの記号の意味を教えてください->とか=>です 質問3 PDO::ATTR_EMULATE_PREPARESは指定する必要があるんでしょうか?指定しないとパフォーマンスが下がるんですか?PDO::ATTR_EMULATE_PREPARESとはなんでしょうか? try { $pdo = new PDO("mysql:dbname=$db_name;host=$serv","$user","$pass", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8`")); } catch (PDOException $e) { die($e->getMessage()); } よろしくお願いします

    • ベストアンサー
    • PHP
  • 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
  • MySQL nuexpected(T_STRING

    ローカル開発環境にてphpとMysql接続の勉強をしている者です。 下記コードにて   } catch (PDOException $e) { 行にunexpected (T_STRING)と出て詰まっています スペルミスの注意して確認しましたが一人ではどうにも解りません...わかる方回答お願いしますm(_ _)m <?php define('DB_DATABASE', 'takagi_db'); define('DB_USERNAME', 'dbuser'); define('DB_PASSWORD', 'takagi'); define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE); try { //connect $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $db->query("select * from users"); //全件抽出 $users = $stmt->fetchAll(PDO::FETCH_ASSOC);//FetchAll(抽出型指定) foreach ($users as $user){ } echo $stmt->rowCount() . "records found.";   } catch (PDOException $e) { echo $e->getMessage(); exit; } ?>

    • ベストアンサー
    • MySQL
  • pdoの文字化け

    http://www.ajaxray.com/blog/2009/08/29/simple-php-pdo-wrapper-light-static-easy-to-use/ を利用しpdo接続をしています。そのまま使用すると日本語が文字化けしていまいます。 ※ファイルの文字コードはUTF-8に変更してます。 function setConnectionInfo内に以下のソースを入れてみたのですがエラーになってしまいました。 どのようにすればエラーなく動作させる事ができるのでしょうか? $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->query("SET NAMES 'utf8'"); self::$_pdoObject = null; また、調べてみた際に気になったのですがこのスクリプトのエントリー的なページはあっても 使用しての感想等のページはありませんでした。操作はかなり楽にできそうな感じなのですが あまり使われてないのでしょうか? メジャーに知られているようなラッパーなどがありましたら是非おしえてください!

    • 締切済み
    • PHP
  • ○LinuxでのPDO利用

    ○LinuxでのPDO利用 PHPで次のようなコードを記述しています。 ------------------------------------------------------------- $db = 'mysql:host=localhost;dbname=dbn'; $login = 'user'; $password = 'pass'; try { $pdo = new PDO($db , $login, $password); $sth = $pdo->prepare("SELECT * FROM USER WHERE NAME=? AND PASSWORD=?"); $sth->bindParam(1, $name); $sth->bindParam(2, $password); $sth->execute(); while($row = $sth->fetch(PDO::FETCH_ASSOC)){ $user[] = $row; } }catch(PDOException $e){ var_dump($e); } ------------------------------------------------------------- このコードがWindowsでxampp上で動かすと問題ないんですが、 Linux上で動かすと$sth->execute();でfalseが返ってきて、 値を取得できません。 設定の問題だと思うのですが、 どこにその問題があるのかが分かりません。 環境は CentOS apache 2.0 php 5.3 mysql 5.1 PDO driver,pdo_mysqlもphpinfo()から確認できてます。 php.iniにも extension=pdo.so extension=pdo_mysql.so の記述はあります。 どなたか分かる方、宜しくお願いします。

    • ベストアンサー
    • PHP
  • MySQLでテストサイトは読込OK本番サイトはNG

    テストサイトと本番サイト2つのサイトがあります。 それぞれに使用しているファイルはすべて同じものです。 ドメイン名は違いますが、同じサーバにアップされています。 MySQLのデータを読み込んで表示させる作りなのですが、両方とも同じMySQLからデータを読み込んでいます。 MySQLのクライアントのバージョンは5.0.77と書いてありました。 $dsn = "mysql:host=example.com;dbname=test"; $user = "test"; $pas = "aaaaaa"; $db = new PDO($dsn,$user,$pas); $db->exec("SET NAMES utf8"); $db->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); #SQLの生成~実行 $sql = 'SELECT `a`,`b` FROM `xyz`'; $result = $db->query($sql); while($row = $result->fetch(PDO::FETCH_ASSOC)){ $hoge[] = $row; } というふうな感じでデータを拾いだして読み込んでいます。 コミットというのは、よく分かっていないので、使っていません。 (これが原因?) 今まではうまく表示されていたのですが、急に表示されなくなりました。 とりあえず、サイト閉鎖状態を解除したいので、読み込みを正常にしたいのですが、どのようにすれば良いでしょうか。 知識不足でお恥ずかしいのですが、ほんとに困ってます!助けてください! どうかご教授よろしくお願いいたします。

  • 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