フォルダとファイル名
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… 自動採番のIDTIMESTAMP 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');
