PHP操作MySQL应优先使用PDO或mysqli面向对象方式,通过预处理语句防止SQL注入,设置utf8mb4字符集,严格校验连接与执行结果。

PHP连接MySQL并完成增删改查,核心在于安全连接 + 参数化操作 + 结果处理。推荐优先使用PDO,兼顾兼容性和安全性;mysqli面向对象方式也足够可靠。直接拼接SQL字符串(如"INSERT INTO users VALUES('".$name."')")极易引发SQL注入,必须避免。
建立安全数据库连接
无论用PDO还是mysqli,都要设置UTF-8字符集、开启错误提示,并验证连接状态。
-
PDO方式(推荐):启用异常模式和真实预处理,字符集设为
utf8mb4(支持emoji和完整中文)
<?php
$host = 'localhost';
$dbname = 'testdb';
$user = 'root';
$pass = '';
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());
}
?>
-
mysqli面向对象方式:连接后立即设置字符集,检查
connect_error
<?php
$mysqli = new mysqli('localhost', 'root', '', 'testdb');
if ($mysqli->connect_error) {
die("连接失败:" . $mysqli->connect_error);
}
$mysqli->set_charset("utf8mb4");
?>
立即学习“PHP免费学习笔记(深入)”;
执行INSERT插入操作
必须使用预处理语句绑定参数,防止用户输入破坏SQL结构。
- PDO写法:准备语句 → 绑定值 → 执行
$sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['张三', 'zhangsan@example.com', 25]);
echo "插入成功,ID:" . $pdo->lastInsertId();
- mysqli写法:prepare → bind_param(注意类型标识s/i/d)→ execute
$sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("sdi", $name, $email, $age);
$name = "李四"; $email = "lisi@example.com"; $age = 30;
$stmt->execute();
echo "插入成功,ID:" . $mysqli->insert_id;
执行SELECT查询操作
查询结果需逐行遍历,避免直接输出整个结果集;带条件时同样要用占位符。
- 查全部或按条件筛选,返回关联数组更易读
$sql = "SELECT id, name, email FROM users WHERE age > ? ORDER BY id DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute([18]);
$users = $stmt->fetchAll();
foreach ($users as $row) {
echo "ID: {$row['id']}, 姓名: {$row['name']}, 邮箱: {$row['email']}
";
}
- 若只取一行,可用
fetch();确认有数据再处理,避免空结果报错
执行UPDATE和DELETE操作
这两类操作必须带WHERE条件,否则会误改/误删整张表;执行后检查影响行数确认是否生效。
- 更新示例(PDO)
$sql = "UPDATE users SET email = ?, age = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(['newemail@example.com', 26, 101]);
if ($stmt->rowCount() > 0) {
echo "更新了 {$stmt->rowCount()} 行";
} else {
echo "未找到匹配的记录";
}
- 删除示例(mysqli)
$sql = "DELETE FROM users WHERE id IN (?, ?, ?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("iii", $id1, $id2, $id3);
$id1 = 101; $id2 = 102; $id3 = 103;
$stmt->execute();
echo "删除了 {$stmt->affected_rows} 行";



















