首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 與 MySQL 互動入門:從連線、建表、寫入到查詢

     編輯:PHP 綜合知識

教學目標

建立一個簡單的水果偏好調查系統,示範 PHP 與 MySQL 完整互動流程:建立資料庫/資料表 → HTML 表單收集資料 → PHP 接收寫入 → 查詢顯示結果。

1. 建立資料庫與資料表

-- MySQL 指令列
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE mydb;

CREATE TABLE infostar (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    choice VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 前端表單

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>水果偏好調查</title></head>
<body>
<h1>您喜歡吃什麼水果?</h1>
<form method="POST" action="diaocha.php">
  <p>姓名:<input name="name" maxlength="50" required></p>
  <p>Email:<input name="email" type="email" maxlength="100" required></p>
  <p>選擇:
    <label><input type="radio" name="choice" value="apple" required> 蘋果</label>
    <label><input type="radio" name="choice" value="orange"> 橙子</label>
    <label><input type="radio" name="choice" value="pear"> 梨子</label>
    <label><input type="radio" name="choice" value="coconut"> 椰子</label>
    <label><input type="radio" name="choice" value="watermelon"> 西瓜</label>
    <label><input type="radio" name="choice" value="banana"> 香蕉</label>
  </p>
  <p><input type="submit" value="送出"> <input type="reset" value="重填"></p>
</form>
</body></html>

3. PHP 處理表單寫入

<?php
// diaocha.php
// 資料庫設定(建議放在獨立 config.php)
$host = 'localhost';
$user = 'root';
$pass = '';
$dbname = 'mydb';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]);
} catch (PDOException $e) {
    die("資料庫連線失敗:" . $e->getMessage());
}

// 接收並驗證輸入
$name   = trim($_POST['name'] ?? '');
$email  = trim($_POST['email'] ?? '');
$choice = $_POST['choice'] ?? '';

if ($name === '' || $email === '' || $choice === '') {
    die("請填寫完整資料。<a href='diaocha.htm'>返回</a>");
}

// 寫入資料庫(Prepared Statement 防 SQL 注入)
$stmt = $pdo->prepare("INSERT INTO infostar (name, email, choice) VALUES (?, ?, ?)");
$stmt->execute([$name, $email, $choice]);

echo "<h2>感謝參與!</h2>";
echo "<p>您好,$name</p>";
echo "<p>Email:$email</p>";
echo "<p>您的選擇:$choice</p>";
echo "<p>資料已儲存。<a href='diaocha.htm'>返回</a></p>";
?>

4. 查詢特定選擇的用戶

<?php
// apple.php - 顯示所有選擇蘋果的用戶
$host = 'localhost'; $user = 'root'; $pass = ''; $dbname = 'mydb';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
} catch (PDOException $e) {
    die("連線失敗:" . $e->getMessage());
}

$stmt = $pdo->prepare("SELECT name, email, created_at FROM infostar WHERE choice = ?");
$stmt->execute(['apple']);
$users = $stmt->fetchAll();

if (empty($users)) {
    echo "<p>目前沒有人選擇蘋果。</p>";
} else {
    echo "<h2>喜歡蘋果的用戶 (共 " . count($users) . " 人)</h2>";
    echo "<ul>";
    foreach ($users as $u) {
        echo "<li>" . htmlspecialchars($u['name']) . " (" . htmlspecialchars($u['email']) . ") - " . $u['created_at'] . "</li>";
    }
    echo "</ul>";
}
?>

關鍵概念對照表

舊式 mysql_* 函式現代 PDO 寫法優勢
mysql_connect()new PDO($dsn, $user, $pass)支援多種資料庫、例外處理
mysql_select_db()DSN 指定 dbname=...連線字串統一管理
mysql_query($sql)$pdo->query($sql) / $pdo->prepare()->execute()Prepared Statement 防注入
mysql_fetch_assoc()$stmt->fetch() / fetchAll()統一介面、支援迭代器
mysql_num_rows()$stmt->rowCount() / count($rows)更可靠
mysql_insert_id()$pdo->lastInsertId()支援多種序列類型
mysql_close()$pdo = null / 變數超出作用域自動資源管理
@mysql_* 抑制錯誤try-catch 例外處理結構化錯誤處理

安全性最佳實務

  1. 永遠使用 Prepared Statement:參數綁定徹底防止 SQL 注入。
  2. 輸入驗證與清理:trim()、長度限制、格式驗證(email、日期等)。
  3. 輸出轉義:HTML 輸出用 htmlspecialchars() 防 XSS。
  4. 最小權限原則:資料庫帳號僅授予必要權限(SELECT/INSERT/UPDATE)。
  5. 錯誤資訊不外洩:生產環境關閉 display_errors,記錄至日誌。
  6. HTTPS:傳輸加密保護表單資料。

進階擴充方向

  • 加入 CSRF Token 保護表單提交
  • 實作分頁查詢(LIMIT ?, ?)
  • 統計圖表化(Chart.js / Google Charts)
  • 匯出 CSV/Excel 功能
  • 引入資料庫遷移工具管理 Schema 版本
  • 使用 ORM(Eloquent/Doctrine)簡化資料操作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved