<?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_* 已移除。
<?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 = 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,統一異常處理。utf8mb4(支持 Emoji)。display_errors,記錄錯誤日誌。| 現象 | 原因 | 解決 |
|---|---|---|
| SQLSTATE[HY000] [1045] Access denied | 用戶名/密碼/主機錯誤 | 檢查 MySQL 用戶權限 GRANT ... ON db.* TO 'user'@'%' |
| SQLSTATE[HY000] [2002] Connection refused | MySQL 服務未啟動/端口錯誤 | systemctl status mysql、檢查 bind-address |
| Incorrect string value | 字符集不匹配 | 表/庫/連接均設置 utf8mb4 |