冒険の書を開け!PHPとMySQLを『PDO』で接続してデータベースを操作する方法

目次

🔌 はじめに:黒い画面からゲーム画面へ

こんにちは、「ぷろぐらの森」です🌲

前回の記事で、データベースを操作する呪文「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とデータベースを繋ぐことができました👍

  1. PDOでデータベースに接続する。
  2. try-catchで接続エラーに備える。
  3. queryでデータを取得し、foreachで表示する。
  4. prepareでセキュリティ対策をする。

ここまで理解できれば、「データを保存・活用できるWebアプリケーション」を作れるエンジニアです。
次回は、いよいよこれまでの知識を総動員して、簡単な「Web掲示板(チャットツール)」を作ってみましょう!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

神奈川県出身
どこにでもいる現役ゲーム会社サーバーエンジニア。大学ではひたすらゲーム!ゲーム!という人生を送ってました。

このブログは「ゲームを作ってみたい!」「プログラミングに関する知識をつけたい!」そんな皆さんの少しでもお役になれば嬉しいなと思い開設しました。

趣味
YouTube鑑賞、ストリートな格闘ゲーム、キャンプ

最近の出来事
・痔主になってしまいました....
・Google Cloud Professional Cloud Architect取得しました。

コメント

コメントする

目次