← PHP插入数据库记录:告别mysql_query正确使用mysqli与PDO PHP删除MySQL数据记录:DELETE语句 →

PHP更新MySQL数据记录:从基础到实践

原创 2026-05-21 PHP 已有人查阅

在动态网站开发中,更新数据库记录是绕不开的操作。以前老版本的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

本节课程知识要点

  1. 必须带WHERE条件:不带条件的UPDATE会清空整列数据,这是生产环境的大忌

  2. 使用预处理语句:当更新值来自用户输入时(比如表单提交),务必用预处理语句防止SQL注入

    php
    // PDO预处理示例
    $stmt = $pdo->prepare("UPDATE users SET age = :age WHERE id = :id");
    $stmt->execute([':age' => $userAge, ':id' => $userId]);
  3. 数据验证:更新前检查数据类型,比如年龄应该是整数、邮箱应该符合格式

  4. 错误处理机制:开发阶段开启详细报错,上线后记录日志但不显示给用户

  5. 选择建议

    • 单数据库 + 需要过程式快速开发 → MySQLi过程式

    • 单数据库 + 喜欢面向对象 → MySQLi面向对象

    • 多数据库或追求统一接口 → PDO

更新MySQL数据记录,MySQLi和PDO都能胜任。我个人这几年更倾向于PDO,因为异常处理机制清晰,跨数据库迁移时不用改业务代码。新手建议先从MySQLi过程式入门,理解基本逻辑后再切到PDO,循序渐进不容易卡住。

← PHP插入数据库记录:告别mysql_query正确使用mysqli与PDO PHP删除MySQL数据记录:DELETE语句 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号