【PHP】POST送信されたJSONデータをバリデーションしてDBに保存する方法

【PHP】POST送信されたJSONデータをバリデーションしてDBに保存する方法 PHP

前回の記事では、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処理はシステムの信頼性を左右する重要な部分なので、必ず丁寧に実装することが求められます。