2014-10-04 57 views
0

org我試圖讓這個查詢正確。我想在表單提交時將記錄插入數據庫,但只有在記錄不存在的情況下。如果記錄存在,那麼我希望它在數據庫中更新。我如何更新一個行,如果它存在,或者如果它不存在在mysql中創建一個新的行

正在發生的事情:在表單提交,一個新的記錄每一次插入到數據庫中。即使它是重複的。

更新:我添加了一個所謂的「U_ID」,這適用於在數據庫中的每個聯繫人的唯一信息列。所以,我做了這個我的唯一密鑰列。

if($_POST['submit']){ 
     $con=mysqli_connect("localhost","username","password","database_name"); 
     // Check connection 
    if (mysqli_connect_errno()) 
    { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    $contact = ($_POST['contact']); 
    $u = ($_POST['uid']); 
    $org = mysql_real_escape_string($_POST['organization']); 
    $namefirst = mysql_real_escape_string($_POST['firstName']); 
    $namelast = mysql_real_escape_string($_POST['lastName']); 
    $emailaddy = mysql_real_escape_string($_POST['email']); 
    $phonenum = mysql_real_escape_string($_POST['phone']); 
    $appquestion = mysql_real_escape_string($_POST['appquestion']); 
    $banner = mysql_real_escape_string($_POST['banner']); 
    $bulletin = mysql_real_escape_string($_POST['bulletin']); 
    $giveaway = mysql_real_escape_string($_POST['giveaway']); 
    $app = mysql_real_escape_string($_POST['app']); 
    $tshirt = mysql_real_escape_string($_POST['tshirt']); 
    $tshirtp = mysql_real_escape_string($_POST['tshirtp']); 
    $print = mysql_real_escape_string($_POST['print']); 
    $party = mysql_real_escape_string($_POST['party']); 
    $orgnotes = mysql_real_escape_string($_POST['notes']); 


    $sql="INSERT INTO database_name (contact_id, u_id, first_name, last_name, email_address, phone_number, org, appquestion, banner, bulletin, giveaway, app, tshirt, promised_tee, print, party, org_notes) 
     VALUES 
      ('$contact', '$u', '$namefirst','$namelast','$emailaddy','$phonenum','$org','$appquestion','$banner','$bulletin','$giveaway','$app','$tshirt','$tshirtp','$print','$party','$orgnotes') 

     ON DUPLICATE KEY UPDATE first_name = '$namefirst', last_name = '$namelast', email_address = '$emailaddy', phone_number = '$phonenum', org = '$org', appquestion = '$appquestion', banner = '$banner', bulletin = '$bulletin', giveaway = '$giveaway', app = '$app', tshirt = '$tshirt', promised_tee = '$tshirtp', print = '$print', party = '$party', org_notes = '$orgnotes'" ; 



    if (!mysqli_query($con,$sql)) 
    { 
     die('Error: ' . mysqli_error($con)); 
    } 
     echo "1 record added"; 



    mysqli_close($con); 
    } 

一切從我讀,我需要使用對重複密鑰更新,以取代與在表單提交數據庫中的新信息的舊信息。當我的代碼的插入部分正在工作時,具有ON DUPLICATE KEY UPDATE的部分不起作用。

爲什麼這部分代碼不能正常工作?有沒有更好的方法來插入其他更新信息?

我也試過REPLACE INTO(而不是INSERT和ON DUPLICATE KEY UPDATE),它也沒有工作。 這裏是我的專欄結構在我的MySQL數據庫:

+-------------+-------------+------+-----+-----------+-------------------+ 
Field   | Type  | Null | Key | Default | Extra 
+-------------+-------------+------+-----+-----------+-------------------+ 
contact_id | int(1)  | NO | PRI | NULL  | auto_increment 
u_id   | char(32) | NO | UNI | NULL  | 
title   | varchar(80) | NO |  | NULL  | 
first_name | varchar(100)| NO |  | NULL  | 
last_name  | varchar(100)| NO |  | NULL  | 
job_title  | varchar(255)| NO |  | NULL  | 
address_1  | varchar(255)| NO |  | NULL  | 
address_2  | varchar(255)| NO |  | NULL  | 
org_city  | varchar(100)| NO |  | NULL  | 
org_state  | varchar(100)| NO |  | NULL  | 
zip_code  | varchar(8) | NO |  | NULL  | 
country  | varchar(100)| NO |  | NULL  | 
phone_number | varchar(15) | NO |  | NULL  | 
email_address | varchar(100)| NO |  | NULL  | 
org   | varchar(150)| NO |  | NULL  | 
appquestion | tinyint(1) | NO |  | NULL  | 
banner  | tinyint(1) | NO |  | NULL  | 
bulletin  | tinyint(1) | NO |  | NULL  | 
giveaway  | tinyint(1) | NO |  | NULL  | 
app   | tinyint(1) | NO |  | NULL  | 
tshirt  | tinyint(1) | NO |  | NULL  | 
promised_tee | tinyint(1) | NO |  | NULL  | 
print   | tinyint(1) | NO |  | NULL  | 
party   | tinyint(1) | NO |  | NULL  | 
org_notes  | varchar(255)| NO |  | NULL  | 
notes   | varchar(255)| NO |  | NULL  | 
+-------------+-------------+------+-----+-----------+-------------------+ 

謝謝你的任何幫助或指導,你可以給我!我是PHP和MySQL的新手。我一直在研究這個概念三天,並閱讀了大量有關它的信息,但我仍然無法使其工作。

+0

你能仔細檢查,如果CONTACT_ID確實設置主鍵,因此唯一的。有兩條contact_id ='的記錄不應該有這些限制。 – Barry 2014-10-04 15:23:50

+0

嗨巴里!感謝您的答覆。我進行了雙重檢查,並且contact_id確實設置爲主鍵,也是唯一的。 – MissScarlett 2014-10-04 15:39:05

+0

Kartik是否將column_id定義爲AUTO INCREMENT?並且聯繫人都添加了不同的contact_id? – Barry 2014-10-04 15:40:44

回答

1

我猜聯繫人ID是你的鑰匙,它是一個自動遞增的身份值? 在這種情況下,試試這個插入語句。

INSERT INTO database_name (first_name, last_name, email_address, phone_number, org, appquestion, banner, bulletin, giveaway, app, tshirt, promised_tee, print, party, org_notes) VALUES ('$namefirst','$namelast','$emailaddy','$phonenum','$org','$appquestion','$banner','$bulletin','$giveaway','$app','$tshirt','$tshirtp','$print','$party','$orgnotes')
ON DUPLICATE KEY UPDATE first_name = '$namefirst', last_name = '$namelast', email_address = '$emailaddy', phone_number = '$phonenum', org = '$org', appquestion = '$appquestion', banner = '$banner', bulletin = '$bulletin', giveaway = '$giveaway', app = '$app', tshirt = '$tshirt', promised_tee = '$tshirtp', print = '$print', party = '$party', org_notes = '$orgnotes'" ;

+0

你可以請更新表結構?與KEYS – Kartik 2014-10-04 15:27:19

+0

稍有混淆我認爲這將永遠不會激發ON DUPLICATE部分,因爲該鍵不包含在插入語句中,導致ON DUPLICATE部分冗餘。 – Barry 2014-10-04 15:31:26

+0

請參閱第一個答案,還有其他一些選項。 http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update – Kartik 2014-10-04 15:35:52

相關問題