
在 MySQL 中,LIKE 是保留关键字,若直接用作列名而未加反引号包裹,会导致 UPDATE 等语句解析失败;正确做法是使用反引号(`)转义所有可能冲突的标识符,如 `like`、`dislike` 和 `simple`。
在 mysql 中,`like` 是保留关键字,若直接用作列名而未加反引号包裹,会导致 update 等语句解析失败;正确做法是使用反引号(`` ` ``)转义所有可能冲突的标识符,如 `` `like` ``、`` `dislike` `` 和 `` `simple` ``。
在 PHP + MySQL 开发中,将 like 和 dislike 用作字段名看似直观,但会引发严重的语法错误——因为 LIKE 是 MySQL 的核心保留字,用于 WHERE column LIKE '%value%' 等模式匹配操作。当它出现在 UPDATE simple SET like = ... 中时,MySQL 解析器会将其误认为操作符而非列名,从而抛出类似以下错误:
Error: You have an error in your SQL syntax; check the manual [...] near 'like='1' WHERE id='1''
✅ 正确写法:对表名和所有含保留字的列名添加反引号:
$sql = "UPDATE `simple` SET `like` = ? WHERE `id` = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "ii", $likes, $id); mysqli_stmt_execute($stmt);
⚠️ 更重要的是:您当前的代码存在严重安全与架构缺陷,需同步修复:
-
SQL 注入风险:原始代码直接拼接
$likes到 SQL 字符串中,极易被恶意利用。务必改用预处理语句(如上所示); -
逻辑不完整:仅处理了
like按钮,未实现dislike分支,且未防止重复提交(如刷新页面重复计数); - 缺少错误处理与事务保障:点赞/踩应为原子操作,建议用事务包裹读-改-写流程;
-
字段命名建议:长期维护角度,强烈建议重命名字段,例如改为
upvotes/downvotes,彻底规避保留字问题。
? 完整安全示例(含 dislike 支持与防重提交):
include('config.php');
// 使用 session 防止重复提交(简易版)
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['action']) && !isset($_SESSION['voted'])) {
$id = 1;
$action = $_GET['action'] === 'like' ? 'like' : 'dislike';
// 预处理语句确保安全
$sql = "UPDATE `simple` SET `" . $action . "` = `" . $action . "` + 1 WHERE `id` = ?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "i", $id);
if (mysqli_stmt_execute($stmt)) {
$_SESSION['voted'] = true; // 标记已投票
echo "Success! <a href='index.php'>Go back</a>";
} else {
echo "Database error: " . mysqli_error($conn);
}
mysqli_stmt_close($stmt);
}
mysqli_close($conn);? 补充说明:
- HTML 表单建议改用
method="GET"显式声明,并统一通过?action=like传递意图,比两个独立按钮参数更清晰; - 生产环境应增加用户唯一性校验(如记录 IP/Session/用户ID),避免刷票;
- 始终验证并过滤输入——即使使用预处理,也要确认
$_GET['action']仅限'like'或'dislike'。
总结:反引号是解决保留字问题的快捷方案,但根本之道是规范命名 + 预处理 + 业务逻辑加固。


















