PHPプログラミング

ワークショップ

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

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

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

この記事のポイント

  • データベースからデータを取得するときはSELECT文を使う
  • 取得したデータはmysqli_resultクラスのオブジェクトからアクセスできる

目次

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

前回はmysqliクラスを使って、MariaDBに作ったデータベースのテーブル「message」に投稿データを登録しました。
今回はテーブルから登録したデータを取得し、掲示板に表示していきます。

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

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

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

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

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

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

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。