2015-01-14 127 views
2

我正在一個數據庫系統上工作,我試圖避免電子郵件和用戶名的重複條目。我已經嘗試過,但仍然拒絕,但無法確切地看到什麼被拒絕。 有人可以解釋我錯在哪裏嗎?防止重複enteries sql php

if(isset($_POST['submit'])){ 
$username = $_POST['username']; 
$password = $_POST['password']; 
$email = $_POST['email']; 

$sql="INSERT into users (username,password,email) VALUES('$username','$password','$email')"; 

$result = mysql_query("INSERT INTO users VALUES ('duplicate')"); 

if (!$result) { 
echo "Enter a different value"; 
} else { 
echo "Save successful."; 

} 
} 
+3

設置UNIQUE約束或使用'mysql_num_rows()'或'COUNT()'。另外,不要以純文本存儲密碼;危險。 –

+0

首先使用select來檢查用戶名!然後嘗試插入它! –

+0

唯一約束是唯一可接受的約束。 numrows/count是外生的,可能/會導致問題。 –

回答

5

我只是制定這個答案爲了向你展示檢查重複和插入的基礎知識。

您應該最終在給定列上設置UNIQUE約束,並根據錯誤結果使用條件語句。

請查閱我的腳註以下關於安全。

旁註#1:如果您不想檢查電子郵件和用戶名是否存在,您可以刪除OR Username= '".$username."'

旁註#2: - 我不確定您的列名是不是混合大小寫,因此您可能需要做一些調整。

  • 電子郵件或電子郵件 - 密碼或密碼 - 用戶名或用戶名

旁註#2: - 確保所有元素中保存的name屬性和形式確實使用POST方法。

先查詢,然後如果用戶/電子郵件不存在,請執行INSERT。

假設您已經建立了DB connection :(請參考腳註下的其他註釋,「建立數據庫連接」)。

if(isset($_POST['submit'])){ 

    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $email = $_POST['email']; 

$query = "SELECT * FROM users 
      where email='".$email."' 
      OR Username= '".$username."'"; 

$result = mysql_query($query); 

    if(mysql_num_rows($result) > 0){ 
    echo "A record already exists."; 
    exit; 
    } 

else{ 
$insert = mysql_query("INSERT into users (email, Username, Password) 
         VALUES ('".$email."','".$username."', '".$password."')"); 
} 

if($insert){ 
    echo "Success"; 
    } 

else{ 
    echo "There was an error " . mysql_error(); 
    } 

mysql_close(); 

} // brace for if(isset($_POST['submit'])) 

您還可以

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 
$email = mysql_real_escape_string($_POST['email']); 

更換

$username = $_POST['username']; 
$password = $_POST['password']; 
$email = $_POST['email']; 

一些附加的安全,直到你開始使用預處理語句。


腳註:

關於安全。

不要使用舊的mysql_ API,也不應該以純文本形式存儲密碼。使用mysqli with prepared statementsPDO with prepared statements

對於密碼存儲,請使用CRYPT_BLOWFISH或PHP 5.5的password_hash()函數。對於PHP < 5.5使用password_hash() compatibility pack


將錯誤報告添加到您的文件頂部將有助於查找錯誤。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// rest of your code 

旁註:錯誤報告只應在分期完成,並且從不生產。


建立一個數據庫連接:

即從mysql_select_db()手冊:

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
if (!$link) { 
    die('Not connected : ' . mysql_error()); 
} 

// make foo the current db 
$db_selected = mysql_select_db('foo', $link); 
if (!$db_selected) { 
    die ('Can\'t use foo : ' . mysql_error()); 
} 
+0

我不斷收到此錯誤。出現錯誤您的SQL語法有錯誤;檢查對應於你的MySQL服務器版本的手冊,在第2行附近使用正確的語法。 – zahid

+0

@zahid我有這種想法。我之前注意到了錯誤,您可能沒有注意到我所做的修改;我在INSERT中忘記了關閉'''括號。重新加載答案並重新複製。 –

+0

哦,是的「)」我認爲它看起來有點奇怪。感謝它添加用戶,但「電子郵件」沒有顯示在數據庫中。它是空白的 – zahid

0

嗨檢查你的mysql表定義如果電子郵件和用戶名列有UNIQUE KEY設置。沒有這個標誌表仍然接受所有的電子郵件和用戶名。

也嘗試獲取信息,如果發生了什麼不好的事情。

if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 
0

只設置電子郵件和用戶名UNIQUE 你的表列的結構,那麼一切都會好起來。 如果你試圖插入重複數據 不會插入並請求mysql_query將返回false

0

創建表時...

CREATE TABLE table_name (
    column_name data_type(size) constraint_name 
) 

...你可以使用UNIQUE約束,像這樣:

CREATE TABLE table_name (
    column_name data_type(size) UNIQUE 
) 

這種約束是不區分大小寫的,這意味着 'USERNAME' 和 '用戶名' 是c-意見一致。

點擊here瞭解更多關於這個限制的信息。