我只是在修改一个简单的时间表脚本,如果我对数据库进行简单的插入,那么一切都很好。我也可以更新条目没有问题,我的问题是我想更新并保留信息(这与我正在使用的CONCAT工作正常)但是只要我使用ON DUPLICATE KEY UPDATE就会中断。
$sql="INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')";
//ON DUPLICATE KEY UPDATE
//location=VALUES(location),
//description=VALUES(description),
//timein=VALUES(timein),
//timeout=VALUES(timeout),
//timespent=VALUES(timespent)
//WHERE employee=$employee";
echo $sql;echo "<br>";
mysql_query($sql)or die(mysql_error());
如果我取消注释重复的密钥,我会得到一个“你的SQL语法有错误;请查看与你的MySQL服务器版本相对应的手册,以便在第9行使用'WHERE employee ='Eric''附近的正确语法“错误。我唯一能想到的就是我在一张完全空的桌子上这样做,但我认为INSERT会解决这个问题。我所有的$变量都是干净的(没有PDO,也得学习)只是real_escape_string
$sql="INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')
ON DUPLICATE KEY UPDATE
location=VALUES(location),
description=VALUES(description),
timein=VALUES(timein),
timeout=VALUES(timeout),
timespent=VALUES(timespent)
WHERE employee='$employee'";
echo $sql;echo "<br>";
mysql_query($sql)or die(mysql_error());
答案 0 :(得分:1)
根据INSERT ... ON DUPLICATE KEY UPDATE的文档,查询末尾不应该有WHERE语句:
$sql="INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')
ON DUPLICATE KEY UPDATE
location=VALUES(location),
description=VALUES(description),
timein=VALUES(timein),
timeout=VALUES(timeout),
timespent=VALUES(timespent)";
注意:
推荐的API建议使用mysqli或 PDO_MySQL扩展。不建议使用旧的mysql 新开发的扩展,因为从PHP开始已经弃用 5.5.0并将在以后删除。下面提供了详细的特征比较矩阵。三者的整体表现 扩展被认为是大致相同的。虽然 扩展的表现只占总数的一小部分 运行PHP Web请求的时间。通常,影响低至0.1%。
如果您还没有这样做,则必须在查询中使用它们之前正确转义文本变量:
$employee = mysql_real_escape_string($employee);
// and so on with the other variables
阅读How does this SQL injection work?和Why shouldn't I use mysql_* functions in PHP?,详细了解这些主题。
答案 1 :(得分:0)
不要在WHERE
中使用ON DUPLICATE KEY UPDATE
子句。重复密钥隐含WHERE
。
答案 2 :(得分:0)
例如:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
如果您的第一列,即此处员工是唯一的,将在内部考虑where子句
WHERE employee =&#39; $ employee&#39;
如果它不是唯一的,它将寻找工作日,......
INSERT INTO sheet(employee, workdate, location, description, timein, timeout, timespent)
VALUES('$employee', CURDATE(), '$location', '$description', '$timein', '$timeout', '$timespent')
ON DUPLICATE KEY UPDATE
[
//columns to be update
location=VALUES(location),
description=VALUES(description),
timein=VALUES(timein),
timeout=VALUES(timeout),
timespent=VALUES(timespent)
]
答案 3 :(得分:-1)
让员工参加抽奖活动。如果它是一个字符串,它必须有它的引号。还在变量周围加上花括号。