PHPプログラミング

ワークショップ

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

投稿データをデータベースに登録する

「ひと言掲示板」に投稿されたデータを、ファイルへの保存からデータベースに登録するように改修していきます。

この記事のポイント

  • mysqliクラスからMariaDBにデータを登録する
  • 接続エラーはいくつかバリエーションがある
  • データベースに使用する文字コードの指定は大切

目次

データベースにデータを登録する

前回はphpMyAdminからMariaDBを操作し、データベース「board」とテーブル「message」を作成してきました。
今回はこのテーブルに、掲示板に投稿されたメッセージを登録していくように設定してきます。

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

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

データベースに接続する

データベースを使用する手順は次のようになります。

  • データベースに接続
  • データベースにクエリ(読み込み&書き込み)を送る
  • 接続を閉じる

気づいたかもしれませんが、流れ自体はファイル操作と非常によく似ています。

「ファイルを開く」が「データベースの接続」に置き換わり、最後に「ファイルを閉じる」と同じように「データベースの接続を閉じる」必要があります。
接続した後(ファイルを開いた後)に読み込みや書き込みの処理が入るのも同じです。
つまり、ファイル操作と同じような感覚で手軽に操作することができます。

それでは早速、データベースに接続を行ってみましょう。
まずは、既存のファイルへの書き込み操作に関するコードを次のようにコメントアウトしてください。

コード例

<?php

-- 省略 --

if( !empty($_POST['btn_submit']) ) {
	
	// 表示名の入力チェック
	if( empty($_POST['view_name']) ) {
		$error_message[] = '表示名を入力してください。';
	} else {
		$clean['view_name'] = htmlspecialchars( $_POST['view_name'], ENT_QUOTES);
	}
	
	// メッセージの入力チェック
	if( empty($_POST['message']) ) {
		$error_message[] = 'ひと言メッセージを入力してください。';
	} else {
		$clean['message'] = htmlspecialchars( $_POST['message'], ENT_QUOTES);
		$clean['message'] = preg_replace( '/\\r\\n|\\n|\\r/', '
', $clean['message']); } if( empty($error_message) ) { /* if( $file_handle = fopen( FILENAME, "a") ) { // 書き込み日時を取得 $now_date = date("Y-m-d H:i:s"); // 書き込むデータを作成 $data = "'".$clean['view_name']."','".$clean['message']."','".$now_date."'\n"; // 書き込み fwrite( $file_handle, $data); // ファイルを閉じる fclose( $file_handle); $success_message = 'メッセージを書き込みました。'; } */ } } -- 省略 --

続いて、mysqliクラスのオブジェクトを作成してデータベースに接続を行います。

コード例

<?php

-- 省略 --

if( !empty($_POST['btn_submit']) ) {
	
	-- 省略 --

	if( empty($error_message) ) {

		/*
		if( $file_handle = fopen( FILENAME, "a") ) {
	
		    // 書き込み日時を取得
			$now_date = date("Y-m-d H:i:s");
		
			// 書き込むデータを作成
			$data = "'".$clean['view_name']."','".$clean['message']."','".$now_date."'\n";
		
			// 書き込み
			fwrite( $file_handle, $data);
		
			// ファイルを閉じる
			fclose( $file_handle);
	
			$success_message = 'メッセージを書き込みました。';
		}
		*/

		// データベースに接続
		$mysqli = new mysqli( 'localhost', 'root', 'password', 'board');
	}
}

-- 省略 --

mysqliクラスのオブジェクトには、データベースへの接続情報として「ホスト名」「ユーザー名」「パスワード」「データベース名」を順に指定します。
それぞれの情報は環境によって異なりますが、最後の「データベース名」については前回作成したデータベースを使用するので「board」を指定してください。

データベースの接続結果は$mysqliに入ります。
そこで、次のように接続エラーがないかを確認します。

コード例

<?php

-- 省略 --

if( !empty($_POST['btn_submit']) ) {
	
	-- 省略 --

	if( empty($error_message) ) {

		-- 省略 --

		// データベースに接続
		$mysqli = new mysqli( 'localhost', 'root', 'password', 'board');
		
		// 接続エラーの確認
		if( $mysqli->connect_errno ) {
			$error_message[] = '書き込みに失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error;
		} else {
			// あとでここにデータベースの処理を記述する
		}
	}
}

-- 省略 --

mysqliクラスはデータベースの接続エラーが起こるとconnect_errnoプロパティにエラー番号を、そしてエラーの内容はconnect_errorプロパティにセットされます。
エラーがなく正常に接続できた場合はconnect_errnoプロパティには「0」が入るため、このプロパティの値を確認することで接続エラーがあったかを確認することができます。

エラーがあった場合には、バリデーションの時に作成した$error_messageにエラー内容を加えて、次のようにエラーを表示します。
(PHPのエラー表示設定によっては、ページ上部に「Warning」メッセージが表示されます。)

エラーの表示例

エラーにはいくつか種類があります。
例えば、上のような「2002」エラーはデータベースが起動していないか、「ホスト名」が間違っていてデータベースが見つからないときに出るエラーです。

次のような「1045」エラーは、データベースのユーザー情報が間違っているときに表示されます。
この場合は、上記コードのうちユーザー名の「root」とパスワード「password」の組み合わせが正しいかを確認する必要があります。

ユーザー情報関係のエラー

1049」エラーは指定したデータベースが存在しない場合に表示されます。
この場合は、上記コードのうちデータベース名を指定する「board」が正しいかもしくはphpMyAdminなどでデータベースが存在するかを確認する必要があります。

データベース名のエラー

データベースに正常に接続できたら、else文の中でデータ登録が実行されます。

データを登録してみる

続いて、データ登録のコードを記述していきましょう。
次の赤字のコードを追記してください。

コード例

<?php

-- 省略 --

if( !empty($_POST['btn_submit']) ) {
	
	-- 省略 --

	if( empty($error_message) ) {

		-- 省略 --

		// データベースに接続
		$mysqli = new mysqli( 'maria', 'root', 'testtest', 'message');

		// 接続エラーの確認
		if( $mysqli->connect_errno ) {
			$error_message[] = '書き込みに失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error;
		} else {

			// 文字コード設定
			$mysqli->set_charset('utf8');
			
			// 書き込み日時を取得
			$now_date = date("Y-m-d H:i:s");
			
			// データを登録するSQL作成
			$sql = "INSERT INTO message (view_name, message, post_date) VALUES ( '$clean[view_name]', '$clean[message]', '$now_date')";
			
			// データを登録
			$res = $mysqli->query($sql);
		
			if( $res ) {
				$success_message = 'メッセージを書き込みました。';
			} else {
				$error_message[] = '書き込みに失敗しました。';
			}
		
			// データベースの接続を閉じる
			$mysqli->close();
		}
	}
}

-- 省略 --

上から順にコードを解説していきます。

まず最初に、set_charsetメソッドでデータベースのアクセスに使用する文字コードを設定します。
ちょっと地味で忘れがちですが、これはとても重要です。

// 文字コード設定
$mysqli->set_charset('utf8');

続いて、投稿日時を取得します。
ここはファイル書き込みのときと同じです。

// 書き込み日時を取得
$now_date = date("Y-m-d H:i:s");

続いて、データベースに出す「クエリ(処理の命令)」の内容を記述します。
これはデータベースのクエリは「SQL」と呼ばれる形で記述する必要があり、今回はデータの登録なので「INSERT文」を使用します。
(INSERT文についてより詳しくは「mysqliでMySQL/MariaDBにデータを登録:INSERT」をご覧ください)

// データを登録するSQL作成
$sql = "INSERT INTO message (view_name, message, post_date) VALUES ( '$clean[view_name]', '$clean[message]', '$now_date')";

INSERT INTO」の後ろにはデータの登録先となるテーブル名「message」を指定します。

続いて登録するカラムを指定し、「VALUES」の後ろに実際に登録するデータを指定します。
id」のカラムはデータベースが自動的に値を割り振ってくれるので、ここでは指定する必要はありません。
「表示名」「ひと言メッセージ」をサニタイズした$cleanから指定し、投稿日時については先ほど取得した$now_date

から指定します。
SQLの値は数値以外のデータは「 (シングルクォーテーション)」で囲む必要がある点に注意してください。

続いて作成したクエリをqueryメソッドで実行してデータを登録します。

// データを登録
$res = $mysqli->query($sql);

メソッドの返り値は$resに入ります。
クエリが成功した場合はtrue、失敗するとfalseが入ります。
この値をif文で確認して、表示するメッセージをそれぞれ作成します。

if( $res ) {
	$success_message = 'メッセージを書き込みました。';
} else {
	$error_message[] = '書き込みに失敗しました。';
}

最後に、closeメソッドでデータベースの接続を閉じて終了です。

// データベースの接続を閉じる
$mysqli->close();

以上でデータベースへのデータ登録ができるようになりました。
試しにメッセージを投稿してみましょう。

掲示板で書き込みを行う

正常に書き込まれると、ファイル書き込みのときと同様に「メッセージを書き込みました」と表示されます。

正常に書き込みが行われたときの例

続いて、phpMyAdminから「message」テーブルの「表示」タブを開いてみてください。

phpMyAdminから登録データを確認

このように投稿したメッセージが表示されたら成功です。
テーブルに登録されたデータは「表示」からいつでも確認することができます。

今回はここまでになります。
データベースに書き込みを行えるようになりましたが、次回は書き込んだデータを読み込んで表示していきます。

今回作成したコード:Github

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

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

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