首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新记录时出现Mysql错误

问更新记录时出现Mysql错误
EN

Stack Overflow用户
提问于 2011-12-29 21:33:52
回答 3查看 183关注 0票数 0

我正在运行下面的测试,看看我的脚本的这一部分是否正确,我已经在mysql数据库中有一个如下所示的记录:如果在我的表单中,我将上述信息放入每个表单域并点击提交,会发生什么情况是选择与发布的leadname和emailformname相等的记录,并从表单中的datesent字段中用新的日期更新具有相同leadname和emailformname的记录。

因此,我运行以下命令:

代码语言:javascript
复制
<?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。

代码语言:javascript
复制

感谢大家的帮助,如果我想插入空记录,这是正确的吗?我不确定如何清理我在最后添加的部分?

代码语言:javascript
复制
 <?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());
?>
EN

回答 3

Stack Overflow用户

发布于 2011-12-29 21:41:08

您的UPDATE语句错误。它应该写成:

代码语言:javascript
复制
UPDATE <table>
SET <columnname> = <value>
WHERE <condition>

所以..。

代码语言:javascript
复制
$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应该是:

代码语言:javascript
复制
$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 ( ... )添加到查询中。因为基本上你只是检查记录是否存在,如果存在则更新它。但是如果你在一个不存在的记录上做一个更新,它将不会更新任何东西...所以它不会对写入造成任何损害

代码语言:javascript
复制
$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']) . "'";
票数 2
EN

Stack Overflow用户

发布于 2011-12-30 00:43:53

为此,可以使用INSERT INTO ...更新重复密钥时...

通过这种结构,MySQL将尝试插入记录,如果出现重复键错误,MySQL将尝试使用该键更新记录。

确保您的(唯一/主要)键设置正确。

代码语言:javascript
复制
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]'
票数 1
EN

Stack Overflow用户

发布于 2012-11-16 03:18:46

要做到这一点,更好的方法是使用ON DUPLICATE

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

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

代码语言:javascript
复制
INSERT INTO table (val1,val2) 
VALUE ('123','abc')
ON DUPLICATE KEY UPDATE
val3='new'

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8668509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档