【連載第6回】Webアプリの「脳」と「心臓」を繋ぐバイパス工事
未経験からWebアプリ開発を目指す「AlmaLinux 9とLAMP環境で作る!Webアプリ開発完全ロードマップ(全12回)」の第6回です。
これまでの講座で、Webアプリに必要な4つの要素(LAMP)と、それらを扱うための権限設定について学んできました。
- L (Linux): サーバーの土台(AlmaLinux 9)
- A (Apache): ページを表示する係(Webサーバー)
- M (MariaDB): データを保存する箱(データベース)
- P (PHP): プログラムを処理する料理人(言語)
しかし、今はまだ全員が「バラバラに立っているだけ」の状態です。
今回は、料理人(PHP)が倉庫(MariaDB)から食材(データ)を取り出せるように、両者を繋ぐ「接続プログラム」を作成します。
ここが成功すれば、あなたは「ただのWebページ(静的サイト)」ではなく、「ユーザーによって内容が変わるWebシステム(動的サイト)」を作る入り口に立ったことになります。
先生、ついに合体ですね!
でも、プログラムでデータベースに繋ぐのって難しそうです…。
パスワードとか間違ってたら、サーバーが壊れたりしませんか?
サーバーが壊れることはないから安心して。
ただ、接続に失敗して画面が真っ白になることは日常茶飯事よ。
今回は、現在のWeb開発の標準である「PDO(ピーディーオー)」という技術を使って、エラーが出た時も安全に対処できるプロの書き方を伝授するわ。
本講座のカリキュラム(全12回)
現在地は第6回です。折り返し地点ですね!
- サーバー準備編:なぜVPSが必要?AlmaLinux 9の初期設定とSSH接続
- Webサーバー編:Apache(httpd)のインストールとファイアウォール設定
- データベース編:MariaDB(MySQL)のインストールとセキュリティ設定
- プログラミング言語編:PHP 8.xの導入と設定ファイルのチューニング
- 権限・パーミッション編:LinuxでWebサイトを公開するための「所有者」の概念
- 【今回】接続テスト編:PHPからデータベース(DB)に接続してみよう
- アプリ開発①:HTML/CSSで掲示板の「見た目」を作る
- アプリ開発②:投稿機能(Create)の実装とデータの保存
- アプリ開発③:一覧表示機能(Read)と画像表示の仕組み
- アプリ開発④:編集・削除機能(Update/Delete)の実装
- セキュリティ編:XSSやSQLインジェクション対策の基礎
- 公開編:独自ドメイン設定と無料SSL(Let’s Encrypt)でHTTPS化
なぜ「PDO」を使うのか?
PHPからデータベースに接続する方法には、大きく分けて2つの流派があります。
- mysqli関数: MySQL(MariaDB)専用の命令セット。
- PDO(PHP Data Objects): データベースの種類を問わずに使える共通の規格。
昔の参考書では mysqli_connect を使っている例もありますが、現代のWeb開発では圧倒的に「PDO」が推奨されます。
理由は以下の通りです。
- 汎用性が高い: 将来的にデータベースをMySQLからPostgreSQLなどに乗り換えることになっても、プログラムの修正が最小限で済みます。
- セキュリティが強固: 「SQLインジェクション」というWebサイトへの攻撃を防ぐための仕組み(プリペアドステートメント)が非常に使いやすいです。
- エラー処理が優秀: 「例外(Exception)」という仕組みを使って、エラーが起きた時の対処をスマートに記述できます。
本講座でも、このモダンなPDO方式を採用して開発を進めていきます。
準備:接続情報の確認
プログラムを書く前に、第3回で作成したデータベースの情報を手元に用意してください。
忘れてしまった人は、もう一度第3回の記事を見ながらユーザーを作り直してもOKです。
| 項目 | 講座での設定値(例) | 意味 |
|---|---|---|
| データベース名 | app_db |
接続先の「箱」の名前。 |
| ホスト名 | localhost |
DBがある場所。今回はWebサーバーと同じ機械の中にあるので「自分自身(localhost)」です。 |
| ユーザー名 | app_user |
DBを操作する担当者の名前。 |
| パスワード | password123 |
担当者の合言葉。 |
実践:接続プログラム「db_test.php」の作成
それでは、実際にPHPコードを書いていきましょう。
VPSにSSH接続し、公開ディレクトリ(/var/www/html/)に移動してください。
cd /var/www/html
次に、db_test.php というファイルを新規作成します。
vi db_test.php
エディタが開いたら、i キーを押して入力モードにし、以下のコードをすべてコピー&ペーストしてください。
<?php
// 1. 接続情報の定義
$dsn = 'mysql:dbname=app_db;host=localhost;charset=utf8mb4';
$user = 'app_user';
$password = 'password123';
try {
// 2. データベースへの接続を試みる
$pdo = new PDO($dsn, $user, $password);
// 3. エラーモードを「例外」に設定(エラーが出たらすぐ教えてくれるようにする)
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 4. 成功メッセージの表示
echo "<h1>データベース接続成功!</h1>";
echo "<p>WebサーバーとMariaDBの連携はバッチリです。</p>";
} catch (PDOException $e) {
// 5. 失敗した時の処理(エラーメッセージを表示)
echo "<h1>接続エラー</h1>";
echo "<p>データベースに繋がりませんでした。</p>";
echo "<p>エラー内容: " . $e->getMessage() . "</p>";
}
?>
貼り付けたら Esc キーを押し、:wq と入力して保存・終了します。
コードの完全解説
ただコピペするだけでなく、中身を理解しておきましょう。
このコードは、今後のアプリ開発で何度も使い回す「雛形」になります。
1. DSN(データソースネーム)
$dsn = 'mysql:dbname=app_db;host=localhost;charset=utf8mb4';
これは「接続先の住所」のようなものです。mysql(データベースの種類)、dbname(DB名)、host(場所)を一列に繋げて記述します。
重要なのが charset=utf8mb4 です。
これを指定し忘れると、日本語を入力した時に「????」のように文字化けしてしまいます。
古い記事では utf8 と書かれていることがありますが、現在は絵文字なども扱える utf8mb4 を使うのが鉄則です。
2. try – catch(トライ・キャッチ)構文
これは「失敗するかもしれない処理」を書くための専用の構文です。
- try { … }
「まずはこの中身をやってみて!」というブロック。もし途中でエラーが起きたら、即座に処理を中断してcatchに飛びます。 - catch (PDOException $e) { … }
「もし失敗したら、ここを実行して!」というブロック。変数$eの中に、エラーの詳しい原因(パスワード違い、DBがない等)が入っています。
初心者のコードでよく見るのが、この try-catch を書かずにいきなり接続しようとするパターンね。
それだと、エラーが起きた時に画面が真っ白になったり、最悪の場合、ユーザーに見せてはいけないパスワード情報などが画面に漏れ出たりするリスクがあるの。
DB接続には必ず例外処理(try-catch)を入れる。これはエンジニアの常識よ。
動作確認:ブラウザでアクセスしてみよう
それでは、緊張の瞬間です。
ブラウザのアドレスバーに以下のURLを入力してください。
http://[あなたのVPSのIPアドレス]/db_test.php
成功した場合
画面に大きく「データベース接続成功!」と表示されましたか?
おめでとうございます!これでWebサーバーとデータベースの連携は完璧です。
失敗した場合(よくあるエラー集)
もし「接続エラー」と表示された場合、その下に書かれている英語のエラーメッセージをよく読んでみてください。
必ず原因が書いてあります。
| エラーメッセージに含まれる単語 | 原因と対策 |
|---|---|
| Access denied for user | ユーザー名かパスワードが間違っています。$user や $password の変数の値を見直してください。特に全角スペースが入っていないか注意。 |
| Unknown database | データベース名が間違っています。app_db という名前で作りましたか?タイプミスはありませんか? |
| Connection refused | MariaDBが起動していません。 SSHで systemctl status mariadb を実行し、Activeになっているか確認してください。 |
| could not find driver | PHPの拡張機能が入っていません。 第4回で紹介した dnf install php-mysqlnd を忘れている可能性があります。インストール後にApacheの再起動も必要です。 |
| Permission denied | ファイルが見れません。 前回(第5回)やった権限設定の問題です。 db_test.php の所有者が root のままかもしれません。 |
応用:本番環境でのセキュリティについて
今回のコードでは、学習のために echo $e->getMessage(); を使って、エラー内容を画面にそのまま表示させました。
これによって「パスワードが違う」などの原因がすぐに分かりましたね。
しかし、Webアプリを一般公開する時(本番環境)では、この行は絶対に削除してください。
なぜなら、悪意のあるハッカーがわざとエラーを起こし、表示されたメッセージから「データベースの種類」や「ユーザー名」「テーブル構造」などの内部情報を盗み取る手がかりにしてしまうからです。
本番環境では、画面には「ただいまシステムエラーが発生しています」とだけ表示し、本当のエラー内容はサーバー内部の「ログファイル」にこっそり記録するのが正しい作法です。
(このログ出力の方法については、アプリ開発が進んだ後半の回で詳しく解説します)
次回予告:HTMLとCSSで掲示板の「顔」を作る
これで、Webアプリを動かすための「裏側の仕組み(バックエンド)」の準備はすべて整いました。
- Webサーバー:OK
- データベース:OK
- PHPとDBの連携:OK
次回からは、いよいよユーザーが目にする「表側の画面(フロントエンド)」の作成に入ります。
真っ白な画面に、タイトルや投稿フォーム、ボタンなどを配置して、一気に「Webアプリっぽい見た目」を作り上げていきましょう!
ここまでの6回分で、インフラエンジニアとしての基礎スキルはかなり身についたはずよ。
次からは「プログラマー」としての頭の使い方が必要になってくるわ。
今のうちに、この db_test.php で接続成功の画面を出して、ガッツポーズを決めておきなさい!
▼この講座で使用している推奨VPS


コメント