PHP执行MySQL UPDATE语句更新数据报SQL语法错误求助
问题成因
报错的核心原因是*like是MySQL/MariaDB的保留关键字*:
SQL语法中LIKE是专门用于模糊查询的运算符(常见写法如WHERE content LIKE '%关键词%'),你在建表时直接将like作为自定义字段名使用,编写UPDATE语句时又没有对该字段名做标识符转义,数据库执行SQL时会把SET like='1'位置的like解析为SQL运算符,而非你自定义的字段,最终触发语法错误,和报错提示中near 'like='1' WHERE id='1''的错误位置完全吻合。
另外原有代码还存在两个非报错类的逻辑问题:
- 计数更新逻辑冗余:先查询当前计数值、PHP端加1再回写的写法,在并发请求场景下会出现计数丢失的问题,无法保证计数准确性。
- 功能分支不全:现有代码只处理了点赞的逻辑分支,没有补全点踩的更新逻辑。
修复方案
快速修复(无需修改表结构)
在SQL语句中用反引号(`,键盘左上角与波浪号同按键)包裹所有用到保留字的自定义字段名,明确告知数据库这是自定义标识符而非SQL语法关键字。
同时可以将计数逻辑优化为数据库端原子更新,省略先查后改的冗余步骤,从根源避免并发计数错误,对应更新语句写法如下:
-- 点赞+1 语句 UPDATE simple SET `like` = `like` + 1 WHERE id = 1; -- 点踩+1 语句 UPDATE simple SET `dislike` = `dislike` + 1 WHERE id = 1;
修复后的完整PHP业务代码参考:
include('config.php'); // 增加数据库连接错误检查 if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } if(isset($_GET['like']) || isset($_GET['dislike'])) { if(isset($_GET['like'])) { // 直接原子更新,无需先查再改 $sql = "UPDATE simple SET `like` = `like` + 1 WHERE id = 1"; } if(isset($_GET['dislike'])) { $sql = "UPDATE simple SET `dislike` = `dislike` + 1 WHERE id = 1"; } $res = mysqli_query($conn, $sql); if($res) { echo 'Success <a href="index.php">Go back</a>'; } else { echo "Error: ".mysqli_error($conn).'<br>'; } mysqli_close($conn); }
长期规范修复(推荐)
最稳妥的方案是修改表结构,将和保留字冲突的字段名改为语义明确的非保留字名称,比如把like字段改名为like_count,dislike字段改名为dislike_count,后续写SQL时就不需要额外加反引号转义,也能避免其他开发者接手代码时踩同类语法坑。
额外开发建议:后续编写数据库操作代码时,尽量使用mysqli预处理语句绑定参数,不要直接把变量拼接到SQL字符串中,避免SQL注入安全风险。
内容的提问来源于stack exchange,提问作者olzha bala
相关产品推荐
相关产品推荐

