2013-01-04 39 views
0

有沒有一種方法可以檢查我的PHP文件,該文件在使用時將用戶添加到我的數據庫中。 I.E.停止添加多行相同信息的SQL

John使用我的程序,當他收到錯誤並將它發送到我的數據庫時,它抓取他的信息,它有他的名字,電子郵件和計算機操作系統。

現在這就是我想要的,但是如果約翰再次啓動程序,它會將該行的另一個重複副本發送到我的數據庫,這是無用的,並堵塞它充滿無用的信息。

代碼目前正在使用:

$connect = mysql_connect('host','user','pass') or die("Error"); 
mysql_select_db('DB') or die("Error"); 
$Name = $_GET['name']; 
$Email = $_GET['email']; 
$OS  = $_GET['os']; 
$add  ="INSERT INTO UserDB(Name, Email, OS,) VALUES ('$Name', '$Email', '$OS')"; 
mysql_query($add,$connect); 
mysql_close($connect); 
+3

除了你添加的任何PHP邏輯(比如修復變量轉義的完全缺席 - 「對不起Bobby O'Mally - 你只需要改變你的名字」) - 只需添加一個唯一的索引即可表UserDB使得重複是不可能的。 – AD7six

+0

林不知道你的意思或如何做到這一點,即時通訊對於MySQL來說很新,而且幾乎沒有經驗。 – Cacoon

+1

請確實瞭解[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)或[這將發生在您身上](http://xkcd.com/327/) –

回答

0

沒有創造額外的邏輯衆多,您可以創建數據庫的唯一密鑰關聯。由於電子郵件地址是唯一的,你可以這樣來做:

運行該SQL

這增加了獨特的密鑰和禁止對電子郵件地址的多重插入。

ALTER TABLE `UserDB` ADD UNIQUE(`Email`); 

改變你的PHP代碼查詢

使用此查詢來更新,如果沒有插入製成。

if(mysql_insert_id() < 1) { 
    $add = sprintf(
      "UPDATE `UserDB` SET `Name`='%s', `Email`='%s', `OS`='%s' WHERE `Email`='%s'", 
      $Name, 
      $Email, 
      $OS, 
      $Email 
    ); 
} 

請切換到庫MySQLi或PDO,你對SQL注入很容易!

+0

感謝您的幫助。 – Cacoon

+0

這個答案很有用,但掩蓋了數據庫設計的重要方面。如果電子郵件地址在此表中是唯一的,那麼'email'是主鍵的主要候選者,而不是普通的唯一約束。此外,如果意圖是更新現有的行重複,而不是忽略新的重複行,比[upsert](http://stackoverflow.com/questions/1218905/how-do-i-update-if-exists- insert-if-not-aka-upsert-or-merge-in-mysql)是一個更好的解決方案。 –

+0

@PhilFrost你說的是真的。 :-) – phpisuber01

4

你想在你的數據庫中的unique constraint或適當primary key。然後,當你的代碼試圖插入一個重複的行時,數據庫會引發一個錯誤,你可以處理它。如果您想用新行替換舊行,您可能需要upsert

這是a good article on selecting a primary key

+0

我同意。 @ user1948659應該只是在數據庫中保留這種工作,否則你將不得不執行一個查詢來檢查記錄是否已經存在,然後再查詢第二個查詢是否插入它。獨特的鑰匙是你的朋友。 – EmmanuelG

-1

您永遠無法確切地拷貝數據庫中的一行。必須始終有一個唯一的ID。這通常是每個新行自動遞增的數字。 如果您的表格中出現這種情況,則只需詢問數據庫,看當前用戶是新的還是現有的用戶。 喜歡的東西:

$query = "SELECT id FROM UserDB WHERE Name='$name' AND Email = '$email'"; 
$result = mysql_query($query); 
if(mysql_num_rows($result) == 0) 
//Add user 
else 
//Update user? Or something else 
+0

你絕對可以有重複的行。沒有什麼東西需要一張表才能擁有主鍵。添加一個'auto_increment'列有一個主鍵並不總是一個好主意。 [這篇文章是一個很好的閱讀](http://www.agiledata.org/essays/keys.html)。 –

+0

這應該使用數據庫自​​己的方法完成,如唯一鍵。 –