我正在运行以下测试,以确定我是否已将脚本的这一部分更正确,我已经在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());
?>
答案 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)