2011-12-29 60 views
0

我正在運行以下內容,只是作爲一個測試,看看我是否已得到這部分腳本的正確,我已經在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

回答

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

1

要做到這一點,你可以使用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

0

更好的方式通過對重複

如果該行已經存在,它更新它做這個。

但要小心,INSERT語法必須(例如):

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

對於一些統計信息更新是非常有用的(與VAL3 = VAL3 + 1)