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

PHP 連接 MySQL 並寫入數據:從基礎到防注入的完整實踐

     編輯:PHP 相關知識

基礎流程(舊 mysql 擴展,僅供理解)

<?php
// 1. 連接
$conn = mysql_connect("localhost", "root", "");
// 2. 選庫
mysql_select_db("hello");
// 3. 執行寫入
$sql = "INSERT INTO members (username, password) VALUES ('$uname', '$psw')";
mysql_query($sql);
// 4. 關閉
mysql_close();
?>

嚴重缺陷:直接拼接變量導致 SQL 注入;mysql_* 已移除。

現代最佳實踐:PDO + 預處理語句

<?php
// config.php
$dsn = 'mysql:host=localhost;dbname=hello;charset=utf8mb4';
$user = 'root';
$pass = '';
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false, // 使用真實預處理
];
$pdo = new PDO($dsn, $user, $pass, $options);

寫入單條記錄

<?php
require 'config.php';

$uname = $_POST['username'] ?? '';
$psw   = password_hash($_POST['password'] ?? '', PASSWORD_DEFAULT); // 密碼哈希

$sql = "INSERT INTO members (username, password) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$uname, $psw]);

$lastId = $pdo->lastInsertId();
echo "寫入成功,ID: $lastId";

批量寫入(事務 + 預處理)

$users = [
    ['user1', 'pass1'],
    ['user2', 'pass2'],
    // ...
];

$pdo->beginTransaction();
try {
    $stmt = $pdo->prepare("INSERT INTO members (username, password) VALUES (?, ?)");
    foreach ($users as $u) {
        $stmt->execute([$u[0], password_hash($u[1], PASSWORD_DEFAULT)]);
    }
    $pdo->commit();
    echo "批量寫入 " . count($users) . " 條成功";
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

mysqli 面向對象寫法(備選)

$mysqli = new mysqli("localhost", "root", "", "hello");
$mysqli->set_charset("utf8mb4");

$stmt = $mysqli->prepare("INSERT INTO members (username, password) VALUES (?, ?)");
$stmt->bind_param("ss", $uname, $psw);

$uname = $_POST['username'];
$psw = password_hash($_POST['password'], PASSWORD_DEFAULT);
$stmt->execute();

echo "新用戶 ID: " . $stmt->insert_id;
$stmt->close();
$mysqli->close();

安全檢查清單

  • ✅ 使用預處理語句(prepare + execute),絕不拼接 SQL。
  • ✅ 密碼使用 password_hash() + password_verify(),禁用 MD5/SHA1。
  • ✅ 開啟 PDO::ATTR_ERRMODE_EXCEPTION,統一異常處理。
  • ✅ 數據庫用戶最小權限原則(僅需 INSERT/SELECT 權限)。
  • ✅ 字符集統一 utf8mb4(支持 Emoji)。
  • ✅ 生產環境關閉 display_errors,記錄錯誤日誌。

常見錯誤排查

現象原因解決
SQLSTATE[HY000] [1045] Access denied用戶名/密碼/主機錯誤檢查 MySQL 用戶權限 GRANT ... ON db.* TO 'user'@'%'
SQLSTATE[HY000] [2002] Connection refusedMySQL 服務未啟動/端口錯誤systemctl status mysql、檢查 bind-address
Incorrect string value字符集不匹配表/庫/連接均設置 utf8mb4
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved