🔌 はじめに:黒い画面からゲーム画面へ
こんにちは、「ぷろぐらの森」です🌲
前回の記事で、データベースを操作する呪文「SQL(SELECTやINSERT)」を覚えましたね!


でも、今のままでは「黒い画面(コマンドライン)」や「管理ツール」でしかデータをいじれません。
これではゲームになりませんよね。
プレイヤーが遊ぶのは、あくまでブラウザ上の「ゲーム画面」です。
そこで今回は、PHP(プログラム)からMySQL(データベース)を操るための架け橋、
その名も「PDO(ピーディーオー)」について解説します。
これが使えるようになれば、
「ゲーム終了時にスコアを自動で保存」 「ランキングページにトップ10を表示」 といった機能が
実装できるようになりますよ!
1. PDOってなに?
PDO(PHP Data Objects)は、PHPからデータベースに接続するための「万能アダプター」のようなものです。
MySQLだけでなく、PostgreSQLやSQLiteなど、いろいろな種類のデータベースと会話することができます。
「ゲーム機(PHP)」と「カセット(データベース)」を繋ぐコネクターだと思ってください。
2. データベースに「接続」してみよう
まずは、PHPからデータベースへの扉を開きます(接続)。
ここで登場するのが、以前の記事で紹介した「例外処理(try-catch)」です!

データベース接続は、「パスワードが違う」「サーバーが落ちている」といった理由で失敗する可能性が高い処理です。 なので、必ず try-catch で「もし接続に失敗したら?」という保険をかけておきます。
📝 接続のコード(定型文)
##PHP##
<?php
// 1. 接続情報の定義
$dsn = 'mysql:dbname=my_game_db;host=localhost;charset=utf8'; // 接続先
$user = 'root'; // ユーザー名
$pass = 'password'; // パスワード(環境に合わせてね)
try {
// 2. 接続開始(冒険の書を開く!)
$pdo = new PDO($dsn, $user, $pass);
// エラーを表示する設定(これがないとエラーが出ずに真っ白になる!)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "データベースに接続成功!";
} catch (PDOException $e) {
// 3. 失敗した場合の処理
echo "接続エラー: " . $e->getMessage();
exit(); // 処理を強制終了
}
?>
解説:
- $dsn (Data Source Name): 「どのデータベースの、どのテーブル?」という住所情報。
- new PDO(…): ここで接続を試みます。
- catch (PDOException …): もし接続できなかったら、ここジャンプしてエラーメッセージを表示します。[例外処理の記事]でやった通りですね!
3. データを「取得」して表示しよう
接続できたら、さっそくデータを取り出してみましょう。
前回の記事で登録した「勇者A」たちのデータを、ブラウザに表示します。
ここで使うのは、query() メソッドと、おなじみのforeach 文です。
##PHP##
// SQL文を作る(全員集合!)
$sql = "SELECT * FROM users";
// SQLを実行して、結果をもらう
$stmt = $pdo->query($sql);
// 結果をループで表示する
foreach ($stmt as $row) {
echo "ID:" . $row['id'] . " ";
echo "名前:" . $row['name'] . " ";
echo "HP:" . $row['hp'] . "<br>";
}
実行結果:
ID:1 名前:勇者A HP:100 ID:2 名前:戦士B HP:150
foreach を使えば、データが100件あっても1000件あっても、自動的にすべて表示してくれます。
ループ処理の記事の知識がここで活きてきましたね!

4. ⚠️ 超重要!「SQLインジェクション」を防ぐ
ここからがプロのエンジニアとしての最重要ポイントです。
もし、「HPが〇〇以上の勇者を探す」という検索機能を作るとします。
ユーザーが入力した数値をSQLに埋め込むとき、絶対やってはいけない書き方があります。
❌ 悪い例(直書き)
##PHP##
$min_hp = $_POST['hp']; // ユーザーの入力値
// 危険!変数をそのまま埋め込んでいる
$sql = "SELECT * FROM users WHERE hp >= $min_hp";
これをしてしまうと、悪いハッカーが入力欄に特殊な文字を打ち込むことで、
「データベースの中身を全消去する」といった攻撃ができてしまいます。
これを「SQLインジェクション」と言います。
⭕️ 良い例(プリペアドステートメント)
この攻撃を防ぐバリアが「プリペアドステートメント(準備された文)」です。
「変数の場所を空けておいて、あとから安全に値をはめ込む」という方法です。
##PHP##
$min_hp = 50; // 検索したいHP
// 1. 準備:値を入れる場所に「?」や「:name」を書いておく
$sql = "SELECT * FROM users WHERE hp >= :hp";
$stmt = $pdo->prepare($sql); // query()ではなくprepare()を使う!
// 2. 登録::hp の場所に安全な形で値をセットする
$stmt->bindValue(':hp', $min_hp, PDO::PARAM_INT);
// 3. 実行
$stmt->execute();
// 結果の表示
$result = $stmt->fetchAll();
foreach ($result as $row) {
echo $row['name'] . "<br>";
}
少しコードは長くなりますが、Web公開するゲームを作るならprepare(プリペア)は必須です。
「ユーザーの入力値を使う時はプリペア!」と覚えておきましょう。
5. まとめ:これでWebアプリ開発の基礎は完了!
おめでとうございます!
これで、PHPとデータベースを繋ぐことができました👍
- PDOでデータベースに接続する。
- try-catchで接続エラーに備える。
- queryでデータを取得し、foreachで表示する。
- prepareでセキュリティ対策をする。
ここまで理解できれば、「データを保存・活用できるWebアプリケーション」を作れるエンジニアです。
次回は、いよいよこれまでの知識を総動員して、簡単な「Web掲示板(チャットツール)」を作ってみましょう!

コメント