PHP: PDOでデータベースからデータを取得し、表示する。クエリがうまく実行できない時の対処法

2018年7月5日PDO, PHP, データベース

    みなさん、こんにちは。コーディングをする時間が最近とれてきてだんだん楽しくなってきているPQTomです。
    今回は前にお話ししたPHP、PDOについての続きです。
    前回はPDOを使用してデータベースに接続する方法と注意する点について少しお話しました。
    どんな記事を書いていたのか知りたい人は探して見てください。
    ていうかここにリンク貼っておきます。

    https://pqtomblog.com/2018/06/10/connect_to_database_by_pdo_php/
    さてさて、今日のお話に移ります。
    今日はデータベースに接続したあとの話です。
    データベースに接続する理由として基本、データの操作を行うことですよね。
    データベースに新しい情報を追加する、入っているデータを使用する、データを削除する等々。
    今回はデータを使用してページに表示するところまでやります。

    データベースからデータの取得

    データベースはmysqlをlocalhostで使用、言語はPHPで拡張モジュールPDOを使用します。

    まずデータベースの中身です。

    idとmessageというカラムを用意しました。
    データベース名はmydbにしています。
    messageの中に入ってるこの3つのデータを全部引き出していきたいと思います。

    データベースへ接続

    まずデータベースへ接続します。

    //localhost=127.0.0.1, username=root, password=newpassword
    $pdo = new PDO("mysql:host=127.0.0.1; dbname=mydb; charset=utf8" , "root" , "newpassword");

     

    データの選択

    次にテーブルを選択してその中のデータを指定します。

    //テーブル名=mytable, カラム=message
    $sql = "SELECT message FROM mytable;";

     

    文の実行:PDO->prepare()->execute()

    データの選択文を作成したら、実行に移ります。
    実行には

    PDO->query()
    PDO->prepare()->execute()

    の2種類の方法が公式ページで紹介されています。
    query()の方がコード数が少なく簡単に書けるので(少しだけ)試してみたのですが、自分の場合はうまく取得ができませんでした。
    なのでもう片方の方法を紹介します。
    クエリを使用してうまくいかねえっと思ったら迷わずもう片方に移行しましょう。
    こだわりは大事ですが、考えるより確実にできる方法を使用すべきだと思います。最近。。(考えるだけ無駄かなっと)
    ではやっていきましょう。
    PDO->prepare()->execute() は見たまんままず、prepare()を実行します。
    これはexecute()する前の準備ですね。(まじでそのまんま)

    $stmt = $pdo->prepare($sql);

    これで前項で定義したこのテーブルのこのデータだぞってことを知らせる準備ができました。
    それでは実行してみましょう。

    $stmt->execute();

    これで実行完了です。
    しかし、この段階ではデータベース内に格納されているデータを実際に取得するという作業までは行われていません。
    ここではテーブルの中のカラムを選択した、というところまでしか行われていないのです。
    選択を行なったのでいよいよデータの取得に移りましょう。
    データの取得はPDOStatemant::fetchを使用して行なっていきます。
    fetchについてはたくさんあり、データを取得する際の動きが変わります。PDOの公式ページで確認してみてください。
    特にこだわりがないのであればPDO::FETCH_ASSOCを使用して、カラム名を添字の配列に、取得したデータを格納していきましょう。

    while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
    $message[] = $result;
    }

    一つ一つのデータを取得して格納していくので、繰り返し文で処理を行います。
    これでmessageという配列に3つのデータを格納することができたはずです。

    var_dump($message);

    でデータを確認してみると、

    array(3) { [0]=> array(1) { ["message"]=> string(21) "MySQL works perfectly" } [1]=> array(1) { ["message"]=> string(5) "hello" } [2]=> array(1) { ["message"]=> string(1) "1" } }

    で見事に格納されましたね。カラム名=messageを添字として配列に格納したので二次元配列になってますが問題ないです。
    ではいよいよ表示です。

    foreach($message as $mes){
    echo "{$mes["message"]} <br/>";
    }

    これで表示完了です。

    ブラウザ表示すると小さくこの三つが左上に表示されているはずです。(画像は大きくトリミングしたやつ)
    以上でデータの取得から表示までできました。
    参考として全文を最後に載せておきます。

    <?php
    //エラーキャッチ
    try{
    //データベースへ接続する
    $pdo = new PDO("mysql:host=127.0.0.1; dbname=mydb; charset=utf8" , "root" , "newpassword");
    // SQL作成
    $sql = "SELECT message FROM mytable;";
    $stmt = $pdo->prepare($sql);
    $stmt->execute();
    
    //データの取得
    while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
    $message[] = $result;
    }
    
    //もしエラーが発生した時にエラーを表示する
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    }catch(PDOException $e){
    echo $e -> getMessage();
    die();
    }
    //接続を閉じる
    $dbh = null;
    //データ表示
    foreach($message as $mes){
    echo "{$mes["message"]} <br/>";
    }
    ?>

    まとめ

    データベースからデータを取得し、ブラウザで表示まで行いました。
    僕自体、初めはクエリを使用して実行しようとしましたが、正直うまくいきませんでした。
    それでずっと調べて結局この方法でやるという選択肢になりました。

    どうでしたか?
    やってみたら意外に簡単にできましたね。
    データベースとか聞くとすごく難しそうですが、惑わされていただけでした。
    これができればあとは応用でどう活用していくのかという話になってくるので楽しくなっていくと思います。
    僕も調べてどう活用できるのか、実行してここにもアップしていきたいです。

    今日はこの辺で
    ではでは。