如何在 MySQL 中安全更新包含保留字字段的数据库记录

梦磊吖_7644

梦磊吖_7644

2026-08-16

619人浏览

原创

如何在 MySQL 中安全更新包含保留字字段的数据库记录

本文详解 PHP 操作 MySQL 时因使用保留字(如 like、dislike)作为列名导致 SQL 语法错误的问题,并提供带反引号转义、预处理防注入、结构优化的完整解决方案。

本文详解 php 操作 mysql 时因使用保留字(如 `like`、`dislike`)作为列名导致 sql 语法错误的问题,并提供带反引号转义、预处理防注入、结构优化的完整解决方案。

在 PHP + MySQL 开发中,直接将 SQL 关键字(如 LIKE、ORDER、GROUP、DISLIKE 等——注意:dislike 虽非标准保留字,但 like 是 MySQL 严格保留关键字)用作表名或列名,会导致 mysqli_query() 报错,典型提示为:

You have an error in your SQL syntax; ... near 'like='1' WHERE id='1''

根本原因在于:MySQL 解析器将未加标识符分隔符的 like 视为操作符(如 WHERE col LIKE '%val%'),而非字段名,因此语句 SET like='1' 被视为语法错误。

✅ 正确做法:对所有可能冲突的标识符(尤其是 like)强制使用反引号(`)包裹:

UPDATE `simple` SET `like` = 1 WHERE `id` = 1;

同时,原始代码存在多个严重问题,需一并修复:

? 1. 修复 SQL 字段名转义(关键)

将:

$sql = "UPDATE simple SET like='".$likes."' WHERE id='1'";

改为:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
$sql = "UPDATE `simple` SET `like` = ? WHERE `id` = ?";

✅ 使用反引号包裹表名 simple 和列名 like(dislike 同理),避免解析歧义。

? 2. 禁用拼接字符串,改用预处理语句(防 SQL 注入)

原始代码直接拼接变量,极易被恶意输入利用(如 ?like=1'; DROP TABLE simple--)。应使用 mysqli_prepare():

include('config.php');

if (isset($_GET['like']) || isset($_GET['dislike'])) {
    $id = 1;

    if (isset($_GET['like'])) {
        // 安全更新:预处理 + 参数绑定
        $stmt = $conn->prepare("UPDATE `simple` SET `like` = `like` + 1 WHERE `id` = ?");
        $stmt->bind_param("i", $id);

        if ($stmt->execute()) {
            echo '? Like updated! <a href="index.php">Go back</a>';
        } else {
            echo "❌ Error: " . $stmt->error;
        }
        $stmt->close();
    }

    if (isset($_GET['dislike'])) {
        $stmt = $conn->prepare("UPDATE `simple` SET `dislike` = `dislike` + 1 WHERE `id` = ?");
        $stmt->bind_param("i", $id);

        if ($stmt->execute()) {
            echo '? Dislike updated! <a href="index.php">Go back</a>';
        } else {
            echo "❌ Error: " . $stmt->error;
        }
        $stmt->close();
    }

    mysqli_close($conn);
}

? 提示:直接使用 SETlike=like+ 1 可省去 SELECT 查询,提升性能与原子性(避免并发竞态)。

⚠️ 3. 其他必须修正项

  • HTML 表单方法:当前 <form action="..."></form> 默认为 GET,虽可工作,但更新操作应使用 POST(符合 REST 语义,且避免 URL 长度/缓存问题);
  • 字段命名规范:强烈建议重命名 like → likes_count、dislike → dislikes_count,彻底规避保留字风险;
  • 错误处理:mysqli_error() 仅用于调试,生产环境应记录日志而非暴露给用户;
  • 配置文件安全性:确保 config.php 不在 Web 可访问路径下,且密码等敏感信息不硬编码。

✅ 最佳实践总结

项目 推荐方案
列名冲突 始终用反引号包裹(`like`),或重命名为非保留字
SQL 安全 100% 使用预处理语句(prepare + bind_param)
原子操作 用 SET col = col + 1 替代先查后更,避免竞态与 N+1 查询
HTTP 方法 更新类操作统一使用 POST,配合 CSRF Token(进阶)
数据库设计 主键 id 建议设为 INT UNSIGNED AUTO_INCREMENT,避免硬编码 id=1

遵循以上方案,即可彻底解决 “Cannot update database record” 类语法错误,并构建出健壮、安全、可维护的点赞系统。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
常用的mysql管理工具
常用的mysql管理工具

常用的mysql管理工具有:1、MySQL Workbench、phpMyAdmin、MySQL Shell、Navicat、DBeaver和DataGrip。更多关于mysql管理工具的问题,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

2023.11.03

5110

11

phpmyadmin导入sql文件失败怎么办
phpmyadmin导入sql文件失败怎么办

在phpmyadmin导入sql文件失败时,可以尝试以下解决方案:1、检查文件权限和格式;2、确保文件字符集与数据库兼容;3、确认表结构兼容;4、检查外键约束和禁用外键检查;5、增加最大上传文件大小;6、分批导入或使用命令行导入;7、联系托管提供商寻求帮助。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

2904

7

phpmyadmin怎么改成中文
phpmyadmin怎么改成中文

通过安装中文语言包、将其上传到 phpmyadmin 目录、修改配置文件和重启 phpmyadmin,可以将 phpmyadmin 的界面改为中文。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

661

5

phpmyadmin访问不了怎么回事
phpmyadmin访问不了怎么回事

phpmyadmin 无法访问可能是以下原因造成:1、服务器问题:mysql 服务未运行或防火墙阻止访问;2、配置问题:安装/配置错误、错误的配置文件设置或缺少必要的 php 扩展;3、浏览器问题:浏览器缓存、扩展干扰或浏览器不兼容;4、其他原因:dns 问题、恶意软件或网络连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

779

6

phpMyAdmin安装教程大全
phpMyAdmin安装教程大全

本专题整合了phpMyAdmin程序安装相关教程,阅读专题下面的文章了解更多详细内容。

2025.10.31

805

23

PHPMyadmin配置
PHPMyadmin配置

本专题整合了phpmyadmin配置相关教程,阅读专题下面的文章了解更多详细步骤。

2025.12.04

469

19

XAMPP 与 phpMyAdmin 数据库管理实操
XAMPP 与 phpMyAdmin 数据库管理实操

专注于 XAMPP 内置的 phpMyAdmin 数据库管理工具,系统讲解数据库和数据表的创建与设计、SQL 语句执行、CSV/SQL 格式数据的导入导出、定时备份与一键还原、多数据库批量管理等日常操作,帮助开发者高效管理本地 MySQL 数据。

2026.04.08

315

26

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

180

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

80

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 176人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 279人学习