昨天我們利用EC2建立了一個小小的動態網站(留言板),不過之前的動態留言板只存.txt
檔,今天我們要把留言存到RDS MySQL資料庫,並能在網頁上即時讀取。
最初的版本是使用messages.txt
儲存留言,也就是當使用者輸入留言後,PHP 程式會直接寫入一個文字檔。這種方式雖然簡單,但有以下限制:
首先我們先在RDS上建立了一個MySQL資料庫,名稱為mydb1,裡面有一張messages資料表,結構如下:
(這邊就不細講RDS怎麼連,在第一週有做介紹,並用第一週的資料庫來做連線)
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
nickname VARCHAR(50) NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
然後修改昨日的PHP程式,讓它改用PDO連線到RDS,並把留言寫入messages資料表,再從資料庫讀出留言顯示。
在我們的留言板程式裡,為了讓資料能存到RDS資料庫,我使用了PDO (PHP Data Objects)來連線。PDO 就像是一個「翻譯機」,幫PHP跟資料庫溝通。它的好處是:
簡單來說,PDO讓我們可以更安全、更方便地把資料存進資料庫。這也是為什麼在連接 RDS 時,我選擇用 PDO 而不是傳統的mysqli。
Step1: 登入EC2
ssh -i ~/Downloads/MyFirstEC2-key.pem ec2-user@你的EC2_IP
Step2: 切換到網站目錄
cd /var/www/html
Step3: 編輯index.php
sudo nano index.php
Step4: 將程式修改為使用 PDO + RDS,寫入與讀取留言都透過資料庫完成
<?php
date_default_timezone_set("Asia/Taipei");
$host = "<你的RDS Endpoint>";
$db = "mydb1";
$user = "admin";
$pass = "你的密碼";
$charset = "utf8mb4";
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
try {
$pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
} catch (PDOException $e) {
die("連線失敗: " . $e->getMessage());
}
// 送出留言
if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_POST["message"])) {
$msg = htmlspecialchars($_POST["message"]);
$stmt = $pdo->prepare("INSERT INTO messages (nickname, message) VALUES (?, ?)");
$stmt->execute(['訪客', $msg]);
header("Location: /");
exit;
}
// 讀留言
$stmt = $pdo->query("SELECT nickname, message, created_at FROM messages ORDER BY created_at DESC");
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
Step5: 安裝 PHP MySQL 擴充
sudo yum install -y php-mysqlnd
sudo systemctl restart httpd
首先先在我們的網站中輸入我們想打的內容,確實按下送出後我們再次回到終端機
進入 RDS 資料庫:
mysql -h <你的RDS Endpoint> -P 3306 -u admin -p
選擇資料庫:
USE mydb1;
查看留言是否有成功寫入:
SELECT * FROM messages ORDER BY created_at DESC;
只要能看到留言內容出現在結果中,就代表 PHP 網站確實已經把資料存到 RDS囉!