前回の記事では、PHPでPOST送信されたJSONデータを受け取る方法を紹介しました。今回はその続きとして、受け取ったデータをバリデーションし、MySQLなどのデータベースに保存する方法を解説します。
前提 送信されるJSONデータの例
{
"name": "田中太郎",
"email": "tanaka@example.com"
}
データベースの準備
以下のような簡単なテーブルを用意します。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
PHPスクリプトの全体構成
<?php
// 1. JSONを受信
$json = file_get_contents('php://input');
$data = json_decode($json, true);
// 2. JSONの形式をチェック
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
exit('無効なJSON形式です');
}
// 3. 値の取り出しとバリデーション
$name = isset($data['name']) ? trim($data['name']) : '';
$email = isset($data['email']) ? trim($data['email']) : '';
$errors = [];
if ($name === '') {
$errors[] = '名前は必須です';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = '有効なメールアドレスを入力してください';
}
if (!empty($errors)) {
http_response_code(422);
exit(implode("\n", $errors));
}
// 4. データベースに接続
$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
$user = 'db_user';
$pass = 'db_pass';
try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
// 5. データを挿入
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([
':name' => $name,
':email' => $email
]);
echo '登録に成功しました';
} catch (PDOException $e) {
http_response_code(500);
echo 'データベースエラー: ' . $e->getMessage();
}
実装ポイント
- バリデーションは必ず行う:空チェック、形式チェックは最低限。
- PDOを使ってSQLインジェクション対策。
- HTTPステータスコードでエラー種別を明示。
- 失敗時のメッセージはユーザー向けと開発者向けで分けると安全。
まとめ
JSON形式で送られたデータを、PHPで受信・検証し、DBに保存するまでの基本的なフローを実装しました。バリデーションやDB処理はシステムの信頼性を左右する重要な部分なので、必ず丁寧に実装することが求められます。