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

基于SESSION ID使用INSERT ON DUPLICATE KEY UPDATE实现分数存改的PHP问题

解决INSERT ... ON DUPLICATE KEY UPDATE的语法错误问题

嘿,我来帮你搞定这个SQL语法问题!你想用INSERT ... ON DUPLICATE KEY UPDATE实现"存在则更新,不存在则插入"的逻辑,思路完全没问题,但语法写错了,而且还有个关键前提得先确认。

首先要确认的核心前提

你的selfesteemscore表必须给UserID字段设置唯一约束(UNIQUE KEY),否则ON DUPLICATE KEY UPDATE根本不会生效——这个语法的核心就是靠唯一键冲突来触发更新操作的。如果还没设置,先给表加个唯一键:

ALTER TABLE selfesteemscore ADD UNIQUE KEY idx_userid (UserID);

分析你的错误写法

你尝试的两个SQL都不符合语法规范:

  • 第一个错误:ON DUPLICATE KEY UPDATE后面不需要再写表名和WHERE子句,数据库已经能通过唯一键冲突定位到要更新的行,多余的语法直接导致了报错。
  • 第二个错误:用了类似INSERT的VALUES(...)格式,这不是ON DUPLICATE KEY UPDATE的正确写法,正确的是直接指定列名和对应的更新值。

正确的代码实现

方式1:直接指定更新值

<?php
session_start(); // 别忘了开启Session,否则$_SESSION["userID"]拿不到值
include("php/functions.php");
include('connections/conn.php');

$userID = $_SESSION["userID"];
$newsselfesteemscore = mysqli_real_escape_string($conn, $_POST['selfesteemscore']);

// 正确的INSERT ... ON DUPLICATE KEY UPDATE语法
$insertquery1 = "INSERT INTO selfesteemscore(selestscore, UserID) 
                 VALUES('$newsselfesteemscore', '$userID')
                 ON DUPLICATE KEY UPDATE selestscore = '$newsselfesteemscore'";

$result1 = mysqli_query($conn, $insertquery1) or die(mysqli_error($conn));
mysqli_close($conn);
?>

方式2:用VALUES()函数复用插入值(更简洁)

如果插入和更新的字段值一致,可以用VALUES(列名)来引用插入时的值,这样后面修改值的时候只需要改一处:

$insertquery1 = "INSERT INTO selfesteemscore(selestscore, UserID) 
                 VALUES('$newsselfesteemscore', '$userID')
                 ON DUPLICATE KEY UPDATE selestscore = VALUES(selestscore)";

更安全的建议:使用预处理语句

虽然你用了mysqli_real_escape_string来转义,但预处理语句能更彻底地避免SQL注入问题,推荐改成这样:

<?php
session_start();
include("php/functions.php");
include('connections/conn.php');

$userID = $_SESSION["userID"];
$newsselfesteemscore = $_POST['selfesteemscore'];

// 预处理SQL
$stmt = $conn->prepare("INSERT INTO selfesteemscore(selestscore, UserID) 
                        VALUES(?, ?)
                        ON DUPLICATE KEY UPDATE selestscore = ?");
// 绑定参数(s代表字符串,i代表整数,根据你的字段实际类型调整)
$stmt->bind_param("sii", $newsselfesteemscore, $userID, $newsselfesteemscore);
$stmt->execute();
$stmt->close();
$conn->close();
?>

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:00:42