更新记录上的Mysql错误
我正在运行以下内容,只是作为一个测试,看看我是否已得到这部分脚本的正确,我已经在mysql数据库中有如下记录: 如果以我的形式I将上面的信息放到每个表单域中并点击提交,会发生什么情况是选择等于发布的引用名和emailformname的记录,并使用[datesent]字段中的新日期更新具有相同引用名和emailformname的记录在形式中。更新记录上的Mysql错误
于是我运行以下命令:
<?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语法错误;顺便说一下,我不能使用no()函数来检查与你的MySQL服务器版本相对应的手册,以便在'IF EXISTS(SELECT * FROM hqfjt_email_history WHERE leadname ='Brian Cox'AND email'at line 1'重复的键索引方法更新记录的各种原因,因此,为什么我需要通过两个字段leadname和emailformname确定记录。
我不能看到上述查询失败的原因,除了我的错误编码(可能问题),因为DB中只有一条记录,并且这两个字段= 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());
?>
您的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-29 17:22:22
我已经在最后添加了插入(在编辑顶部),我是否需要清理最后一部分,我不知道如何清理这样一个值的字符串,是否与您拥有的方式相同完成了 ?谢谢 :-) 。 – 2011-12-29 17:33:36
好的,INSERT结束后,检查更有意义。 :)是的消毒就像我一样,将'mysql_real_escape_string()'包裹在你的参数中。 – Jules 2011-12-29 19:25:35
要做到这一点,你可以使用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]'
嗨,使用我得到以下g错误 – 2011-12-29 17:56:31
解析错误:语法错误,意外的T_STRING在C:\ server2go \ server2go \ htdocs \ chandlers \管理员\组件\ com_chronoforms \ form_actions \ custom_code \ custom_code.php(18):eval )第2行的d代码 – 2011-12-29 17:56:36
更好的方式通过对重复
如果该行已经存在,它更新它做这个。
但要小心,INSERT语法必须(例如):
INSERT INTO table (val1,val2)
VALUE ('123','abc')
ON DUPLICATE KEY UPDATE
val3='new'
对于一些统计信息更新是非常有用的(与VAL3 = VAL3 + 1)
我想你应该考虑消毒您的文章将它们转储到查询中之前的值。这将防止注射。 – 2011-12-29 13:39:55