回答編集履歴

1 図解をわかりやすく変更・サンプルコードを追加

miyahan

miyahan score 3065

2017/08/01 21:06  投稿

PDOStatement::fetch() のイメージはそれでよいと思います。ただし fetch() は(デフォルト設定では)次の行の取得に成功した場合、true ではなく**行(レコード)の結果を配列**で返します。
一方、PDOStatement::fetchColumn() は取得した次の行のうち、**指定された列(カラム)の値**を返すメソッドです。
一方、PDOStatement::fetchColumn() は取得した次の行のうち、さらに**指定された列(カラム)の値**を抜き出して返すメソッドです。
```
□□□□□□□□□□
△△△△△△△△△△
○○○○○○○○○○
♢♢♢♢♢♢♢♢♢♢
☆☆☆☆☆☆☆☆☆☆
       ↓
    fetch()
       ↓
□□□□□□□□□□
▶ □△○♢☆
  □△○♢☆
  □△○♢☆
  □△○♢☆
  □△○♢☆
```
```
□□□□□□□□□□
△△△△△△△△△△
○○○○○○○○○○
♢♢♢♢♢♢♢♢♢♢
☆☆☆☆☆☆☆☆☆☆
       ↓
 fetchColumn()
       ↓
  □△○♢☆ →fetch()→ □△○♢☆
▶ □△○♢☆
  □△○♢☆
  □△○♢☆
  □△○♢☆
```
つまり `$result = PDOStatement::fetchColumn(0)` は `$result = PDOStatement::fetch()[0]` と同義です。
```
  □△○♢☆ →fetchColumn(0)→ □
▶ □△○♢☆
  □△○♢☆
  □△○♢☆
  □△○♢☆
```
つまり `PDOStatement::fetchColumn(0)` は `PDOStatement::fetch()[0]` と同義です。
大したことではありませんが、`SELECT user_id FROM ...` などと1つのカラムを取得するときにコードが多少すっきり書けるメリットがあります。
```php
if (!$row = $stmt->fetch()) {
   die('ユーザーがみつかりません!!');
} else {
   $user_id = $row[0];
}
if (!$user_id = $stmt->fetchColumn()) {
   die('ユーザーがみつかりません!!');
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る