このページでは、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する
ここまでの最新プログラムは、以下ですね。
どこまで進んだかわからなくなってしまったら、上記を使ってください。
blog.phpを開く
さて、これからDB接続用のコードを書いていきます。
まず、以前作成したblog.phpをテキストエディタで開いてください。
以下のようになっていると思います。
<?php $page_title = "ブログ";?> <?php require "header.php";?> <p> 準備中 </p> <?php require "footer.php";?>
DB接続コードを追加する
上記プログラムを、以下のように修正します。
<?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)を<br>に変換して出力してくれます。(そのままでは、データに改行コードが入っていても、ブラウザ上では改行されません)
実行結果を表示する
修正したblog.phpをブラウザから実行すると、以下のように表示されます。
これで、『MySQLに保存した記事を出力する、ブログページの作成』が完了しました。
今回の修正を含むファイルセットは以下となります。