• 締切済み

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は使えますよね?