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

PHP + MySQL 數據插入操作完整指南與安全實踐

     編輯:PHP 綜合知識

業務流程

  1. GET 請求顯示插入表單
  2. POST 提交表單數據
  3. 服務端驗證、轉義、執行 INSERT
  4. 返回自增 ID 或錯誤信息

安全增強版代碼(mysqli 預處理 + 驗證)

<?php
$host = 'localhost'; $user = 'root'; $pass = 'password'; $db = 'phpdev';

$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) { die("連接失敗: " . $mysqli->connect_error); }
$mysqli->set_charset('utf8mb4');

// 處理表單提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 驗證必填字段
    $required = ['country', 'animal', 'cname'];
    $errors = [];
    foreach ($required as $field) {
        if (empty($_POST[$field])) { $errors[] = "{$field} 不能為空"; }
    }

    if (empty($errors)) {
        $country = $_POST['country'];
        $animal = $_POST['animal'];
        $cname = $_POST['cname'];

        // 預處理語句自動處理轉義,防 SQL 注入
        $stmt = $mysqli->prepare("INSERT INTO symbols (country, animal, cname) VALUES (?, ?, ?)");
        $stmt->bind_param("sss", $country, $animal, $cname);
        if ($stmt->execute()) {
            echo "記錄插入成功,自增 ID: " . $mysqli->insert_id;
        } else {
            echo "插入失敗: " . $stmt->error;
        }
        $stmt->close();
    } else {
        echo "<ul><li>" . implode("</li><li>", $errors) . "</li></ul>";
    }
}
$mysqli->close();
?>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>插入記錄</title></head><body>
<h1>插入操作</h1>
<form method="post" action="">
    國家:<input type="text" name="country" required /><br>
    動物英文名:<input type="text" name="animal" required /><br>
    動物中文名:<input type="text" name="cname" required /><br>
    <button type="submit">提交</button>
</form>
</body></html>

核心安全要點

  • 棄用 mysql_*: 全面改用 mysqli 或 PDO。
  • 預處理語句: prepare() + bind_param() 徹底隔離數據與代碼,無需手動 real_escape_string。
  • 輸入驗證: 服務端必驗,前端 required 僅作輔助。
  • 字符集: 設置 utf8mb4 支持完整 Unicode(含 Emoji)。
  • 錯誤處理: 不向用戶暴露 SQL 詳情,記錄日志供排查。

進階:PDO 版本(推薦跨數據庫項目)

<?php
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false, // 使用真實預處理
]);

$stmt = $pdo->prepare("INSERT INTO symbols (country, animal, cname) VALUES (?, ?, ?)");
$stmt->execute([$country, $animal, $cname]);
echo "插入成功,ID: " . $pdo->lastInsertId();

批量插入優化

大量數據時,單條 INSERT 效率低。推薦:
1. INSERT INTO ... VALUES (...), (...), ... 多值單語句(注意 max_allowed_packet)。
2. 事務包裹多條 prepare/execute。
3. LOAD DATA INFILE 導入 CSV(需文件權限)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved