我正在运行下面的测试,看看我的脚本的这一部分是否正确,我已经在mysql数据库中有一个如下所示的记录:如果在我的表单中,我将上述信息放入每个表单域并点击提交,会发生什么情况是选择与发布的leadname和emailformname相等的记录,并从表单中的datesent字段中用新的日期更新具有相同leadname和emailformname的记录。
因此,我运行以下命令:
<?php
$query = mysql_query("IF EXISTS(SELECT * FROM hqfjt_email_history WHERE leadname='$_POST[leadname]' AND emailformname='$_POST[emailformname]')
THEN UPDATE hqfjt_email_history (datesent) VALUES ('$_POST[datesent]') WHERE emailformname='$_POST[emailformname]' AND leadname='$_POST[leadname]'
") or die(mysql_error());
?>但我没有更新该字段,而是得到了错误:
您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解要在'IF EXISTS‘附近使用的正确语法(SELECT* FROM hqfjt_email_history WHERE leadname='Brian Cox’和email‘第1行
顺便说一下,由于各种原因,我不能使用无重复键索引方法来更新记录,因此我需要通过两个字段leadname和emailformname来标识记录。
除了我糟糕的编码(可能是问题)之外,我看不出上面的查询失败的原因,因为在数据库中只有一条记录的这两个字段= true。
感谢大家的帮助,如果我想插入空记录,这是正确的吗?我不确定如何清理我在最后添加的部分?
<?php
$sql = "IF EXISTS (
SELECT * FROM hqfjt_email_history
WHERE leadname= '" . mysql_real_escape_string($_POST['leadname']) . "'
AND emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
)
THEN
UPDATE hqfjt_email_history
SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
AND leadname = '" . mysql_real_escape_string($_POST['leadname']) . "'
ELSE
INSERT INTO hqfjt_email_history
(id, leadname, emailformname, datesent) VALUES ('$_POST[id]','$_POST[leadname]','$_POST[emailformname]','$_POST[datesent]')";
$query = mysql_query($sql) or die(mysql_error());
?>发布于 2011-12-29 21:41:08
您的UPDATE语句错误。它应该写成:
UPDATE <table>
SET <columnname> = <value>
WHERE <condition>所以..。
$sql= "UPDATE hqfjt_email_history
SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
AND leadname = '" . mysql_real_escape_string($_POST['leadname'] . "'"请注意,我在变量周围添加了一个mysql_real_escape_string()函数,以避免注入和撇号问题。
所以最终你的PHP应该是:
$sql = "IF EXISTS (
SELECT * FROM hqfjt_email_history
WHERE leadname= '" . mysql_real_escape_string($_POST['leadname']) . "'
AND emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
)
THEN
UPDATE hqfjt_email_history
SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
AND leadname = '" . mysql_real_escape_string($_POST['leadname']) . "'";
$query = mysql_query($sql) or die(mysql_error());然而,我不明白为什么要将IF EXISTS ( ... )添加到查询中。因为基本上你只是检查记录是否存在,如果存在则更新它。但是如果你在一个不存在的记录上做一个更新,它将不会更新任何东西...所以它不会对写入造成任何损害
$sql = "UPDATE hqfjt_email_history
SET datesent = '" . mysql_real_escape_string($_POST['datesent']) . "'
WHERE emailformname = '" . mysql_real_escape_string($_POST['emailformname']) . "'
AND leadname = '" . mysql_real_escape_string($_POST['leadname']) . "'";发布于 2011-12-30 00:43:53
为此,可以使用INSERT INTO ...更新重复密钥时...
通过这种结构,MySQL将尝试插入记录,如果出现重复键错误,MySQL将尝试使用该键更新记录。
确保您的(唯一/主要)键设置正确。
INSERT INTO
hqfjt_email_history
SET
leadname='$_POST[leadname]',
emailformname='$_POST[emailformname]',
datesent='$_POST[datesent]'
ON DUPLICATE KEY UPDATE
leadname='$_POST[leadname]',
emailformname='$_POST[emailformname]',
datesent='$_POST[datesent]'发布于 2012-11-16 03:18:46
要做到这一点,更好的方法是使用ON DUPLICATE
如果行已经存在,它会更新它。
但是要小心,INSERT语法必须是(例如):
INSERT INTO table (val1,val2)
VALUE ('123','abc')
ON DUPLICATE KEY UPDATE
val3='new'对于某些统计数据更新,它非常有用(使用val3=val3+1)
https://stackoverflow.com/questions/8668509
复制相似问题