質問: phpを勉強中です。 fetchのイメージはこんな感じだと思います。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/08f29efa40bceca2cd8e859a27ec4f79.jpeg) fetchに対してfetchColumnのイメージがわかりません。 こんな感じでしょうか? ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/5b1f460c571512ee82467694f328e25e.jpeg) 列単位を配列で取得すると考えて良かったでしょうか? すみませんがよろしくお願いします。
回答: PDOStatement::fetch() のイメージはそれでよいと思います。ただし fetch() は(デフォルト設定では)次の行の取得に成功した場合、true ではなく**行(レコード)の結果を配列**で返します。 一方、PDOStatement::fetchColumn() は取得した次の行のうち、さらに**指定された列(カラム)の値**を抜き出して返すメソッドです。 ``` ▶ □△○♢☆ □△○♢☆ □△○♢☆ □△○♢☆ □△○♢☆ ``` ``` □△○♢☆ →fetch()→ □△○♢☆ ▶ □△○♢☆ □△○♢☆ □△○♢☆ □△○♢☆ ``` ``` □△○♢☆ →fetchColumn(0)→ □ ▶ □△○♢☆ □△○♢☆ □△○♢☆ □△○♢☆ ``` つまり `PDOStatement::fetchColumn(0)` は `PDOStatement::fetch()[0]` と同義です。 大したことではありませんが、`SELECT user_id FROM ...` などと1つのカラムを取得するときにコードが多少すっきり書けるメリットがあります。 ``` if (!$row = $stmt->fetch()) { die('ユーザーがみつかりません!!'); } else { $user_id = $row[0]; } if (!$user_id = $stmt->fetchColumn()) { die('ユーザーがみつかりません!!'); } ```