【问题标题】:Mysql error on update recordMysql更新记录报错
【发布时间】:2011-12-29 13:33:52
【问题描述】:

我正在运行以下命令,以测试我是否正确地编写了这部分脚本,我已经在 mysql 数据库中有如下记录: 如果在我的表单中,我将上述信息放入每个表单字段并点击提交,应该会发生什么是它选择等于发布的leadname和emailformname的记录,并使用新日期更新具有相同leadname和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 服务器版本相对应的手册,以在第 1 行的 'IF EXISTS(SELECT * FROM hqfjt_email_history WHERE leadname='Brian Cox' AND email' 附近使用正确的语法

顺便说一句,由于各种原因我不能使用无重复键索引方法来更新记录,因此我需要通过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());
?>

【问题讨论】:

  • 我认为您应该考虑在将帖子值转储到查询中之前对其进行清理。这将防止注射。

标签: mysql if-statement record exists


【解决方案1】:

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

【讨论】:

  • 您好,谢谢您,我这样做是因为如果它不存在,我希望它创建它,所以我不确定是否最好使用替换?
  • 我已经在末尾添加了插入(在编辑的顶部),我是否也需要清理最后一部分,我不确定你如何清理这样的一串值,是吗和你做的方式一样吗?谢谢:-)。
  • 好的,在末尾加上 INSERT 后进行检查更有意义。 :) 是的,消毒就像我做的那样,将mysql_real_escape_string() 包裹在您的参数周围。
【解决方案2】:

为此,您可以使用 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]'

【讨论】:

  • 解析错误:语法错误,C:\server2go\server2go\htdocs\chandlers\administrator\components\com_chronoforms\form_actions\custom_code\custom_code.php(18) 中的意外 T_STRING:eval()'d第 2 行代码
【解决方案3】:

使用 ON DUPLICATE 的更好方法

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

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

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

对于一些统计信息更新非常有用(val3=val3+1)

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2012-05-10
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多