SEEDS Creator's Blog

読者です 読者をやめる 読者になる 読者になる

PDO(fetch,fetchAll)について

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

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

 

【やりたかったこと】

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

 

【発生した問題】

なぜかPHPのプロセスが途中で死んでしまう。 (例外すらスローされない)

 

【OKロジック】

$sql "select * from tbl_hoge where hoge = ?";
$params = array('hoge'=>1);
$stmt = $pod->prepare($sql);
$rs = $stmt->execute($params);

while ($row = <span style="color: #ff0000"><span style="text-decoration: underline">$rs-&gt;fetch(PDO::FETCH_ASSOC)</span>) {</span>

  print_r($row);

}

 

【NGロジック】

$sql "select * from tbl_hoge where hoge = ?";
$params = array('hoge'=&gt;1);
$stmt = $pod-&gt;prepare($sql);
$rs = $stmt-&gt;execute($params);

$result_array = <span style="text-decoration: underline;color: #ff0000">$rs-&gt;fetchAll(PDO::FETCH_ASSOC)</span>;

foreach ($result_array as $row) {

  print_r($row);

}

 

【原因と反省】

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

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

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

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

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

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