2014-10-28 51 views
2

我有一個函數,如果一個指定的用戶在我的數據庫中,我將在我的屏幕上顯示一個字符串值的消息,簡單地說我的函數有效。mysqli_data_seek函數返回用戶名結果,當用戶名不在數據庫中

但是,當我將名稱更改爲數據庫中不存在的名稱時,我仍然得到一個字符串輸出,該函數說明該函數有效。所以我想弄清楚我的邏輯在查詢中的位置。下面是我有:

Users.php文件:

<?php 

function user_exists($username) 
{ 
    $db = "adults"; 
    $dbH = "localhost"; 
    $dbU = "root"; 
    $dbP = "Jeffery9"; 

    //connection to database 
    $dbCon = mysqli_connect($dbH, $dbU, $dbP, $db); 

    $username = sanitize($username); 
    // $query = mysqli_query($dbCon,"SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'"); 
    return (mysqli_data_seek(mysqli_query($dbCon,"SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username'"), 0) == 1) ? true : false; 
} 

?> 

現在,這裏的登錄頁面,其處理功能,看看如果用戶確實存在:

的login.php文件:

<?php 
include 'core/init.php'; 

if (user_exists('raiders7') === true) 
{ 
    echo 'user found!'; 
} 
die(); 

if(empty($_POST) === false) 
{ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    if(empty($username) === true || empty($password) === true) 
    { 
     $errors[] = 'You need to enter a username and password.'; 
    } 
    else if (user_exists($username) === false) 
    { 
     $errors[] = 'We can\'t find that username. Have you registered?'; 
    } 
} 
?> 

當然,我在數據庫中有一行和一個用戶。當字符串爲user_exists('raiders7')時,我在我的索引頁上獲得user found!

但是當它是user_exists('something else')它仍然返回頁面上user found!

這是怎麼回事?如果用戶不存在,頁面應該是空白的。

最後,我在使用其他功能來淨化喜歡這樣我的數據:

General.php文件:

<?php 

function sanitize($data) 
{ 
    $db = "adults"; 
    $dbH = "localhost"; 
    $dbU = "root"; 
    $dbP = "Jeffery9"; 

    // connection to database 
    $dbCon = mysqli_connect($dbH, $dbU, $dbP, $db); 

    return mysqli_real_escape_string($dbCon, $data); 
} 

?> 

不知道最後一部分是有益的,但有人很好地幫我修正了我的邏輯,當我的測試數據庫中不存在用戶時,我可以停止獲取user found!消息。謝謝。

+1

你可以砍掉了很多代碼的下降只是簡單地使用'mysqli_num_rows()'。 – 2014-10-28 02:57:43

回答

3

您應該獲取結果以獲得正確/想要的結果。

會發生什麼事是你剛移動鼠標指針,然後當然總會有一個結果索引0

+----------------+ 
| COUNT(user_id) | // even when count is zero, your condition will still be true 
+----------------+ 
| 0    | 
+----------------+ 

即使用戶名是錯誤的/不存在集行!

獲取結果正確,然後檢查計數

$username = $dbCon->real_escape_string($username); 
$query = mysqli_query($dbCon,"SELECT COUNT(`user_id`) as total FROM `users` WHERE `username` = '$username'"); 
$row = $query->fetch_assoc(); 
$count = $row['total']; // fetch the result! 

if($count > 0) { 
    // true 
} else { 
    // false 
} 

或者作爲@Fred說,只要使用num_rows和更好的綁定它:

$sql = 'SELECT * FROM `users` WHERE `username` = ?'; 
$select = $dbCon->prepare($sql); 
$select->bind_param('s', $username); 
$select->execute(); 

if($select->num_rows > 0) { 
    // found 
} else { 
    // not found 
} 
+0

我在這裏指出的另一件事是,將SQL分離到它自己的變量中也會有幫助(所以你可以回顯你將要執行的語句(甚至記錄到error_log))。 $ sql =「SELECT COUNT ... WHERE'username' ='$ username」; – 2014-10-28 02:59:53

+1

*「更好地綁定它:」* - 很多;) – 2014-10-28 03:02:43

+0

@JonathonHibbard yes在調試查詢時也可能有幫助,所以您會知道該期待什麼。 – Ghost 2014-10-28 03:03:04