2013-03-13 114 views
65

我想要做的是INSERT我的数据库中的用户,但IF EXISTS它应该UPDATE行,ELSE INSERT INTO一个新的行。SQL - 如果存在更新ELSE INSERT INTO

当然我首先连接到数据库,GET$name,$email$birthday从url字符串。

$con=mysqli_connect("localhost","---","---","---"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$name=$_GET['name']; 
$email=$_GET['email']; 
$birthday=$_GET['birthday']; 

这个工作,但只是增加了新的行;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday) 
VALUES ('$name', '$email', '$birthday')"); 

mysqli_close($con); 

这是我试过的;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday) 
VALUES '$name', '$email', '$birthday' 
ON DUPLICATE KEY UPDATE subs_name = VALUES($name), subs_birthday = VALUES($birthday)"); 
mysqli_close($con); 

mysqli_query($con,"IF EXISTS (SELECT * FROM subs WHERE subs_email='$email') 
    UPDATE subs SET subs_name='$name', subs_birthday='$birthday' WHERE subs_email='$email' 
ELSE 
    INSERT INTO subs (subs_name, subs_email, subs_birthday) VALUES ('$name', '$email', '$birthday')"); 
mysqli_close($con); 

mysqli_query($con,"IF NOT EXISTS(SELECT * FROM subs WHERE subs_email='$email') 
Begin 
INSERT INTO subs (subs_name, subs_email, subs_birthday) 
VALUES ('$name', '$email', '$birthday') 
End"); 
mysqli_close($con); 

但他们没有工作,我究竟做错了什么?

任何帮助,非常感谢!

+2

你对桌子有独特的限制吗? – 2013-03-13 11:22:44

+1

[Insert into MySQL table or update if exists](http://stackoverflow.com/questions/4205181/insert-into-a-mysql-table-or-update-if-exists) – 2016-06-07 14:41:01

回答

167
  1. subs_email列创建UNIQUE constraint,如果一个尚不存在:

    ALTER TABLE subs ADD UNIQUE (subs_email) 
    
  2. 使用INSERT ... ON DUPLICATE KEY UPDATE

    INSERT INTO subs 
        (subs_name, subs_email, subs_birthday) 
    VALUES 
        (?, ?, ?) 
    ON DUPLICATE KEY UPDATE 
        subs_name  = VALUES(subs_name), 
        subs_birthday = VALUES(subs_birthday) 
    

您可以使用VALUES (col_name)函数中UPDATE子句 指列值从插入的插入部... ON DUPLICATE密钥更新 - dev.mysql.com

  • 注意,我在地方使用参数占位符字符串文字,作为一个真的应该使用参数化语句defend against SQL injection attacks
  • +0

    You da man !像魅力一样工作,现在可以找到防止注射的方法。在人们确认订阅新闻简报后,我将数据发送到数据库,并在参数中显示参数。任何想法如何确保这一点? Thnx – 2013-03-13 13:06:51

    +0

    @freakstyler:看到我的第三点,特别是它所链接的答案。 – eggyal 2013-03-13 13:10:07

    +0

    这是这个cewl!我现在一直在使用MySQL,并且从未使用过它! – 2014-12-20 15:55:47