2014-10-28 50 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