更新记录上的Mysql错误

时间:2011-12-29 13:33:52

标签: mysql if-statement record exists

我正在运行以下测试,以确定我是否已将脚本的这一部分更正确,我已经在mysql数据库中有如下记录: 如果在我的表单中我将上述信息放入每个表单字段并点击提交,那么应该选择与发布的引导名和emailformname相等的记录,并更新具有相同引导名和emailformname的记录,其中包含新的日期。表格中的[datesent]字段。

所以我运行以下内容:

<?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'和电子邮件'在第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());
?>

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

为此,您可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...

使用这种结构,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]'

答案 2 :(得分:0)

使用ON DUPLICATE

更好的方法

如果该行已存在,则会更新它。

但要小心,INSERT语法必须是(例如):

INSERT INTO table (val1,val2) 
VALUE ('123','abc')
ON DUPLICATE KEY UPDATE
val3='new'

对于某些统计信息更新,它非常有用(使用val3 = val3 + 1)