2013-11-20 61 views
0

檢查接受的答案,如果你有一個simular問題。mysqli的註冊腳本,檢查用戶或電子郵件exsist

首先,我知道有這樣他們幾個simular問題,但非哪裏能幫助我。

我想檢查用戶名或電子郵件已經在數據庫中,我已經將它們設置爲數據庫中的唯一的,但希望這個,所以我可以顯示用戶名/電子郵件單獨的錯誤。

眼下試圖註冊,我已經花了幾個小時試圖通過自己弄明白的時候,它只是輸出一個白色的頁面..任何幫助,將不勝感激。

我周圍添加問題代碼我不能去工作的意見。

這是我的代碼:

<?php 
// Include database connection and functions here. 
include 'db_connect.php'; 
include 'functions.php'; 

// The hashed password from the form 
$password = $_POST['p']; 
// Create a random salt 
$random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true)); 
// Create salted password (Careful with the chilli) 
$username = $_POST['username']; 
$email = $_POST['email']; 



//Start of problematic code 

$check_stmt = $mysqli->prepare("SELECT * FROM members WHERE username=? OR email=?"); 
$check_stmt->bind_param('ss', $username, $email); 
$check_stmt->execute(); 
$check_result = $check_stmt->get_result(); 
while ($row = $check_result->fetch_assoc()) { 
    if ($row->num_rows > 0) 
    { 
     if ($row['username'] > '') 
     { 
      header("Location: '..\..\..\?RegUserExsist=1'"); 
     } 
     else if ($row['email'] > '') 
     { 
      header("Location: '..\..\..\?RegEmailExsist=1'"); 
     } 
    } 

//end of problematic code 



    else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) 
    { 
     header("Location: '..\..\..\?RegInvalidEmail=1'"); 
    } 
    else if (empty($username)) 
    { 
     header("Location: '..\..\..\?RegInvalidUser=1'"); 
    } 
    else if (empty($password)) 
    { 
     header("Location: '..\..\..\?RegInvalidPass=1'"); 
    } 
    else 
    { 
$password2 = hash('sha512', $password.$random_salt); 

if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)")) 
{ 
$insert_stmt->bind_param('ssss', $username, $email, $password2, $random_salt); 
// Execute the prepared query. 
$insert_stmt->execute(); 

header("Location: '..\..\..\?success=1'"); 

} 
else 
{ 
header("Location: '..\..\..\?regfailed=1'"); 
}}} 
?> 
+0

你需要比較實際的用戶名/電子郵件,而不僅僅是檢查行數。例如'選擇用戶名=? AS user_exists,email =? AS email_exists,* ...' –

+0

???你檢查'num_rows> 0'_after_取得第一行?如果你沒有找到任何行,該怎麼辦?您還在查詢中使用電子郵件值調用'filter_var($ email,FILTER_VALIDATE_EMAIL)'_after_。我會首先檢查,並且只詢問數據庫,如果我有一個有效的電子郵件地址開始... –

+1

你不需要在'$ check_stmt'而不是'$ row'上調用'num_rows'嗎? – andrewsi

回答

1

我使用PDO和我有這樣的代碼進行檢查,看是否有用戶名已被佔用

<?php  
/* Create a new PDO object with database connection parameters */ 
    $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.'', DB_USER, DB_PASS); 

    // Create statement object 
    $stmt = $dbh->prepare("SELECT username FROM users WHERE username = :username"); 

    $stmt->bindValue(":username", $user); 

    $stmt->execute(); 

    if($stmt->rowCount() != 0) { 
     $this->setError('<span class="bold">Username</span> you have selected has already been used by another member in our database. Please choose a different Username!'); 
    } 
+0

爲什麼downvote?它的工作原理沒有任何評論。如果你有一個建議...給它 – AdRock

+0

其他人被低估,添加爲正確的答案,它完美的作品!非常感謝:) – user2267175

+0

@ user2267175謝謝。我不認爲這是你,因爲沒有像我說的那樣評論。我發現它讓人沮喪而沒有給出理由 – AdRock

相關問題