HTMLとCSSだけでは、Webサイトは情報を表示することしかできません。ユーザー登録機能、ブログ投稿、ECサイトの商品管理など、データを「保存」し、後から「取り出して表示」する動的なWebアプリケーションを構築するには、データベースとの連携が不可欠です。
この記事では、PHPを使ってデータベース(MySQL)を操作するための全手順を、初心者の方にも分かりやすく一から解説します。
【この記事で学ぶこと】
- phpMyAdminを使ったデータベースとテーブルの準備
- SQLというデータベース言語の基本
- PHP (PDO) を使った安全なデータベース接続
- データベースからデータを取得し、Webページに一覧表示する方法
- フォームからデータをデータベースに登録する方法
この一つの記事を読み終える頃には、PHPとデータベース連携の基本が身につき、簡単なWebアプリケーションの裏側の仕組みが理解できるようになるでしょう。
1. データベースの準備 (phpMyAdmin)
まずは、データを保存するための「金庫」と「整理棚」にあたる、データベースとテーブルを準備します。この作業には、XAMPPに含まれているphpMyAdminという便利なツールを使います。
1.1. phpMyAdminとは?
phpMyAdminは、Webブラウザ上からマウス操作でMySQLデータベースを簡単に管理できるツールです。本来は専門的なコマンド(SQL)を打ち込んで操作しますが、phpMyAdminを使えば視覚的にデータベースやテーブルを作成できます。
1.2. データベースの作成
phpMyAdminを開き、「新規作成」から新しいデータベースを作りましょう。
- データベース名:
php_learning_db
など、分かりやすい名前を付けます。 - 照合順序:
utf8mb4_general_ci
を選択します。これは、絵文字なども含めた様々な文字を正しく扱うための標準的な設定です。
1.3. テーブルの作成
データベースは単なる箱です。その中に、データを整理して格納するための「テーブル(表)」を作成します。今回は、会員情報を管理するmembers
テーブルを作ってみましょう。
【カラム(列)の構成】 | カラム名 | データ型 | 意味 | その他 | | :— | :— | :— | :— | | id
| INT | 会員ID | AUTO_INCREMENT (自動で連番), PRIMARY KEY (主キー) | | name
| VARCHAR(50) | 名前 | | | age
| INT | 年齢 | | | email
| VARCHAR(100) | メールアドレス | | | created_at
| DATETIME | 登録日時 | デフォルト値: CURRENT_TIMESTAMP (現在日時) |
これらの設定をphpMyAdminのテーブル作成画面で入力し、保存します。これでデータを格納する準備が整いました。
2. SQLの基本操作
phpMyAdminでデータを手動で追加することもできますが、その裏側ではSQLというデータベース専用の言語が動いています。PHPからデータベースを操作する際も、このSQL文を使います。
【主要なSQL文】
INSERT
: データを追加するINSERT INTO members (name, age, email) VALUES ('Taro Yamada', 30, 'yamada@example.com');
SELECT
: データを取得するSELECT * FROM members;
UPDATE
: データを更新するUPDATE members SET age = 31 WHERE id = 1;
DELETE
: データを削除するDELETE FROM members WHERE id = 1;
まずは「こういう命令文があるんだな」と把握しておきましょう。
3. PHPからデータベースに接続する (PDO)
いよいよPHPの出番です。PHPからMySQLに接続するには、PDO (PHP Data Objects) を使うのが現在の標準的で安全な方法です。PDOは、さまざまな種類のデータベースに同じ書き方で接続できる、便利な「翻訳機」のようなものです。
接続コードの基本形
データベースへの接続は、失敗する可能性(パスワード間違いなど)もあるため、try-catch
構文でエラー処理を記述するのが基本です。
<?php
// データベース接続情報
$dsn = 'mysql:dbname=php_learning_db;host=localhost;charset=utf8mb4';
$user = 'root';
$password = ''; // XAMPPのデフォルトは空パスワード
try {
// PDOインスタンスを生成
$dbh = new PDO($dsn, $user, $password);
// エラー発生時に例外をスローするように設定
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "データベースへの接続に成功しました。";
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage();
die();
}
4. PHPでデータを取得して一覧表示する
データベースに接続できたら、次はSELECT
文を使って会員データを全件取得し、HTMLのテーブルとして画面に表示してみましょう。
【member_list.php
の完成コード】
<?php
// データベース接続情報(前述のコードと同じ)
$dsn = 'mysql:dbname=php_learning_db;host=localhost;charset=utf8mb4';
$user = 'root';
$password = '';
$data = []; // 取得したデータを格納する配列
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL文の準備
$sql = 'SELECT id, name, age, email FROM members';
// SQL文を実行する準備
$stmt = $dbh->prepare($sql);
// SQL文を実行
$stmt->execute();
// データを2次元配列として取得
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage();
die();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>会員リスト</title>
<style>
table { border-collapse: collapse; width: 80%; margin: auto; }
th, td { border: 1px solid #ccc; padding: 10px; }
thead { background-color: #f2f2f2; }
</style>
</head>
<body>
<h1 style="text-align: center;">会員リスト</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>名前</th>
<th>年齢</th>
<th>メールアドレス</th>
</tr>
</thead>
<tbody>
<?php foreach ($data as $row): ?>
<tr>
<td><?php echo htmlspecialchars($row['id'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlspecialchars($row['name'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlspecialchars($row['age'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlspecialchars($row['email'], ENT_QUOTES, 'UTF-8'); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>
5. PHPでデータを安全に追加する
次に、HTMLフォームから入力されたデータを、INSERT
文を使ってデータベースに登録する処理を実装します。
ここで最も重要なのが「SQLインジェクション」というサイバー攻撃への対策です。対策は簡単で、**「プリペアドステートメント」**という仕組みを使います。
これは、SQL文のテンプレート(雛形)を先にデータベースに送り、後から変数の値を安全な形で当てはめる方法です。
【add_member.php
の完成コード】
<?php
$dsn = 'mysql:dbname=php_learning_db;host=localhost;charset=utf8mb4';
$user = 'root';
$password = '';
$message = '';
// フォームがPOST送信された場合の処理
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$name = $_POST['name'] ?? '';
$age = $_POST['age'] ?? 0;
$email = $_POST['email'] ?? '';
// SQL文の準備(プレースホルダを使用)
$sql = 'INSERT INTO members (name, age, email) VALUES (:name, :age, :email)';
$stmt = $dbh->prepare($sql);
// 値をバインド
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':age', $age, PDO::PARAM_INT);
$stmt->bindValue(':email', $email, PDO::PARAM_STR);
// 実行
$stmt->execute();
$message = '新しいメンバーを登録しました。';
} catch (PDOException $e) {
$message = "登録失敗: " . $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>メンバー登録</title>
</head>
<body>
<h1>メンバー登録</h1>
<?php if ($message): ?>
<p><?php echo $message; ?></p>
<?php endif; ?>
<form action="" method="POST">
<p>名前: <input type="text" name="name" required></p>
<p>年齢: <input type="number" name="age" required></p>
<p>Email: <input type="email" name="email" required></p>
<p><input type="submit" value="登録"></p>
</form>
<p><a href="member_list.php">メンバーリストを見る</a></p>
</body>
</html>
VALUES (:name, :age, :email)
のように、値の部分を :名前
という形式のプレースホルダに置き換えてprepare()
し、bindValue()
で実際の値を紐づけるのがポイントです。これにより、PDOが自動で危険な文字を無害化してくれるため、安全にデータベース操作ができます。
まとめ
今回は、PHPとデータベースを連携させる一連の流れを解説しました。
【最重要ポイントの振り返り】
- データベース操作にはPDOを使う。
- データベースへの接続や操作は**
try-catch
**でエラー処理を行う。 - ユーザーからの値をSQL文に含める際は、SQLインジェクション対策として必ず**プリペアドステートメント(
prepare
とbindValue
)**を使う。 - データベースから取得した値をHTMLに表示する際は、XSS対策として**
htmlspecialchars()
**を使う。
この4点を守るだけでも、格段に安全で安定したWebアプリケーションを構築できます。ここで学んだ「取得して表示」「フォームから登録」は、あらゆるWebアプリケーションの基本です。ぜひ何度もコードを書き写して、この流れを自分のものにしてください。