hero_picture

PDO(fetch,fetchAll)について

2014/10/16

模倣は上達への近道とはよくいったもので、保守フェーズで既存モジュールを模倣してロジックを書いてました。

そのときにはまってしまった問題についての備忘録です。

【やりたかったこと】

PDOを利用して、大量データを処理したい。

【発生した問題】

なぜかPHPのプロセスが途中で死んでしまう。

(例外すらスローされない)

【OKロジック】

1$sql "select * from tbl_hoge where hoge = ?";
2$params = array('hoge'=>1);
3$stmt = $pod->prepare($sql);
4$rs = $stmt->execute($params);
5while ($row = <span style="color: #ff0000"><span style="text-decoration: underline">$rs-&gt;fetch(PDO::FETCH_ASSOC)</span>) {</span>
6print_r($row);
7}
8

【NGロジック】

1$sql "select * from tbl_hoge where hoge = ?";
2$params = array('hoge'=&gt;1);
3$stmt = $pod-&gt;prepare($sql);
4$rs = $stmt-&gt;execute($params);
5$result_array = <span style="text-decoration: underline;color: #ff0000">$rs-&gt;fetchAll(PDO::FETCH_ASSOC)</span>;
6foreach ($result_array as $row) {
7print_r($row);
8}
9

【原因と反省】

もうおわかりですね。はい。SQLで大量データを取得して

fetchAll(全データを配列に変換)を利用したのがまずかったようです。

fetch(1行ずつ取得)を利用すれば解決しました。

ちなみに、SQLの結果セットをlimit句で相当数絞ってからfetchAllを利用してもNGでした。

担当したPJのモジュールは、fetch,fetchAllもラッピングされており理解せずに関数を利用(模倣)してました。

関数利用の際は、きちんとマニュアルを確認して理解したうえで、利用しないといけないですね。