2014-10-04 56 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

相关问题