2013-04-10 136 views
1

我只是修改一个简单的时间表脚本,如果我做一个简单的插入数据库一切都很好。我可以更新条目没有问题,我的问题是我想更新并保留信息(这与我正在使用的CONCAT正常工作),但只要我使用ON DUPLICATE KEY UPDATE,它就会中断。PHP/MYSQL INSERT ON DUPLICATE KEY失败

$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服务器版本使用附近的‘WHERE员工=’埃里克”正确的语法手册'在第9行“错误。唯一我能想到的是我在一张完全空的桌子上这样做,但我认为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

什么您使用的是MySQL服务器的版本? – halfer 2013-04-10 17:40:45

+0

我在5.5上通过Webmatrix运行这个测试,然后当我很高兴的时候上传到我的虚拟主机。 – 2013-04-10 17:43:30

+0

删除'WHERE'条件,mySQL已经知道了。 – Sammitch 2013-04-10 17:43:36

回答

-1

把员工打入抽搐。如果它是一个字符串,它必须有引号。同时在变量周围放置花括号。

+0

对不起,它确实有滴答'$员工'我刚刚删除它们,因为我想看看它是否有所作为。我试过用''“不解决它:( – 2013-04-10 17:38:03

0

请勿在ON DUPLICATE KEY UPDATE中使用WHERE子句。重复密钥暗示WHERE

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?以了解更多关于这些主题。

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员工='$员工

,如果它不是唯一的它会寻找workdate,...

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) 
] 
相关问题