PHPプログラミング

最終更新日:
公開日:

ワークショップ

ひと言掲示板を作る(12)

データベースからデータを取得する

「ひと言掲示板」に投稿されたデータをデータベースから読み込んで表示していきます。

この記事のポイント

  • データベースからデータを取得するときはSELECT文を使う
  • 取得したデータは配列形式で参照することができる

目次

データベースから投稿データを取得する

前回はPDOを使って、MariaDBに作ったデータベースのテーブル「message」にひと言メッセージのデータを登録しました。
今回はテーブルから登録したデータを取得して、掲示板に表示していきます。

「ひと言掲示板を作る」の概要については「ひと言掲示板を作る」をご覧ください。
デモはこちら

前回までに作成したコードはこちら:Github

データベースからデータを取得する流れ

まず最初に、データベースからデータを取得する流れを確認しましょう。
大まかな流れは次のようになります。

  1. データベースに接続
  2. データベースにデータを取得するSQLを送る
  3. 接続を閉じる

1つ目と3つ目の部分は前回のデータを登録するときと同じ手順になり、コードも前回までに書いたものをそのまま使います。
データを取得する部分で、SQLの「SELECT」という構文を使用します。

これからコードを書いてデータを取得していきますが、その前にファイルからデータを読み込むコードをコメントアウトしておきましょう。

index.php

<?php

---- 省略 ----

// データベースの接続を閉じる
$pdo = null;

/* コメントアウトする
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文でデータを取得する

データベースの接続と接続解除は前回のコードをそのまま使うため、今回はデータを取得する部分のみ加えていきます。
// データベースの接続を閉じる」の上の位置に、次の赤字になっているコードを追記してください。
$pdo = null;」より下に書いてしまうと、データベースとの接続は解除されていてデータを取得できないため注意してください。

index.php

<?php

---- 省略 ----

        // プリペアドステートメントを削除
        $stmt = null;
	}
}

if( empty($error_message) ) {

	// メッセージのデータを取得する
	$sql = "SELECT view_name,message,post_date FROM message ORDER BY post_date DESC";
	$message_array = $pdo->query($sql);
}

// データベースの接続を閉じる
$pdo = null;

/* コメントアウトする
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>
---- 省略 ----

今回追記したコードを順に解説していきます。

追記した最初の行のif文ではPDOとの接続があるか確認しています。
もしデータベースとの接続に問題があるときは、データの取得もスキップします。

データの取得では先述した通りSELECT文を使いますが、基本的な文法は次のようになります。

コード例

SELECT 取得するカラム名 FROM テーブル名 WHERE 取得条件 ORDER BY ソートするカラム名 DESC

1つ目の「取得するカラム名」は、テーブルmessageにある4つのカラムのうち「id」以外の3つのカラムを指定し、データを取得するテーブルは「message」を指定します。

取得データを絞り込むときには「WHERE句」で条件を指定することができますが、今回は全てのデータを取得するため指定しません。
代わりに、データの並び順を「ORDER BY句」で指定します。

ORDER BY句は、特定のカラムの値で取得データを並び替えることができます。
今回は「投稿日時」で最新順に取得したいため、降順にデータを取得する「DESC」を指定します。
もし逆に投稿を古い順に取得したい場合は、「ASC」を指定することもできます。

今回のSQLは入力値などの変数を使わないため、PDOのqueryメソッドで実行します。
データの取得のみで更新作業はないため、ここではトランザクションも不要です。
取得したデータは連想配列としてそのまま変数$message_arrayに入れます。

$message_array = $pdo->query($sql);

データを表示するコードはファイル形式で読み込んでいたときと同じものをそのまま使うことができますが、データベースでは改行も扱うことができるため出力で改行が反映されるように調整します。
ひと言メッセージを出力する箇所にnl2br関数を追加しましょう。

index.php

<?php

---- 省略 ----

<article>
	<div class="info">
		<h2><?php echo $value['view_name']; ?></h2>
		<time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time>
	</div>
	<p><?php echo nl2br($value['message']); ?></p>
</article>

---- 省略 ----

ここまでの変更を保存して、掲示板をブラウザで再読み込みしてみてください。

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

試しに、メッセージを投稿してみましょう。

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

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

ここまでで、掲示板にひと言メッセージの投稿、そして表示をデータベースを使って行うことができるようになりました。

今回はここまでになります。
次回はここまで作ってきたコードから不要になった箇所を整理していきます。

今回作成したコード:Github