PDOを使ってSELECT文を発行する

更新:2017/01/01

このページでは、PDOを使ってMySQLに接続し、SELECT文でデータ取得を行う方法を説明します。
Webアプリケーションを開発する上で、データベースの利用は必須となります。
ぜひ覚えていきましょう。
今回は、『ブログの記事をホームページに出力する』というテーマで実装していきます。

まずは記事データを作成してみる

下準備として、phpMyAdminから記事データを登録しておきましょう。
今回のアプリケーション用データベースからpostsテーブルを選んで、「挿入」タブを開きます。
データ項目には、post_titleにタイトルを、posts_contentには本文を、post_createdには登録日を指定します。
なお、post_updatedには、CURRENT_TIMESTAMPという文字列がはじめから入っています。これは、MySQL側の予約語で、登録した日時が自動的に入る、という動作になります。
post_idについては、なにも指定しません。Auto increment(オートインクリメント/自動採番)となっているため、自動的に最新のIDが割り当てられるからです。
5件ほどデータを入れてみましょう。

以下のような感じでデータが登録できました。

PHPからデータベース上の記事をSELECTする

ここまでの最新プログラムは、以下ですね。

step2-020.zip

どこまで進んだかわからなくなってしまったら、上記を使ってください。

blog.phpを開く

さて、これからDB接続用のコードを書いていきます。
まず、以前作成したblog.phpをテキストエディタで開いてください。

以下のようになっていると思います。

blog.php
<?php $page_title = "ブログ";?>
<?php require "header.php";?>
    <p>
      準備中
    </p>
<?php require "footer.php";?>

DB接続コードを追加する

上記プログラムを、以下のように修正します。

blog.php
<?php
// htmlentitiesのショートカット関数
function he($str){
    return htmlentities($str, ENT_QUOTES, "UTF-8");
}

// 設定値定義
$db_host = "localhost"; // データベースのホスト
$db_name = "app1"; // データベースの名前
$db_user = "app1"; // データベース接続ユーザー
$db_pass = "xxxxxx"; // データベース接続パスワード

// データベース接続を確立
try {
    $db = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_user, $db_user);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーモードの設定
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // prepareのエミュレーションを停止
} catch (PDOException $e) {
    // エラー発生時
    exit("データベースの接続に失敗しました");
}

// データの問い合わせ
$rows_post = array(); // 配列の初期化
try {
    $stmt = $db->prepare("SELECT * FROM posts ORDER BY post_created DESC");
    $stmt->execute(); // クエリの実行
    $rows_post = $stmt->fetchAll(); // SELECT結果を二次元配列に格納
} catch (PDOException $e) {
    // エラー発生時
    exit("クエリの実行に失敗しました");
}
?>
<?php $page_title = "ブログ";?>
<?php require "header.php";?>
<?php foreach ($rows_post as $row_post) {;?>
    <article>
      <h2>
        <?php echo he($row_post["post_title"]);?>
      </h2>
      <time>
        <?php echo he($row_post["post_created"]);?>
      </time>
      <p>
        <?php echo nl2br(he($row_post["post_content"]));?>
      </p>
    </article>
<?php }?>
<?php require "footer.php";?>

それでは、ブロックごとにコードを解説していきます。

// htmlentitiesのショートカット関数
function he($str){
    return htmlentities($str, ENT_QUOTES, "UTF-8");
}

htmlentitiesのショートカット関数を定義しています。

// 設定値定義
$db_host = "localhost"; // データベースのホスト
$db_name = "app1"; // データベースの名前
$db_user = "app1"; // データベース接続ユーザー
$db_pass = "xxxxxx"; // データベース接続パスワード

データベースに接続するための設定値を定義しています。

// データベース接続を確立
try {
    $db = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_user, $db_user);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーモードの設定
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // prepareのエミュレーションを停止
} catch (PDOException $e) {
    // エラー発生時
    exit("データベースの接続に失敗しました");
}

データベース接続を確立しています。PDOクラスのコンストラクタによって作成されたリンクは、$dbという変数に保存されます。
その後、setAttributeメソッドによって必要な設定を加えています。
(このあたりのことについては、別のページで解説します。まずはこういうものということで進めましょう)
try { } catch (..) { } という書き方をすると、tryブロックの中でエラーが発生したときに、catchの中身を実行することができます。

// データの問い合わせ
$rows_post = array(); // 配列の初期化
try {
    $stmt = $db->prepare("SELECT * FROM posts ORDER BY post_created DESC");
    $stmt->execute(); // クエリの実行
    $rows_post = $stmt->fetchAll(); // SELECT結果を二次元配列に格納
} catch (PDOException $e) {
    // エラー発生時
    exit("クエリの実行に失敗しました");
}

『SELECT * FROM posts ORDER BY post_created DESC』というSQLを実行し、その結果を$rows_postに格納しています。
上記SELECT文の意味としては、『postsテーブルの全フィールドを、post_createdの値が大きい順番で全取得する』といったものとなります。
エラーが発生した場合は、『クエリの実行に失敗しました』というメッセージを出力します。

<?php foreach ($rows_post as $row_post) {;?>
    <article>
      <h2>
        <?php echo he($row_post["post_title"]);?>
      </h2>
      <time>
        <?php echo he($row_post["post_created"]);?>
      </time>
      <p>
        <?php echo nl2br(he($row_post["post_content"]));?>
      </p>
    </article>
<?php }?>

二次元配列$rows_postをforeachでループさせ、$row_postを生成します。
$row_postにはpostsテーブルのデータが入っているので、he関数をかけながら画面出力しています。
本文の部分のみ、nl2brという関数をかけています。
nl2brを使うと、改行コード(\n)を
に変換して出力してくれます。(そのままでは、データに改行コードが入っていても、ブラウザ上では改行されません)

実行結果を表示する

修正したblog.phpをブラウザから実行すると、以下のように表示されます。

これで、『MySQLに保存した記事を出力する、ブログページの作成』が完了しました。
今回の修正を含むファイルセットは以下となります。

step2-080.zip

このページをシェア Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn