データベーステーブルを作ってPHPで INSERT してみよう

フォルダとファイル名

php-db フォルダに db02.php ファイルを作成します。
ここでは、SQLでテーブルを作り、データを挿入(INSERT)する方法を学びます。

チェックポイント

  • CREATE TABLE でテーブルを作成できたか?
  • PDO の prepare()execute() を使って安全に INSERT できたか?
  • プレースホルダ(?)と値のバインドの意味が理解できたか?

基本コード(db02.php)

データベース「testdb」がある状態での作成です。

<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';
$password = '';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "接続成功!<br>";

    // 1) テーブル作成(最初に1回だけ実行)
    $sql = "
        CREATE TABLE IF NOT EXISTS users (
            id INT AUTO_INCREMENT PRIMARY KEY,
            name VARCHAR(50) NOT NULL,
            email VARCHAR(100) NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    ";
    $pdo->exec($sql);
    echo "テーブル作成成功!<br>";

    // 既存のデータ件数をチェック
    $count = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();

    if ($count == 0) {
        // データがまだないときだけ INSERT を実行
        $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
        $stmt->execute(['山田太郎', 'taro@example.com']);
        $stmt->execute(['山田花子', 'hanako@example.com']);
        $stmt->execute(['佐藤一郎', 'ichiro@example.com']);
        $stmt->execute(['鈴木美咲', 'misaki@example.com']);
        $stmt->execute(['田中健', 'ken@example.com']);

        echo "データを追加しました!";
    } else {
        echo "すでにデータがあります。再挿入はスキップされました。";
    }
} catch (PDOException $e) {
    echo "エラー:" . $e->getMessage();
    exit;
}

このコードは、リロード防止 + 重複追加の防止になっています。

CREATE TABLE

$pdo->exec("
  CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  )
");

  • exec()結果を返さないSQL(CREATE, UPDATE, DELETE)に使う
  • IF NOT EXISTSすでにテーブルがあれば作らない
  • AUTO_INCREMENT PRIMARY KEY … 自動採番のID
  • TIMESTAMP DEFAULT CURRENT_TIMESTAMP … 登録日時を自動で入れる

INSERT文(PDO)

// 既存のデータ件数をチェック
$count = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();

if ($count == 0) {
    // データがまだないときだけ INSERT を実行
    $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
    $stmt->execute(['山田太郎', 'taro@example.com']);
    $stmt->execute(['山田花子', 'hanako@example.com']);
    $stmt->execute(['佐藤一郎', 'ichiro@example.com']);
    $stmt->execute(['鈴木美咲', 'misaki@example.com']);
    $stmt->execute(['田中健', 'ken@example.com']);

    echo "データを追加しました!";
} else {
    echo "すでにデータがあります。再挿入はスキップされました。";
}



  • prepare() … SQL文を準備。? がプレースホルダ(あとで値を入れる場所)
  • execute([...]) … 値を配列で渡す
  • SQLインジェクション対策として安全な書き方
  • すでにテーブルに挿入されている場合は、追加しない

出力メッセージ

  • 成功すると「接続成功! → テーブル作成成功! → 1件のデータを追加しました!」が表示されます。
  • 失敗すると catch に入り、エラーメッセージが表示されます。

SQL文

テーブル作成用SQL

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

初期データ挿入用SQL

(必要に応じて INSERT を複数行まとめて実行可能です)

INSERT INTO users (name, email) VALUES
('山田太郎', 'taro@example.com'),
('山田花子', 'hanako@example.com'),
('佐藤一郎', 'ichiro@example.com'),
('鈴木美咲', 'misaki@example.com'),
('田中健', 'ken@example.com');