【Unity】データベースをPHPで呼び出して画面に出力する

サムネイル
当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
関連記事
  • 第1回:レンタルサーバーからデータベース作成
  • 第2回:PHPでデータベースを呼び出す
  • 第3回:UnityからPHPを介して、データベースを表示する

前回で、当サイトで使用しているレンタルサーバー「ConoHa Wing」でデータベースを作成し、「phpMyAdmin」にアクセスして、テーブル(表)を作成しました。

PHPAdminでデータベースを作成します。

本記事では、作成したテーブルをPHPを使って表示します。
つまり、PHPでデータベースを呼び出します。

PHP回
本記事は次の人におすすめ
  • UnityとPHPを連携したい。
  • PHPの使い方を知りたい。
  • PHPを使用してMySQLデータベースに接続し、データを取得するためのコードを知りたい。
DB接続に使用するレンタルサーバー
  • 当サイトで使用中のサーバー
  • WordPressを始めやすい
  • 独自ドメインが二つ永久無料
  • 利用者が多く情報が多い
  • 月額1000円以下の破格の価格
  • ドメイン契約・更新費用が不要
Udemyで学習する
スポンサーリンク

PHPからデータベースを呼ぶ

PHPからデータベースをアクセス

初めに大まかな手続きを解説します。

少し話は遠回りしますが、「HTML,CSS,JavaScript」でウェブデザインをする際に、実行(デバック)をするとchromeやEdgeで表示されます。

しかし、この表示はネットワークでつながっていないため、他のパソコンでURLを検索エンジンに入力しても、そのウェブデザインは、実行・表示することはできません。

赤枠で囲っている部分は、いわば「オフライン」です。

ローカル環境
矢印横スライドをデザインしています。

このオフラインをオンラインにするには、サーバーにアップロードしなければいけません。

本記事では、動的なウェブページ作成するために、
PHPを使用してデータベースの管理しているサーバーを呼び出すことをします。

4つの必須情報を取得

データベースといっても、どの情報を取得するのか特定しなければいけません。

特定するときに必要な情報が4つあります。

4つの情報
  1. サーバー名
  2. データベース名
  3. ユーザー名
  4. パスワード

これら4つがないとPHPからデータベースにアクセスできません。

また、この4つの情報が管理人の証明になりますので、流失するだけでデータベースを乗っ取られます。
特に、ユーザー名とパスワードに関しては、phpAdminにログインするための情報で、第三者による不正アクセスをされてデータの改ざんされます。
したがって、厳重な管理をしてください。

1.サーバー名/2.データベース名

サーバー名とデータベース名は、Conohaの管理画面では、「+データベース」にあります。
データベース名は項目名通りデータベース名「XXX01_alicia_unity」ですが、サーバー名は、Conohaにおいては、接続先ホスト「mysqlXXX.conoha.ne.jp」です。

データベース名取得

3.ユーザー名/4.パスワード名

サーバー名とデータベース名は、Conohaの管理画面では、「+ユーザー」にあります。
phpmyAdminにログインするときに必要な情報です。
こちら2つの項目名は、そのままなので迷うことはないでしょう。

ユーザー名取得

ソースコード

<?php
$servername = "mysqlXXX.conoha.ne.jp";  // サーバー名
$dbname = "XXX01_alicia_unity";  // データベース名
$username = "XXX01_alicia";  // ユーザー名
$password = "alicia-ing";  // パスワード

try {
    // データベースに接続
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


    // SQLクエリを実行
    $sql = "SELECT * FROM test";
    $stmt = $conn->query($sql);
    $stmt->execute();

    if ($stmt->rowCount() > 0) {
        // 結果をループして表示
        while ($row = $stmt->fetchObject()) {
            echo $row->ID. ".". $row->name . ":" . $row->number . "<br>"; //改行は"<br>"あるいは"\n"
        }
    } else {
        echo "結果がありません";
    }

    // 接続を閉じる
    $conn = null;
} catch (PDOException $e) {
    echo "データベース接続エラー: " . $e->getMessage();
    exit();
}
?>

UdemyでUnityを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

\Unityの学習から収益化の方法はこちらから!/



解説

初めに取得した4つの情報を変数へ指定します。

「$servername」はMySQLサーバーのホスト名(mysqlXXX.conoha.ne.jp)
「$dbname」はデータベース名(XXX01_alicia_unity)
「$username」はMySQLユーザー名(XXX01_alicia)
「$password」はMySQLパスワード(alicia-ing)を指定します。

$servername = "mysqlXXX.conoha.ne.jp";  // サーバー名
$dbname = "XXX01_alicia_unity";  // データベース名
$username = "XXX01_alicia";  // ユーザー名
$password = "alicia-ing";  // パスワード

PDOクラスを使用してMySQLデータベースに接続します。
PDOクラスのコンストラクタを呼び出すことで、指定された情報を使用してデータベースへの接続が確立されます。

また、setAttributeメソッドを使用して接続オブジェクトの属性を設定しています。PDO::ATTR_ERRMODEはエラーモードを指定し、PDO::ERRMODE_EXCEPTIONを設定することで、エラーが発生した場合に例外がスローされるようになります。

    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    //$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
攻撃から保護する

PDO::ATTR_EMULATE_PREPARES属性をfalseに設定して、プリペアドステートメント(Prepared Statements)のエミュレーション(模倣)モードを制御します。
プリペアドステートメントは、SQLクエリを実行する前にサーバーに対してクエリを準備してSQLインジェクション攻撃からの保護やパフォーマンスの向上が期待できます。

今回ソースコードでコメント文になっているもので、実行には関与していません。
しかし、PHPでデータベースを扱うときは入れることをおすすめします。

プリペアドステートメントとは、プログラム上で動的にSQL文を生成する必要があるとき、可変部分を変数のようにしたSQL文をあらかじめ作成しておき、値の挿入は処理系に行わせる方式。実行効率を向上させ、SQLインジェクションを防止する効果がある。

プリペアドステートメントとは – 意味をわかりやすく

SQLクエリの実行をします。

testテーブルから全ての行を選択するSQLクエリが準備され、$stmt変数にクエリが格納されます。

その後、executeメソッドを呼び出してクエリを実行します。

// SQLクエリを実行
$sql = "SELECT * FROM test";
$stmt = $conn->query($sql);
$stmt->execute();

sqlの実行結果の処理と表示をします。

rowCountメソッドを使用してクエリの実行結果の行数を取得し、結果が1行以上ある場合はループを通じて各行の情報を表示します。

fetchObjectメソッドを使用して行をオブジェクトとして取得し、そのプロパティを使用して各列の値にアクセスします。

if ($stmt->rowCount() > 0) {
    while ($row = $stmt->fetchObject()) {
        echo $row->ID . "." . $row->name . ":" . $row->number . "<br>";
    }
} else {
    echo "結果がありません";
}

接続のクローズ(切断)します。
データベース操作が終了した後、接続をクローズするために$conn変数にnullを代入して接続を切ります。

$conn = null;
接続のクローズする理由

$conn = null; というコード行は、前述したようにプログラムにおいてデータベース接続を明示的に終了するために重要な役割を果たすものです。

データベース接続はシステムリソースを消費します。プログラムが実行される間、複数の接続が開かれたままだと、リソースの枯渇やパフォーマンスの低下が発生する可能性があります。故に、$conn = null; を実行することで、プログラムがデータベース接続を明示的に閉じるための手段が提供され、リソースが適切に解放されることが確保されます。

さらに、本プログラムは、規模が小さいのであまり関係ありませんが、データベースサーバーは同時に接続できるクライアントの数に制限があります。接続をクローズしないままだと、サーバーの接続数の上限に達してしまい、新たな接続が受け入れられなくなる可能性があります。接続を閉じることで、他のクライアントが接続できるようになり、システム全体のスケーラビリティ(拡張性)が向上します。

また、データベーストランザクションを使用する場合、トランザクションが終了した後に接続を閉じることは特に重要です。データベース接続をクローズしなければ、データの整合性が保たれず、予期せぬエラーが発生してしまいます。
※トランザクションとは、処理を一つにまとめたことです。例えば、「商品選択、購入者情報登録、購入完了」これらECサイトでの手続きをいいます。

$conn = null; 行はメモリの解放にも関連しています。接続を閉じることで、関連するメモリも解放され、不要なメモリリークを防ぎ、プログラムのパフォーマンスを維持することができます。

このように、$conn = null; 行は、データベース接続を適切に管理し、プログラムの安定性、パフォーマンス、セキュリティを確保するための重要な一部です。したがって、データベース操作を行った後には、必ずこの行を追加して接続を終了させるようにしてください。

エラーハンドリングをします。
もしデータベース接続やクエリ実行中にエラーが発生した場合、PDOException例外がキャッチされ、エラーメッセージが表示されます。

} catch (PDOException $e) {
    echo "データベース接続エラー: " . $e->getMessage();
    exit();
}
エラーハンドリング必要性

エラーハンドリングは、プログラムが実行中に予期せぬエラーが発生した場合、エラーハンドリングはそのエラーを特定し、適切に対処するための重要な手段です。

実行時エラーが発生した場合、エラーメッセージやスタックトレースを通じて問題の根本原因を追跡し、修正する手がかりを得ることができます。これにより、開発者は効果的な問題解決を行うことができます。

また、予期せぬエラーによってプログラムがクラッシュすることを防ぎ、エラーが発生しても適切なメッセージを提供することで、ユーザーエクスペリエンスを向上させることができます。

セキュリティの観点からも、エラーハンドリングは重要です。不正な入力データや攻撃によってエラーが引き起こされる可能性がありますが、適切なエラーハンドリングを実装することで、攻撃者による情報漏洩やシステムへの侵入を防ぐことができます。

ユーザーフレンドリーなエラーメッセージもエラーハンドリングの一環です。ユーザーにとって理解しやすく、適切なアクションを示すメッセージを提供することで、問題解決や次のステップへのヒントを提供します。

さらに、システムモニタリングとメンテナンスにおいても役立ちます。エラーの情報を収集することで、システムの健全性を監視し、バグ修正や改善に活用できます。

このように、適切なエラーハンドリングはプログラムの安定性、セキュリティ、可読性、保守性を向上させる重要な手段です。特に、公開されるアプリケーションでは、エラーハンドリングを適切に行うことが、ユーザー満足度の向上やシステムの信頼性確保に繋がるので、エラーハンドリングの処理が必要になります。

Unity学習ができる教本

タイトル対象特徴
Unityの教科書 2023完全対応版入門・初心者プログラミング未経験でも、ゲーム制作したい人
マンガでわかる Unityゲーム開発入門入門・初心者Unityを挫折したけど、もう一度挑戦したい人
2Dゲームの作成をマンガで丁寧に解説
作って学べる Unity本格入門中級者~RPG、特に3Dゲームを作りながら学習したい人
Unity ソーシャルゲーム開発ガイド中・上級者ガチャ・ログインボーナスなどのソシャゲの機能を開発したい人

FTPソフトの使用

FTPソフトについて

ここまで、Mysqlを連携するPHPコードを確認してきました。
ここからは、このソースコードをサーバーに転送します。

サーバーにファイルをアップロードしたり、サーバーにあるファイルをダウンロードしたりする際に使うファイル転送用ソフトウェアFTPソフトを使用します。

Unityをブラウザ上でプレイするためには、ビルドしたデータをFTPソフトでアップロードします。

ビルドしたwebGLは、自分のパソコンのみでオンラインで操作することができません。

しかし、FTPソフトでゲームをアップロードして、iframeのカスタムHTMLを使用すれば、Wordpress上でゲーム(Webゲーム)をすることができます。

当サイトを運営するときに使っているのは「FileZilla」です。

このソフトは、ウェブページが英語でハードルが高く感じるかもしれませんが、使い方を検索すれば、日本語での解説がたくさんヒットしますので、臆することなく使ってください。

FTPソフトからサーバー上のデータを削除すると、サイトの挙動が不安定になり、動かなくなってしまうこともあるので、削除や上書きなど使用は十分に気を付けてください。

PHPコードをサーバーに転送

FTPソフトを使ってサーバーに転送します。

FileZillaの場合は、サーバー上のデータは右、ローカルのデータは左に表示されます。

phpを保存

先ほどのPHPスクリプト「test.php」を任意の場所にアップロードしてください。
私の場合は、「alicia-ing.com/test/test.php」でアクセスできるようになります。
※アカウントの保護のため、現在はこのパスは削除済みです。

test.phpを右クリックして、「URLをクリップボードにコピー」を選択します。

次に、ChromeやEdgeなど検索エンジンを開いて、URLをペーストしてください。
しかし、検索バーに表示されるURLは、「ftp://…/public_html/alicia-ing.com/test/test.php」と表示されてしまいます。

PHPの読み込み成功

このURLを正しく認識するためには、「ftp://…/public_html/」の部分を消さなければいけません。

動作確認

「alicia-ing.com/test/test.php」を検索バーに入力して検索をします。

結果は、「ID」・「name」・「number」の順番で表示させることになります。

データベース表示

このように、自分のパソコンに入っているファイルをサーバー上にアップロードすることでインターネットにつながっているデバイスであれば、アクセスすることが可能です。

まとめ

前回の第1回でレンタルサーバーを介して、作ったデータベースをサーバー上にアップロードしました。

本記事(第2回)では、URLから作成したデータベースにアクセスする方法を紹介しました。

HTMLやCSS、JavaScriptは、VScodeを使ってプログラミングしても、ローカルの状態であるため自分のパソコンでしかアクセスできません。

しかし、サーバーにアップすれば、URLを使って訪問できるようになります。

URLからデータベースにアクセスするには、PHPのコードとFTPソフトが必要です。

PHPには、サーバー名とデータベース名、ユーザー名、パスワードが必要です。
これらは、自分のサーバーを管理する情報でもあるので、流出には十分に気を付けてください。

FTPソフトはサーバー上にソースコードをアップロードするもので、FTPソフトからもともと入っているスクリプトを削除すると、サイトが不安定になるので、カスタマイズする場合は、定期的にダウンロードして、取り返しの使いない削除や上書きしてしまった時に備えてください。

次回>>Unityでデータベースを呼び出す

ここまで、MySQLでデータベースを作成して、PHPを使って、データベースに誰でもアクセスできるようにしました。

第3回が、Unityを使ってサーバー上のデータベースの情報を出力します。

Unity上にデータベース情報を出力します。

次回が、本シリーズの最終回です。

Udemyで学習する