ワークショップ
ひと言掲示板を作る(12)
データベースからデータを取得する
「ひと言掲示板」に投稿されたデータをデータベースから読み込んで表示していきます。
この記事のポイント
- データベースからデータを取得するときはSELECT文を使う
- 取得したデータはmysqli_resultクラスのオブジェクトからアクセスできる
目次
データベースから投稿データを取得する
前回はmysqliクラスを使って、MariaDBに作ったデータベースのテーブル「message」に投稿データを登録しました。
今回はテーブルから登録したデータを取得し、掲示板に表示していきます。
「ひと言掲示板を作る」の概要については「ひと言掲示板を作る」をご覧ください。
デモはこちら
前回までに作成したコードはこちら:Github
データベースからデータを取得する流れ
まず最初に、データベースからデータを取得する流れを確認しましょう。
大まかな流れは次のようになります。
- データベースに接続
- データベースにデータを取得するSQLを送る
- 接続を閉じる
1つ目と3つ目の部分は書き込みのときと同じ手順になり、2つ目のSQLを送る部分が肝です。
データを取得するSQLは「SELECT」という構文を使用します。
これからコードを書いてデータを取得していきますが、その前にファイルからデータを読み込むコードをコメントアウトしておきましょう。
コード例
<?php
-- 省略 --
/*
if( $file_handle = fopen( FILENAME,'r') ) {
while( $data = fgets($file_handle) ){
$split_data = preg_split( '/\'/', $data);
$message = array(
'view_name' => $split_data[1],
'message' => $split_data[3],
'post_date' => $split_data[5]
);
array_unshift( $message_array, $message);
}
// ファイルを閉じる
fclose( $file_handle);
}
*/
?>
<!DOCTYPE html>
-- 省略 --
これで一時的に掲示板にはメッセージが表示されなくなりますが、すぐにデータベースから表示できるようにしていきます。
SELECT文でデータを取得する
まずはデータベースへの接続を行います。
先ほどコメントアウトしたコードの下に、次の赤字になっているコードを追記してください。
コード例
<?php
-- 省略 --
/*
if( $file_handle = fopen( FILENAME,'r') ) {
while( $data = fgets($file_handle) ){
$split_data = preg_split( '/\'/', $data);
$message = array(
'view_name' => $split_data[1],
'message' => $split_data[3],
'post_date' => $split_data[5]
);
array_unshift( $message_array, $message);
}
// ファイルを閉じる
fclose( $file_handle);
}
*/
// データベースに接続
$mysqli = new mysqli( 'localhost', 'root', 'password', 'board');
// 接続エラーの確認
if( $mysqli->connect_errno ) {
$error_message[] = 'データの読み込みに失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error;
} else {
// ここにデータを取得する処理が入る
}
?>
<!DOCTYPE html>
-- 省略 --
データ登録のときと同様に、mysqliクラスのオブジェクトを生成してデータベースに接続を行います。
接続エラーが起こったときの処理も同じです。
続いて、正常に接続できたときにデータを取得するコードを追記していきます。
コード例
<?php
-- 省略 --
// データベースに接続
$mysqli = new mysqli( 'localhost', 'root', 'password', 'board');
// 接続エラーの確認
if( $mysqli->connect_errno ) {
$error_message[] = 'データの読み込みに失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error;
} else {
$sql = "SELECT view_name,message,post_date FROM message ORDER BY post_date DESC";
$res = $mysqli->query($sql);
if( $res ) {
$message_array = $res->fetch_all(MYSQLI_ASSOC);
}
$mysqli->close();
}
-- 省略 --
コードを上から順に解説していきます。
$sqlには、データベースからデータを取得するSQLを代入します。
データの取得は先述した通りSELECT文を使いますが、基本的な文法は次のようになります。
コード例
SELECT 取得するカラム名 FROM テーブル名 WHERE 取得条件 ORDER BY ソートするカラム名 DESC
1つ目の「取得するカラム名」には、「id」以外の3つのカラムを指定し、データを取得するテーブルは「message」を指定します。
取得データを絞り込むときには「WHERE句」で指定しますが、今回は全データを取得するため指定しません。
代わりに、データの並びを「ORDER BY句」で指定します。
ORDER BY句は、特定のカラムの値で取得データを並び替えることができます。
今回は「投稿日時」で最新順に取得したいため、降順にデータを取得する「DESC」を指定します。
もし逆に投稿を古い順に取得したい場合は、「ASC」を指定することもできます。
このSQLを、次のqueryメソッドで実行します。
返り値はmysqli_resultクラスのオブジェクトが$resに入ります。
$res = $mysqli->query($sql);
続くif文ではmysqli_resultクラスのオブジェクトが取得できていることを確認し、fetch_allメソッドで取得したデータを全て取得します。
もしデータベースにデータが入っていないなどの理由で結果を取得できなかった場合は、$resにはfalseが入るためif文はスルーされます。
if( $res ) {
$message_array = $res->fetch_all(MYSQLI_ASSOC);
}
今回はデータをファイル読み込みのときと同様の配列形式で取得したいため、メソッドに「MYSQLI_ASSOC」を指定します。
これで$message_arrayに連想配列の形式でデータを取得することができます。
最後に、closeメソッドでデータベースとの接続を閉じて終了します。
ここまでで、掲示板をブラウザで再読み込みしてみてください。

データベースに登録した投稿データが表示されたでしょうか。
先ほど取得したデータはファイル読み込みの時と同じ形式で取得しているため、実は表示部分については変更する必要がありません。
試しに、メッセージを投稿してみましょう。

掲示板にちゃんと書き込んだ内容が表示れました。

念のためphpMyAdminでmessageテーブルを確認してみます。
次のように先ほど投稿したメッセージがちゃんと入っていればOKです。

今回はここまでになります。
データベースを使った投稿の管理ができるようになりました。
次回はここまでのコードを整理していきます。
今回作成したコード:Github
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
記事一覧
- ひと言掲示板を作る(1) ひと言掲示板を作る
- ひと言掲示板を作る(2) メッセージの入力フォームを作る
- ひと言掲示板を作る(3) メッセージのデータを受け取る
- ひと言掲示板を作る(4) ファイルにデータを保存する
- ひと言掲示板を作る(5) ファイルからデータを読み込む
- ひと言掲示板を作る(6) 投稿完了メッセージを表示する
- ひと言掲示板を作る(7) 投稿の未入力バリデーションをつける
- ひと言掲示板を作る(8) 投稿されたデータをサニタイズする
- ひと言掲示板を作る(9) 投稿データの保存にデータベースを使う
- ひと言掲示板を作る(10) 掲示板のデータベースとテーブルを作成する
- ひと言掲示板を作る(11) 投稿データをデータベースに登録する
- ひと言掲示板を作る(12) データベースからデータを取得する
- ひと言掲示板を作る(13) コードを整理する
- ひと言掲示板を作る(14) セッションで表示名の入力を省略する
- ひと言掲示板を作る(15) 管理ページを作成する
- ひと言掲示板を作る(16) ログインページを作る
- ひと言掲示板を作る(17) 投稿データをCSV形式でダウンロードする
- ひと言掲示板を作る(18) 投稿データをダウンロードする件数を指定する
- ひと言掲示板を作る(19) 投稿メッセージの編集ページを作る
- ひと言掲示板を作る(20) メッセージを編集する機能を実装する
- ひと言掲示板を作る(21) 投稿メッセージの削除ページを作る
- ひと言掲示板を作る(22) 管理ページにログアウトを実装する
- ひと言掲示板を作る(23) リロードによる多重投稿を防止する
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。