PHP / MYSQL INSERT ON DUPLICATE KEY失败

时间:2013-04-10 17:29:36

标签: php mysql

我只是在修改一个简单的时间表脚本,如果我对数据库进行简单的插入,那么一切都很好。我也可以更新条目没有问题,我的问题是我想更新并保留信息(这与我正在使用的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());

4 个答案:

答案 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)

让员工参加抽奖活动。如果它是一个字符串,它必须有它的引号。还在变量周围加上花括号。