更新记录上的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()); 
?> 
+1

我想你应该考虑消毒您的文章将它们转储到查询中之前的值。这将防止注射。 – 2011-12-29 13:39:55

您的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']) . "'"; 
+0

你好,谢谢你,我做如果存在,因为如果它不存在,我希望它创建它,所以即时通讯不知道它是否最好使用替代? – 2011-12-29 17:22:22

+0

我已经在最后添加了插入(在编辑顶部),我是否需要清理最后一部分,我不知道如何清理这样一个值的字符串,是否与您拥有的方式相同完成了 ?谢谢 :-) 。 – 2011-12-29 17:33:36

+0

好的,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]' 
+0

嗨,使用我得到以下g错误 – 2011-12-29 17:56:31

+0

解析错误:语法错误,意外的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)