PHPプログラミング

最終更新日:
公開日:

ワークショップ

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

コードを整理する

「ひと言掲示板」で今まで作成してきたコードについて、使っていない箇所などを整理していきます。

この記事のポイント

  • 不要なコードは可能な限り削除する
  • コード実行中に不変の設定情報は定数にしておくと後々便利

目次

メンテナンスしやすいようにコードを綺麗にする

前回まではデータの管理にMariaDBを導入し、ひと言メッセージの投稿や読み込みを行えるようにしてきました。
しかし、現在のコードはファイルで投稿を管理していたときのコードも残っているためやや煩雑です。
そこで、今回はコードを整理していきましょう。

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

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

ファイル関連の処理を削除する

まず、ファイルのパスを書いた定数から削除します。
次の赤字の箇所を削除してください。

index.php

<?php

// メッセージを保存するファイルのパス設定
define( 'FILENAME', './message.txt');

---- 省略 ----

続いて、不要になった変数の初期化をいくつか削除します。
次の赤字になっている4つの変数を削除してください。

index.php

<?php

// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

// 変数の初期化
$current_date = null;
$data = null;
$file_handle = null;
$split_data = null;
$message = array();
$message_array = array();
$success_message = null;
$error_message = array();
$clean = array();
$pdo = null;
$stmt = null;
$res = null;
$option = null;

// データベースに接続

---- 省略 ----

次に、データベースを導入した際にコメントアウトしたファイル処理に関連するコードも削除していきましょう。
次の赤字でコメントアウトしている箇所を削除してください。

index.php

<?php

---- 省略 ----

	// メッセージの入力チェック
	if( empty($message) ) {
		$error_message[] = 'ひと言メッセージを入力してください。';
	}

	if( empty($error_message) ) {

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

		// トランザクション開始
		$pdo->beginTransaction();

---- 省略 ----

削除した後のコードは次のようになります。

index.php

<?php

---- 省略 ----

	// メッセージの入力チェック
	if( empty($message) ) {
		$error_message[] = 'ひと言メッセージを入力してください。';
	}

	if( empty($error_message) ) {

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

		// トランザクション開始
		$pdo->beginTransaction();

---- 省略 ----

続いて、次の赤字でコメントアウトしているファイル読み込みのコードも削除します。

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>
<html lang="ja">
	
---- 省略 ----

削除すると次のようになります。

index.php

<?php

---- 省略 ----

if( !empty($pdo) ) {

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

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

?>
<!DOCTYPE html>
<html lang="ja">

---- 省略 ----

不要な部分がなくなり、コードがスッキリしたかと思います。
続いて、コードのメンテナンスをしやすいようにデータベースの接続情報に関連するコードを修正していきます。

データベースの接続情報を定数にする

コードのメンテナンスがより簡単になるように、データベースの接続情報のコードを見直していきます。
今回のコードであれば、以下のPDOのオブジェクトを作成してデータベースに接続する箇所が該当します。

index.php

// データベースに接続
try {

	$option = array(
		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
		PDO::MYSQL_ATTR_MULTI_STATEMENTS => false
	);
	$pdo = new PDO('mysql:charset=UTF8;dbname=board;host=localhost', 'root', 'password', $option);

} catch(PDOException $e) {

	// 接続エラーのときエラー内容を取得する
	$error_message[] = $e->getMessage();
}

これらの接続情報はコード実行中は不変になるので、定数に置き換えていきます。
先ほど削除したファイルパスの定数が書かれていた場所に、以下のように定数の宣言を追記してください。

index.php

<?php

// データベースの接続情報
define( 'DB_HOST', 'localhost');
define( 'DB_USER', 'root');
define( 'DB_PASS', 'password');
define( 'DB_NAME', 'board');

// タイムゾーン設定
date_default_timezone_set('Asia/Tokyo');

---- 省略 ----

続いて、この定数をデータベース接続部分で使用できるようにコードを修正します。

index.php

<?php

// データベースの接続情報
define( 'DB_HOST', 'localhost');
define( 'DB_USER', 'root');
define( 'DB_PASS', 'password');
define( 'DB_NAME', 'board');

---- 省略 ----

// データベースに接続
try {

	$option = array(
		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
		PDO::MYSQL_ATTR_MULTI_STATEMENTS => false
	);
	$pdo = new PDO('mysql:charset=UTF8;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);

} catch(PDOException $e) {

	// 接続エラーのときエラー内容を取得する
	$error_message[] = $e->getMessage();
}

---- 省略 ----

細かい部分ですが、ベタな文字列から定数への変更なので「'」が不要になる点に注意してください。

今回はデータベースの接続情報を定数にしましたが、今後もしサーバー移管などで設定情報に変更があったときも定数の宣言部分の値を修正するだけで対応できるようになります。
少しだけメンテナンスが楽になります。

HTML出力時にサニタイズを行う

今回は最後に、掲示板に今まで書き込まれた投稿をecho関数で出力するときにhtmlspecialchars関数によるサニタイズを実行するように設定します。
「表示名」と「ひと言メッセージ」を出力する箇所に、以下のようにサニタイズ処理を追加してください。

index.php

---- 省略 ----

<section>
<?php if( !empty($message_array) ){ ?>
<?php foreach( $message_array as $value ){ ?>
<article>
	<div class="info">
		<h2><?php echo htmlspecialchars( $value['view_name'], ENT_QUOTES, 'UTF-8'); ?></h2>
		<time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time>
	</div>
	<p><?php echo nl2br( htmlspecialchars( $value['message'], ENT_QUOTES, 'UTF-8') ); ?></p>
</article>
<?php } ?>
<?php } ?>
</section>
</body>
</html>

htmlspecialchars関数の使い方は「投稿されたデータをサニタイズする」のときと同様です。
「ひと言メッセージ」の出力では改行するためにnl2br関数を使っていますが、この関数の内側でhtmlspecialchars関数によるサニタイズを先に実行します。

ここまで修正したら、もう一度ブラウザで開いて正常に投稿や表示がされるかを確認してみてください。

以上でコードの整理は完了です。
次回は、セッションを導入してユーザーの書き込みがより便利になるようにしていきます。

今回作成したコード:Github