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

PHP MySQL 快速測試代碼模板(PDO 版)

     編輯:PHP 相關知識

棄用 mysql_* 函數,擁抱 PDO

原文使用的 mysql_connect 等函數自 PHP 5.5 棄用,PHP 7.0 完全移除。現代代碼必須使用 PDO 或 mysqli,推薦 PDO 因其數據庫無關性、預處理語句、異常處理更優雅。

完整可運行測試模板

<?php
// db_test.php - 單文件快速驗證 MySQL 連接與 CRUD
// 用法:修改下方配置後直接運行 `php db_test.php`

$config = [
    'host' => '127.0.0.1',
    'port' => 3306,
    'dbname' => 'test_db',
    'user' => 'root',
    'pass' => 'password',
    'charset' => 'utf8mb4',
];

try {
    $dsn = "mysql:host={$config['host']};port={$config['port']};dbname={$config['dbname']};charset={$config['charset']}";
    $pdo = new PDO($dsn, $config['user'], $config['pass'], [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false, // 使用真實預處理
    ]);
    echo "✅ 數據庫連接成功\n";
} catch (PDOException $e) {
    die("❌ 連接失敗: {$e->getMessage()}\n");
}

// ===== 1. 建表測試 =====
$pdo->exec("CREATE TEMPORARY TABLE IF NOT EXISTS `test_crud` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50) NOT NULL,
    `email` VARCHAR(100) NOT NULL,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
echo "✅ 表結構就緒\n";

// ===== 2. 插入 (Create) =====
$stmt = $pdo->prepare("INSERT INTO `test_crud` (`name`, `email`) VALUES (?, ?)");
$data = [
    ['張三', 'zhang@example.com'],
    ['李四', 'li@example.com'],
    ['王五', 'wang@example.com'],
];
foreach ($data as $row) {
    $stmt->execute($row);
    echo "➕ 插入 ID: {$pdo->lastInsertId()} - {$row[0]}\n";
}

// ===== 3. 查詢 (Read) =====
echo "\n📋 所有記錄:\n";
$stmt = $pdo->query("SELECT * FROM `test_crud`");
while ($row = $stmt->fetch()) {
    echo "  ID:{$row['id']} | {$row['name']} | {$row['email']} | {$row['created_at']}\n";
}

// 條件查詢
$stmt = $pdo->prepare("SELECT * FROM `test_crud` WHERE `name` LIKE ?");
$stmt->execute(['張%']);
echo "\n🔍 姓張的用戶:\n";
foreach ($stmt->fetchAll() as $row) {
    echo "  {$row['name']} - {$row['email']}\n";
}

// ===== 4. 更新 (Update) =====
$stmt = $pdo->prepare("UPDATE `test_crud` SET `email` = ? WHERE `name` = ?");
$stmt->execute(['zhang_new@example.com', '張三']);
echo "\n✏️ 更新影響行數: {$stmt->rowCount()}\n";

// ===== 5. 刪除 (Delete) =====
$stmt = $pdo->prepare("DELETE FROM `test_crud` WHERE `name` = ?");
$stmt->execute(['李四']);
echo "🗑️ 刪除影響行數: {$stmt->rowCount()}\n";

// ===== 6. 事務示例 =====
try {
    $pdo->beginTransaction();
    $pdo->prepare("INSERT INTO `test_crud` (`name`,`email`) VALUES ('事務測試1','t1@test')")->execute();
    $pdo->prepare("INSERT INTO `test_crud` (`name`,`email`) VALUES ('事務測試2','t2@test')")->execute();
    // 故意報錯測試回滾
    // $pdo->prepare("INSERT INTO `not_exist` ...")->execute();
    $pdo->commit();
    echo "🔄 事務提交成功\n";
} catch (Exception $e) {
    $pdo->rollBack();
    echo "🔄 事務回滾: {$e->getMessage()}\n";
}

// ===== 7. 清理 =====
$pdo->exec("DROP TEMPORARY TABLE IF EXISTS `test_crud`");
echo "\n🧹 清理完成,測試結束\n";

關鍵最佳實踐解析

常用調試技巧

// 1. 打印執行的 SQL(含綁定參數)
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, ['DebugStatement', [$pdo]]);
class DebugStatement extends PDOStatement {
    protected function __construct($pdo) { $this->pdo = $pdo; }
    public function execute($params = null) {
        $sql = $this->queryString;
        if ($params) $sql .= ' -- PARAMS: ' . json_encode($params);
        error_log('[SQL] ' . $sql);
        return parent::execute($params);
    }
}

// 2. 獲取最後執行的 SQL(調試用)
// $pdo->query('SELECT 1'); // 無直接方法,需上述擴展或啟用 MySQL 通用日誌

// 3. 連接信息
echo "驅動: {$pdo->getAttribute(PDO::ATTR_DRIVER_NAME)}\n";
echo "版本: {$pdo->getAttribute(PDO::ATTR_SERVER_VERSION)}\n";
echo "連接狀態: {$pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS)}\n";

將此文件保存為項目標準測試模板,新環境部署時只需修改配置數組即可快速驗證數據庫連通性與權限。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
實踐代碼體現優勢
DSN 含 charsetcharset=utf8mb4避免亂碼,支持 Emoji
錯誤模式異常ERRMODE_EXCEPTION統一 try-catch,避免靜默失敗
關閉模擬預處理EMULATE_PREPARES => false真實預處理,防注入、性能更好
默認關聯數組FETCH_ASSOC代碼可讀性高,避免數字索引
佔位符綁定? / :name徹底防 SQL 注入
臨時表隔離CREATE TEMPORARY TABLE測試不污染正式數據,連接斷開自動刪除