在动态网站开发中,更新数据库记录是绕不开的操作。以前老版本的PHP用mysql_query()函数干这活,但PHP 5.5开始把它标记为过时,到了PHP 7.0就彻底删掉了。
为什么不用老函数了? 我个人理解,除了安全漏洞多,那玩意儿还不支持预处理语句,写出来的代码容易出SQL注入问题。现在主流做法是用MySQLi或者PDO。
两种主流方式对比
| 特性 | MySQLi | PDO |
|---|---|---|
| 数据库支持 | 仅MySQL | 支持12种数据库 |
| 预处理语句 | 支持 | 支持 |
| 写法风格 | 过程式+面向对象 | 面向对象 |
个人建议:如果你确定项目只用MySQL,MySQLi足够;但要是以后可能换数据库(比如从MySQL迁到PostgreSQL),PDO会让你省很多事。
UPDATE语句基本语法
UPDATE 表名
SET 字段1=新值, 字段2=新值
WHERE 条件;
注意:忘了写WHERE子句,整张表的数据都会被更新。这问题我早年踩过坑,线上环境直接把用户积分全改乱了,从那之后写UPDATE前都先确认一遍WHERE。
一、MySQLi过程式写法
准备数据(emp1表更新前)
| Id | Name | Salary |
|---|---|---|
| 1 | 张明 | 7000 |
| 2 | 李芳 | 6000 |
| 3 | 王磊 | 8000 |
代码示例
<?php
$host = 'localhost:3306';
$user = 'root';
$pass = '123456';
$dbname = 'company';
$conn = mysqli_connect($host, $user, $pass, $dbname);
if (!$conn) {
die('连接失败:' . mysqli_connect_error());
}
echo '连接成功<br/>';
$id = 2;
$name = "李芳";
$salary = 9500;
$sql = "UPDATE emp1 SET name=\"$name\", salary=$salary WHERE id=$id";
if (mysqli_query($conn, $sql)) {
echo "更新成功";
} else {
echo "更新失败:" . mysqli_error($conn);
}
mysqli_close($conn);
?>
更新后emp1表
| Id | Name | Salary |
|---|---|---|
| 1 | 张明 | 7000 |
| 2 | 李芳 | 9500 |
| 3 | 王磊 | 8000 |
经验分享:过程式写法简单直接,适合小型脚本。但代码多了以后,函数嵌套容易乱。我个人更倾向面向对象写法,结构清晰些。
二、MySQLi面向对象写法
准备数据(staff表更新前)
| Id | Name | Age |
|---|---|---|
| 101 | 赵一航 | 26 |
| 102 | 孙丽娜 | 27 |
| 103 | 周晓晨 | 25 |
代码示例
<?php
$mysqli = new mysqli("localhost", "root", "123456", "company");
if ($mysqli->connect_error) {
die("连接错误:" . $mysqli->connect_error);
}
$sql = "UPDATE staff SET Age='28' WHERE id=102";
if ($mysqli->query($sql) === TRUE) {
echo "记录更新成功";
} else {
echo "执行失败:{$sql}。" . $mysqli->error;
}
$mysqli->close();
?>
更新后staff表
| Id | Name | Age |
|---|---|---|
| 101 | 赵一航 | 26 |
| 102 | 孙丽娜 | 28 |
| 103 | 周晓晨 | 25 |
三、PDO方式更新记录
准备数据(users表更新前)
| Id | Name | Age |
|---|---|---|
| 201 | 刘志强 | 26 |
| 202 | 陈雅婷 | 24 |
| 203 | 吴子轩 | 25 |
代码示例
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=company", "root", "123456");
// 设置错误模式为异常抛出,便于调试
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "UPDATE users SET Age='25' WHERE id=202";
$pdo->exec($sql);
echo "记录更新成功";
} catch(PDOException $e) {
die("执行失败:{$sql}。" . $e->getMessage());
}
// 关闭连接
unset($pdo);
?>
更新后users表
| Id | Name | Age |
|---|---|---|
| 201 | 刘志强 | 26 |
| 202 | 陈雅婷 | 25 |
| 203 | 吴子轩 | 25 |
为什么推荐PDO? 一个实际场景:公司项目要从MySQL迁移到SQL Server,用MySQLi的代码基本要重写,而PDO只需要改连接字符串。这个坑我帮别人重构项目时遇到过。
四、同时更新多个字段
准备数据(employee表更新前)
| ID | FirstName | LastName | Age |
|---|---|---|---|
| 301 | 王 | 小军 | 29 |
| 302 | 李 | 明远 | 27 |
| 303 | 张 | 雨桐 | 26 |
代码示例
<?php
$conn = mysqli_connect("localhost", "root", "123456", "company");
if (!$conn) {
die("连接失败:" . mysqli_connect_error());
}
$sql = "UPDATE employee SET FirstName='刘', LastName='一晨', Age='31' WHERE ID=302";
if (mysqli_query($conn, $sql)) {
echo "多字段更新成功";
} else {
echo "更新失败:" . mysqli_error($conn);
}
mysqli_close($conn);
?>
更新后employee表
| ID | FirstName | LastName | Age |
|---|---|---|---|
| 301 | 王 | 小军 | 29 |
| 302 | 刘 | 一晨 | 31 |
| 303 | 张 | 雨桐 | 26 |
本节课程知识要点
-
必须带WHERE条件:不带条件的UPDATE会清空整列数据,这是生产环境的大忌
-
使用预处理语句:当更新值来自用户输入时(比如表单提交),务必用预处理语句防止SQL注入
php// PDO预处理示例 $stmt = $pdo->prepare("UPDATE users SET age = :age WHERE id = :id"); $stmt->execute([':age' => $userAge, ':id' => $userId]); -
数据验证:更新前检查数据类型,比如年龄应该是整数、邮箱应该符合格式
-
错误处理机制:开发阶段开启详细报错,上线后记录日志但不显示给用户
-
选择建议:
-
单数据库 + 需要过程式快速开发 → MySQLi过程式
-
单数据库 + 喜欢面向对象 → MySQLi面向对象
-
多数据库或追求统一接口 → PDO
-
更新MySQL数据记录,MySQLi和PDO都能胜任。我个人这几年更倾向于PDO,因为异常处理机制清晰,跨数据库迁移时不用改业务代码。新手建议先从MySQLi过程式入门,理解基本逻辑后再切到PDO,循序渐进不容易卡住。