1

我只是在修改一个简单的时间表脚本,如果我在数据库中做一个简单的插入,一切都很好。我也可以更新条目没问题,我的问题是我想更新并保留信息(这在我使用的 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 会解决这个问题。我所有的 $variables 都是干净的(没有 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

4 回答 4

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
    

阅读此 SQL 注入如何工作?为什么我不应该在 PHP 中使用 mysql_* 函数?了解有关这些主题的更多信息。

于 2013-04-10T17:44:52.500 回答
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'

如果它不是唯一的,它将寻找工作日期,...

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)
]
于 2013-04-10T18:07:30.230 回答
0

不要使用WHERE带有 . 的子句ON DUPLICATE KEY UPDATE。由WHERE重复键暗示。

于 2013-04-10T17:43:45.120 回答
-1

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

于 2013-04-10T17:34:14.123 回答