PHPでMySQLに接続するには、主に mysqli
拡張または PDO
を使う方法があります。以下はそれぞれの基本的な接続例です。
✅ 方法1:mysqli
を使う場合(手軽で初心者向け)
<?php $host = 'localhost'; // データベースサーバー $user = 'username'; // ユーザー名 $pass = 'password'; // パスワード $dbname = 'database'; // データベース名 $conn = new mysqli($host, $user, $pass, $dbname); // 接続確認 if ($conn->connect_error) { die("接続失敗: " . $conn->connect_error); } echo "接続成功!"; ?>
✅ 方法2:PDO
を使う場合(より柔軟で安全)
<?php $dsn = 'mysql:host=localhost;dbname=database;charset=utf8'; $user = 'username'; $pass = 'password'; try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "接続成功!"; } catch (PDOException $e) { echo "接続失敗: " . $e->getMessage(); } ?>
🔐 補足
username
,password
,database
は自分の環境に合わせてください。- セキュリティの観点からは PDO + プリペアドステートメント が推奨されます。
目次
PDO を使って MySQL に接続し、データを「取得・挿入・更新・削除」する
以下は、PDO を使って MySQL に接続し、データを「取得・挿入・更新・削除」する基本的な例です。
🔹1. データベースに接続
<?php $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8'; $user = 'your_user'; $pass = 'your_password'; try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "接続成功!"; } catch (PDOException $e) { echo "接続失敗: " . $e->getMessage(); } ?>
🔹2. データを取得(SELECT)
<?php $stmt = $pdo->prepare("SELECT * FROM users WHERE age > :age"); $stmt->execute(['age' => 20]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { echo $row['name'] . "<br>"; } ?>
🔹3. データを挿入(INSERT)
<?php $stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (:name, :age)"); $stmt->execute([ 'name' => '太郎', 'age' => 25 ]); ?>
🔹4. データを更新(UPDATE)
<?php $stmt = $pdo->prepare("UPDATE users SET age = :age WHERE name = :name"); $stmt->execute([ 'age' => 30, 'name' => '太郎' ]); ?>
🔹5. データを削除(DELETE)
<?php $stmt = $pdo->prepare("DELETE FROM users WHERE name = :name"); $stmt->execute(['name' => '太郎']); ?>
このように PDO
は安全な SQL 実行(プレースホルダ使用)とエラーハンドリングがしやすいのが特長です。
PDOを使ったCRUD(作成・読み取り・更新・削除)処理の完全サンプル
以下は、PDOを使ったCRUD(作成・読み取り・更新・削除)処理の完全サンプルです。データベース名は testdb
、テーブル名は users
を想定しています。
✅ 前提:テーブル構造
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT );
✅ 1. 接続設定(db.php
)
<?php // db.php $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8'; $user = 'your_user'; $pass = 'your_password'; try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("接続失敗: " . $e->getMessage()); } ?>
✅ 2. データ作成(Create)
<?php require 'db.php'; $name = '佐藤'; $age = 28; $stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (:name, :age)"); $stmt->execute(['name' => $name, 'age' => $age]); echo "ユーザーを追加しました。"; ?>
✅ 3. データ取得(Read)
<?php require 'db.php'; $stmt = $pdo->query("SELECT * FROM users"); foreach ($stmt as $row) { echo "ID: {$row['id']}、名前: {$row['name']}、年齢: {$row['age']}<br>"; } ?>
✅ 4. データ更新(Update)
<?php require 'db.php'; $id = 1; $newAge = 35; $stmt = $pdo->prepare("UPDATE users SET age = :age WHERE id = :id"); $stmt->execute(['age' => $newAge, 'id' => $id]); echo "ユーザーの年齢を更新しました。"; ?>
✅ 5. データ削除(Delete)
<?php require 'db.php'; $id = 1; $stmt = $pdo->prepare("DELETE FROM users WHERE id = :id"); $stmt->execute(['id' => $id]); echo "ユーザーを削除しました。"; ?>
PDO + HTMLフォームで動作する完全なCRUDサンプル
以下は、前回のPDO + HTMLフォーム付きCRUDサンプルに Bootstrap 5 を適用したスタイリング済みバージョンです。見た目がぐっとモダンになります。
✅ スタイリングポイント
table
→table table-striped
form
→form-control
,btn btn-primary
- 全体レイアウト →
container
,card
,mt-4
, etc.
✅ 例:index.php
(一覧 + 追加フォーム)
<?php require 'db.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (:name, :age)"); $stmt->execute([ 'name' => $_POST['name'], 'age' => $_POST['age'] ]); header("Location: index.php"); exit; } $users = $pdo->query("SELECT * FROM users")->fetchAll(PDO::FETCH_ASSOC); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ユーザー管理</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body class="bg-light"> <div class="container mt-4"> <div class="card"> <div class="card-header bg-primary text-white"> <h3 class="mb-0">ユーザー一覧</h3> </div> <div class="card-body"> <table class="table table-striped"> <thead><tr><th>ID</th><th>名前</th><th>年齢</th><th>操作</th></tr></thead> <tbody> <?php foreach ($users as $user): ?> <tr> <td><?= htmlspecialchars($user['id']) ?></td> <td><?= htmlspecialchars($user['name']) ?></td> <td><?= htmlspecialchars($user['age']) ?></td> <td> <a class="btn btn-sm btn-outline-secondary" href="update.php?id=<?= $user['id'] ?>">編集</a> <a class="btn btn-sm btn-outline-danger" href="delete.php?id=<?= $user['id'] ?>" onclick="return confirm('削除しますか?');">削除</a> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> <div class="card mt-4"> <div class="card-header bg-success text-white"> <h4 class="mb-0">ユーザー追加</h4> </div> <div class="card-body"> <form method="post"> <div class="mb-3"> <label class="form-label">名前</label> <input type="text" name="name" class="form-control" required> </div> <div class="mb-3"> <label class="form-label">年齢</label> <input type="number" name="age" class="form-control" required> </div> <button type="submit" class="btn btn-success">追加</button> </form> </div> </div> </div> </body> </html>
Bootstrap 5 を用いた全体レイアウトテンプレート
以下は、Bootstrap 5 を用いた全体レイアウトテンプレートです。CRUDページ(index.php
, update.php
など)に共通のヘッダーとフッターを持たせて、見た目を統一します。
✅ ファイル構成(共通レイアウト化)
crud/ ├── db.php ├── header.php ← ヘッダー(共通) ├── footer.php ← フッター(共通) ├── index.php ├── update.php └── delete.php
① header.php
(共通ヘッダー)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ユーザー管理システム</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body class="bg-light"> <nav class="navbar navbar-expand-lg navbar-dark bg-dark mb-4"> <div class="container-fluid"> <a class="navbar-brand" href="index.php">ユーザー管理</a> </div> </nav> <div class="container">
② footer.php
(共通フッター)
</div> <!-- .container --> <footer class="bg-dark text-white text-center mt-5 p-3"> © <?= date('Y') ?> ユーザー管理システム </footer> </body> </html>
③ index.php
の例(共通レイアウトを使用)
<?php require 'db.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (:name, :age)"); $stmt->execute([ 'name' => $_POST['name'], 'age' => $_POST['age'] ]); header("Location: index.php"); exit; } $users = $pdo->query("SELECT * FROM users")->fetchAll(PDO::FETCH_ASSOC); include 'header.php'; ?> <div class="card mb-4"> <div class="card-header bg-primary text-white"> <h4 class="mb-0">ユーザー一覧</h4> </div> <div class="card-body"> <table class="table table-bordered table-hover"> <thead class="table-light"><tr><th>ID</th><th>名前</th><th>年齢</th><th>操作</th></tr></thead> <tbody> <?php foreach ($users as $user): ?> <tr> <td><?= htmlspecialchars($user['id']) ?></td> <td><?= htmlspecialchars($user['name']) ?></td> <td><?= htmlspecialchars($user['age']) ?></td> <td> <a class="btn btn-sm btn-outline-primary" href="update.php?id=<?= $user['id'] ?>">編集</a> <a class="btn btn-sm btn-outline-danger" href="delete.php?id=<?= $user['id'] ?>" onclick="return confirm('削除しますか?');">削除</a> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> <div class="card"> <div class="card-header bg-success text-white"> <h4 class="mb-0">新規ユーザー追加</h4> </div> <div class="card-body"> <form method="post"> <div class="mb-3"> <label class="form-label">名前</label> <input type="text" name="name" class="form-control" required> </div> <div class="mb-3"> <label class="form-label">年齢</label> <input type="number" name="age" class="form-control" required> </div> <button type="submit" class="btn btn-success">追加</button> </form> </div> </div> <?php include 'footer.php'; ?>
このように分割することで、見た目の統一・保守性向上・コードの再利用性が大きく改善されます。