PHPでMySQLに接続

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 を適用したスタイリング済みバージョンです。見た目がぐっとモダンになります。


✅ スタイリングポイント

  • tabletable table-striped
  • formform-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">
    &copy; <?= 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'; ?>

このように分割することで、見た目の統一・保守性向上・コードの再利用性が大きく改善されます。

よかったらシェアしてね!
目次