2016-07-07 24 views
1

我只是在學習PHP,我認爲學習一些MySQL也是一個好主意。所以我開始研究代碼,並且出於一些奇怪的原因,我一直在獲取非常糟糕的重複用戶。如何使用PHP和MySQL檢查重複的用戶名?

<?php 
$link = mysqli_connect(here i put the data); 
if(!$link) 
{ 
    echo "Error: " . mysqli_connect_errno() . PHP_EOL; 
    exit; 
} 
else 
{ 
    if(isset($_POST['user'])) 
    { echo "User set! "; } 
    else { echo "User not set!"; exit; } 
    if(isset($_POST['pass']) && !empty($_POST['pass'])) 
    { echo "Password set! "; } 
    else { echo "Password not set!"; exit; } 
    $num = mysqli_num_rows(mysqli_query("SELECT * FROM `users` WHERE (username = "."'".$_POST['user']."')")); 
    if($num > 0) 
    { echo "Cannot add duplicate user!"; } 
    mysqli_close($link); 
} 
?> 

出於某種奇怪的原因,我沒有得到我應該get.I've試圖在這裏找到在計算器上的一些解決方案,但他們沒有工作的輸出。

+2

類型缺少第一個參數'$ link'在'mysqli_query' – Saty

+2

^是啊,和SQL注入! –

+0

我不會錯過它。我只是不想與你分享我的MySQL登錄信息。至於SQLi,我會稍後解決:D –

回答

3

connectionObject第一個參數是不是在mysqli_query給出:

$num = mysqli_num_rows(mysqli_query($link, "SELECT * FROM `users` WHERE (`username` = '".$_POST['user']."')")); 
//----------------------------------^^^^^^^ 

而且,你的代碼很容易受到SQL注入。一個簡單的修正是:

$_POST['user'] = mysqli_real_escape_string($link, $_POST['user']); 
+1

感謝傢伙就是這樣:。!d –

+1

當然,我會 –

+0

@ZvonimirRudinski謝謝哥們':)' –

1

mysqli_query必須接收兩個參數才能工作。在這種情況下,您的mysqli_connect

$num = mysqli_num_rows(mysqli_query($link, "SELECT * FROM `users` WHERE (username = "."'".$_POST['user']."')")); 

另外,在此代碼中,您可能受SQL注入的影響。

切勿直接在查詢中添加用戶輸入而不對其進行過濾。

做到這一點,讓您的查詢更具可讀性和安全:

$u_name=mysqli_real_escape_string($link, $_POST['user']); 
$num = mysqli_num_rows(mysqli_query($link, "SELECT * FROM `users` WHERE (username = '$u_name')")); 
+0

沒有。錯誤。 :( –

+0

這是錯的!它應該在'mysqli_query'。 –

+0

嗯,還是錯的!歪! –

1

要使用mysqli_*擴展,你必須包括所有的查詢參數內部的連接。

$query = mysqli_query($link, ...); // notice using the "link" variable before calling the query 
$num = mysqli_num_rows($query); 

或者,你可以做的是你的網站內創建一個query()功能,像這樣:

$link = mysqli_connect(...); 

function query($sql){ 
    return mysqli_query($link, $sql); 
} 

,然後調用它像這樣:

query("SELECT * FROM..."); 
1

這可能是一個競賽狀況問題。

想象一下,兩個用戶想要同時創建相同的用戶名。 兩個進程將執行你的腳本。因此,這兩個腳本都從數據庫中進行選擇,並發現沒有具有所需用戶名的用戶。然後,兩個插入用戶名。

最佳解決方案是在數據庫中的用戶名列創建唯一索引。

ALTER TABLE users ADD unique index username_uix (username); 

然後嘗試插入用戶時,如果失敗的話,你知道用戶名存在...

+1

是的,我會考慮:) –

0

下面介紹如何編寫使用準備好的語句和錯誤檢查你的代碼。

還使用SELECT COUNT(*)...來查找用戶的數量,而不是依靠mysqli_num_rows。這將從數據庫返回更少的數據,並且看起來更乾淨。

<?php 
$link = mysqli_connect(here i put the data); 

if(!$link) { 
    echo "Error: " . mysqli_connect_errno() . PHP_EOL; 
    exit; 
} 
else if(!isset($_POST['user'])) { 
    echo "User not set!"; exit; 
} 

echo "User set! "; 

if(!isset($_POST['pass']) || empty($_POST['pass'])) { 
    echo "Password not set!"; exit; 
} 

echo "Password set! "; 

$query = "SELECT COUNT(username) 
    FROM users 
    WHERE username = ?"; 

if (!($stmt = $mysqli->prepare($query))) { 
    echo "Prepare failed: (" . mysqli_errno($link) . ") " . mysqli_error($link); 
    mysqli_close($link); 
    exit; 
} 

$user = $_POST ['user']; 
$pass = $_POST ['pass']; 

if(!mysqli_stmt_bind_param($stmt, 's', $user)) { 
    echo "Execute failed: (" . mysqli_stmt_errno($stmt) . ") " . mysqli_stmt_error($stmt); 
    mysqli_stmt_close($stmt); 
    mysqli_close($link); 
    exit; 
} 

if (!mysqli_execute($stmt)) { 
    echo "Execute failed: (" . mysqli_stmt_errno($stmt) . ") " . mysqli_stmt_error($stmt); 
    mysqli_stmt_close($stmt); 
    mysqli_close($link); 
    exit; 
} 

$result = mysqli_stmt_get_result($stmt); 
if ($row = mysqli_fetch_array($result, MYSQLI_NUM)) { 
    $num = $row[0]; 
    if($num > 0) { 
    echo "Cannot add duplicate user!"; 
    } 
} 

mysqli_stmt_close($stmt); 
mysqli_close($link); 

請不要建議修復了語法,這是從一個電話

相關問題