初めてのPHP ⑦。データを保存していこう。

初めてのPHP ⑦。データを保存していこう。
この記事はこんな悩みを解決します
  • サーバーにデータを保存したい
  • バリデーションを設定したい
  • PHPの勉強がしたい

前回の記事でGETやPOSTを使うためのルーティングを設定しました。せっかく設定したのでPOSTを使って入力したデータを保存して行きたいと思います。

この記事を読むことでデータの保存方法が分かります。

初めてのPHP ⑦。データを保存していこう。

以前の記事を読んでない方は下記の記事を読むと理解が進むと思います。

少しデータがファイルが大量になっているのでファイルの構成をおさらいしておきます。

─── PHP-start
    ├── core
        ├── Router.php
        ├── Request.php
        ├── bootstrap.php
        ├── database
            ├── Connection.php
            ├── Query.php
    ├── index.php  
    ├── routes.php  
    ├── config.php  
    ├── view 
        ├── view.php
    ├── controllers.php  
     ├── comment.php
       ├── index.view.php

細かいのを省くとこんな感じですね。

では、本題に入ります。

データを入力するためのviewを作ります。

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<title>PHP</title>
</head>
<body>
	<form method='POST' action='/comment'>
		<input name='comment'></input>
		<button type='submit'>Submit</button>
	</form>
	<ul>
		<?php foreach($Comments as $Comment): ?>
			<li><?= $Comment->comment; ?></li>
		<?php endforeach; ?>
	</ul>
</body>
</html>

コメントを入れるformがあってその下でCommentを1つずつ取り出しています。ブラウザで確認してみましょう。

うまく出来てますね。コメント1〜3はTablePlusを使って事前に入力していました。

では、ルーティングを設定します。

$router->post('comment', 'controllers/comment.php');

以前の記事で紹介したようにroutes.phpでcommentへアクセスされたらcontrollers/comment.phpを使うように書いてやります。

コントローラーのcomment.phpを編集して行きます。

<?php

$database->insert('Comments', [
	'comment' => $_POST['comment']
]);

header('Location: /');

insertという処理でCommentテーブルのcommentというカラムに$_POSTで渡って来た情報を入れるように書いています。
この処理が終わるとheaderでホーム画面に戻るようにしています。

ただ、insertメソッドを定義していないのでQuery.phpで定義してあげましょう。

insertメソッドを定義する

public function insert($table, $array){
		$sql = sprintf('insert into %s(%s) values (%s)',
			$table,
			implode(',', array_keys($array)),
			':' . implode(', :', array_keys($array))
		);

		try{
			$statement = $this->pdo->prepare($sql);
			$statement->execute($array);
		} catch(Exception $e){
			die($e->getMessage());
		}
		
	}

少し複雑になるのですがポイントは3つです。

データを保存する処理のポイント
  • sprintfで文字列を作成します
  • %sにはテーブル名、カラム名、値が入るように指定しています。
  • tryの中で$sqlをprepareしてやり、実行します。

今回はcommentだけですが複数のデータが入ることを予想して作っています。ちなみに、implodeでキーをカンマで区切っていたり、値をとるときにはキーの前にコロンをつけています。

では、ブラウザで確認して行きます。

コメント4と入力してSubmitをクリックしてやります。

うまく動いてますね。

バリデーションの設定

今回の方法だと空白でも入力されてしまうのでそのときにはエラーを返すようにしてあげます。いわゆるバリデーションというやつですね。

コントローラーの設定

comment.phpでvalidateを行いうまくいけば(帰って来たデータが空なら)データを保存、そうでないならエラーをビューに表示させるようにして行きます。

$error_message = $database->validate($_POST['comment']);

if(empty($error_message)){
	$database->insert('Comments', [
		'comment' => $_POST['comment']
	]);
	header('Location: /');
}else{
	$Comments = $database->selectAll('Comments');
	require 'view/view.php';
}

こんな感じで良いかと思います。

validationメソッドはQuery.phpに書いて行きます。

public function validate($data){
		if( $data === "" ) {
			$error_message[] = 'メッセージを入力してください。';
			return $error_message;
		}else{
			$error_message = [];
			return $error_message;
		}
		
	}

渡って来たデータが空なら$error_messageに配列を入れ、そうでないなら空にして$error_messageを返しています。

よく使うバリデーションは下記の3つです

//よく使うバリデーション
strlen($string)>6 //文字数が6文字以上かのバリデーション(パスワードの設定などで使います)
filter_var($email, FILTER_VALIDATE_EMAIL) //メールアドレスかどうかのバリデーション
preg_match("/^[a-zA-Z0-9]+$/", $string) //文字が半角英数字かのバリデーション

これを覚えておくと他のときにも応用が利きます。

$error_messageを表示させるためのviewを作って行きます。

<body>
	<?php if( !empty($error_message) ): ?>
		<ul>
			<?php foreach( $error_message as $value ): ?>
				<li><?= $value; ?></li>
			<?php endforeach; ?>
		</ul>
	<?php endif; ?>
	<form method='POST' action='/comment'>
		<input name='comment'></input>
		<button type='submit'>Submit</button>
	</form>
	<ul>
		<?php foreach($Comments as $Comment): ?>
			<li><?= $Comment->comment; ?></li>
		<?php endforeach; ?>
	</ul>
</body>

foreachを使って$error_messageが空でないなら1つずつ取り出すようにしています。

では、ブラウザで確認して行きましょう。

空白のままでSubmitをクリックしてみます。

保存されずにエラーが表示されていますね。
では、コメント4と入力してSubmitしてやります。

うまく保存され、コメント4が表示されました。

まとめ

今回はデータベースにデータを保存する方法を紹介しました。

データを扱えるようになるとプログラミングしてるな、という実感が出て来ますよね。次回はデータの削除方法について説明して行きます。

関連記事