You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:15:28