我有一个名为reports
的表单和数据库表。我有一个date
字段(主键)和一个名为changes
的textarea来说明该日期的更改内容。如果日期相同,我希望能够覆盖该日期“更改”列中的信息。
我自己的插入命令如下:
mysql_query("
INSERT INTO reports (thedate,changes)
VALUES ('$_POST[thedate]','$_POST[changes]')
");
我理解我需要在ON DUPLICATE KEY UPDATE
之后使用INSERT
,但经过多次尝试后我无法正确行事。事情不仅没有更新,而且似乎打破了我的插入命令,所以即使没有新的行添加到数据库中。
如果这是一个重复的问题,请道歉。经过大量的搜索和大量的尝试,我无法让它发挥作用。
答案 0 :(得分:3)
看看REPLACE
。
REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中 table与PRIMARY KEY或UNIQUE的新行具有相同的值 index,在插入新行之前删除旧行。
请注意,如果您的外键带有操作ON DELETE
,则在使用REPLACE
时会触发该操作,因为它执行删除后跟插入< / em>。
使用ON DUPLICATE KEY
可能如下所示:
INSERT reports (thedate, changes) VALUES ('$_POST[thedate]', '$_POST[changes]')
ON DUPLICATE KEY UPDATE changes = '$_POST[changes]'
答案 1 :(得分:2)
这是纯SQL查询:
INSERT INTO reports (thedate, changes)
VALUES ('2011-11-10', 'Lorem ipsum')
ON DUPLICATE KEY UPDATE changes=VALUES(changes)
http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html
现在,您绝对需要坐下来尝试了解SQL是什么以及它如何与PHP交互并与之不同。您正在使用PHP来编写恰好是来自另一种称为SQL的语言的代码的字符串。你这样做的方式,生成的代码可以是有效的SQL,也不依赖于任何匿名访问者发送的任意数据。在最好的情况下,您的脚本将崩溃。在更糟糕的情况下,访问者将能够读取机密数据或更改您的数据库。以下是mysql_query()手册页中的示例:
// This could be supplied by a user, for example
$firstname = 'fred';
$lastname = 'fox';
// Formulate Query
// This is the best way to perform an SQL query
// For more examples, see mysql_real_escape_string()
$query = sprintf("SELECT firstname, lastname, address, age FROM friends
WHERE firstname='%s' AND lastname='%s'",
mysql_real_escape_string($firstname),
mysql_real_escape_string($lastname));
// Perform Query
$result = mysql_query($query);
答案 2 :(得分:1)
这应该有效:
mysql_query("INSERT INTO reports (thedate,changes) VALUES ('$_POST[thedate]','$_POST[changes]') ON DUPLICATE KEY UPDATE changes=VALUES(changes)");
使用REPLACE
的缺点是它不是标准SQL而是MySQL扩展。除此之外,当使用自动递增列时,REPLACE
将重新插入不同的值。我不会向任何人推荐它。
编辑:ON DUPLICATE KEY
也不是标准SQL。遗憾!