2011-06-01 57 views
2

我用:MySQL的:插入如果此IP不要有任何記錄

INSERT INTO `rating` (`name`, `user`, `rating`, `section`, `ip`) 
VALUES ('$name', '{$_SESSION['user']}', '$rate', '$section', 
     '{$_SERVER['REMOTE_ADDR']}');"; 

我想在IF語句,以便添加一個if條件。

IF SELECT ip from rating 
where ip={$_SERVER['REMOTE_ADDR']} AND section=$section AND name=$name 
then update ELSE INSERT new row 

它是可行的,或者我更好的代碼在PHP? 非常感謝你

P.s:我知道怎麼用ph​​p做,我想用MySQL學習它。

此外,我要求所有的3名,部分IP配襯不僅IP

+1

檢出替換爲... – 2011-06-01 21:13:43

+0

您可以編寫存儲過程來完成這項工作。 – 2011-06-01 21:14:28

+0

@Chris - 替換也會起作用,儘管從技術上講,它既可以執行插入操作,也可以執行刪除操作,而不是插入操作或更新操作。在他的情況下,它可能並不重要,但如果你有觸發器或具有默認值的列,它可以產生很大的差異。 – 2011-06-01 21:22:40

回答

3

擴大埃裏克的優秀答案。

要在每一列IP的添加唯一約束,名稱,部分在數據庫上運行下面的代碼

ALTER TABLE `test`.`rating` 
    ADD UNIQUE INDEX `name`(`name`), 
    ADD UNIQUE INDEX `section`(`section`), 
    ADD UNIQUE INDEX `ip`(`ip`); 

要運行列的組合IP +姓名+部分做了獨特的約束:

ALTER TABLE `test`.`rating` 
    ADD UNIQUE INDEX `name_section_ip`(`name`, `section`, `ip`); 

最後一件事可能是你想要的。

最後一件事
我不是100%肯定,但在查詢這種用法的{$_SERVER['REMOTE_ADDR']}不看SQL注入安全。
考慮將其更改爲:

$remote_adr = mysql_real_escape_string($_SERVER['REMOTE_ADDR']); 
$session = mysql_real_escape_string($_SESSION['user']); 
$query = "INSERT INTO `rating` (`name`, `user`, `rating`, `section`, `ip`) 
    VALUES ('$name', '$session', '$rate', '$section','$remote_adr')"; 

最後把一個 「;」在mysql_query()像這樣mysql_query("select * from x;");不起作用mysql_query()將只會執行一個查詢,並會拒絕您的;

6

假設你有一個獨特的約束上的IP,段和名稱(UNIQUE指數或PRIMARY KEY),你可以使用這個語法:

INSERT INTO `rating` (`name`, `user`, `rating`, `section`, `ip`) 
VALUES ('$name', '{$_SESSION['user']}', '$rate', '$section', '{$_SERVER['REMOTE_ADDR']}') 
ON DUPLICATE KEY UPDATE user = VALUES(user), rating = VALUES(rating); 
+0

您應該添加額外的信息,該字段應該是'UNIQUE'索引或'PRIMARY KEY'。 – RRStoyanov 2011-06-01 21:29:11

+0

我沒有看到第一次不透明的澄清,這就是爲什麼我添加我的評論。你有我的投票和小額外的解決方案,我寧願使用:) – RRStoyanov 2011-06-01 21:35:32

+0

@RRStoyanov - 明白了,更新我的答案,因爲你建議澄清。 – 2011-06-01 21:37:13