PHPでMySQLからデータ取得(SELECT)

select文を実行

  • DB接続
  • query()メソッドの引数にSQL文を渡す
  $dsn = 'mysql:dbname=php_db;host=localhost;charset=utf8mb4';
         $user = 'root';
         $password = '';
 
         try {
             $pdo = new PDO($dsn, $user, $password);
 
             // usersテーブルからidカラムとnameカラムのデータを取得するためのSQL文を変数$sqlに代入する
             $sql = 'SELECT id, name FROM users';
 
             // SQL文を実行する
             $pdo->query($sql);
         } catch (PDOException $e) {
             exit($e->getMessage());
         }

上記のコードはquery()メソッドでSELECT文を実行してデータを取得しているだけなので、ブラウザには何も表示されません。

fetchAll()メソッドでSQL文の実行結果を取得

「query()メソッドが戻り値としてPDOStatementクラスのオブジェクトを返す」のでそのオブジェストのfetchAll()メソッドで結果を配列として取得できる。
fetchAll()メソッドは$stmt->fetchAll(PDO::FETCH_ASSOC)のように引数を渡すことで、取得する配列の形式を指定することができます。

なお、引数を渡さない場合はデフォルトのPDO::FETCH_BOTH(both=両方の)という設定が適用され、カラム名と番号(0~)の両方をキーとする配列として各データ(レコード)が返されます。

以下は引数を渡さなかった場合(PDO::FETCH_BOTH)の戻り値です。配列の中に配列が入っている2次元配列であることがわかります。

<body>
    <p>
        <?php
        $dsn = 'mysql:dbname=php_db;host=localhost;charset=utf8mb4';
        $user = 'root';
        $password = '';

        try {
            $pdo = new PDO($dsn, $user, $password);

            // usersテーブルからidカラムとnameカラムのデータを取得するためのSQL文を変数$sqlに代入する
            $sql = 'SELECT id, name FROM users';

            // SQL文を実行する
             $pdo->query($sql);
             $stmt = $pdo->query($sql);
 
             // SQL文の実行結果を配列で取得する オプションでPDO::FETCH_ASSOCかPDO::FETCH_BOTHを渡せる。引数なしだとBOTHが実行される。
   
             $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
 
             // 配列の中身を出力する
             print_r($results);
        } catch (PDOException $e) {
            exit($e->getMessage());
        }
        ?>
    </p>
</body>

</html>

PDO::FETCH_ASSOCの時の$results配列の中身

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 氏家 愛梨
        )
 
    [1] => Array
        (
            [id] => 2
            [name] => 海老原 惇
        )

======== 中略 ======== 
 
    [28] => Array
        (
            [id] => 29
            [name] => 日高 敦
        )
 
    [29] => Array
        (
            [id] => 30
            [name] => 伊藤 扶樹
        )
 
)

PDO::FETCH_BOTHの時の$results配列の中身

Array
(
    [0] => Array
        (
            [id] => 1
            [0] => 1
            [name] => 氏家 愛梨
            [1] => 氏家 愛梨
        )

    [1] => Array
        (
            [id] => 2
            [0] => 2
            [name] => 海老原 惇
            [1] => 海老原 惇
        )

======== 中略 ========

    [28] => Array
        (
            [id] => 29
            [0] => 29
            [name] => 日高 敦
            [1] => 日高 敦
        )
 
    [29] => Array
        (
            [id] => 30
            [0] => 30
            [name] => 伊藤 扶樹
            [1] => 伊藤 扶樹
        )

)