为什么此代码检查重复的用户名未正确执行?

时间:2017-06-30 08:27:23

标签: php mysql login username

$conn正确连接到数据库。

数据库的用户表包含以下字段ID,名称,电子邮件,用户名和密码。表中的一个条目包含 benedict 作为用户名的值。

代码:

$userslist = $conn->prepare("SELECT * FROM users WHERE username=?");
$userslist->bind_param("s",$user);
$usersresult=$userslist->execute();
if($userslist->num_rows>0)
{
    $userErr="Username already exists";
    $errors++;
}

问题:

当我输入用 benedict 作为值的用户名(存储在$ user中)时,代码不会检测到重复的ID,尽管已经有了这样的用户名。此外,打印时$userslist->num_rows显示为0。

相反,以下代码正确识别出已存在重复的ID并打印错误。 (这证明没有连接错误或表错误)

$query="SELECT * FROM users WHERE username='".$user."'";
    $qresult=mysqli_query($conn,$query);
    if($qresult->num_rows>0)
    {   $userErr="Username already exists";
    $errors++;
    }

我知道唯一密钥和PDO是更好的解决方案。但是为什么在使用预准备语句时它不能打印出正确的结果。

5 个答案:

答案 0 :(得分:1)

受影响的行结果为: -1 表示查询返回了错误,因此未执行。

检查查询列/表名称中的错误等。

您的连接是否有效?

请尝试以下方法进行调试:

$userslist = $conn->prepare("SELECT * FROM users WHERE username=?");
$userslist->bind_param("s",$user);
$usersresult=$userslist->execute();
print_r($conn->error);

答案 1 :(得分:0)

我建议使用PDO开始,它对数据库查询更安全。 http://php.net/manual/en/book.pdo.php。我还建议您使用计数而不是SELECT *。这是一个浪费的检查,看看是否存在一行,使用计数会更有效。

你可以这样使用PDO。

$stmt = $db->prepare("SELECT count(1) FROM users WHERE username=?");
$stmt->execute(array($user));
$result = $stmt->fetch();
if($result)
{
if($result[0] == 1) echo "Username already taken";
else "username free";
}
else
{
echo "error";
}

答案 2 :(得分:0)

因此错误不受影响行:检查查询失败的原因:

`
 <?php
 $userslist = $conn->prepare("SELECT * FROM users WHERE username=?");
 $userslist->bind_param("s",$user);
 $usersresult=$userslist->execute();



 if($userslist->num_rows>0)
 {
     $userErr="Username already exists";
     $errors++;
 }
 elseif($userlist->affected_rows == -1) {

   echo 'An error occurred: ' . $conn->error;
 }

&GT?; ` 但是你确实意识到,在检查和实际插入之间的几毫秒内,可能会有另一个用户插入完全相同的名字?

添加:当用户名为唯一索引时如何执行此操作:

<?php
 $userslist = $conn->prepare("INSERT INTO users (username, name, etc) VALUES (?,?, ?)");
 $userslist->bind_param("sss",$user, $name, $etc);
 $usersresult=$userslist->execute();

 if($conn->errno == 1062) {
     $userErr="Username already exists";
     $errors++;
 }
 elseif($conn->errno) {
   echo 'An error occurred: ' . $conn->error;
 }
 else {
    if($userlist->affected_rows == 1) {
       echo 'success';
    } 
    else {
        echo 'unknown why not inserted';
    }
 }


?>

答案 3 :(得分:0)

你可以这样做。

if(mysqli_num_rows($userslist) > 0){

    echo "username already exists"
}

check if row exists with mysql - 类似问题

答案 4 :(得分:0)

你试过了吗?

$conn = new mysqli("localhost","user","password","db");
$sql = "SELECT * FROM users where username='".$_POST['username']."'";
$result = $conn->query($sql);
$count = $result->num_rows;
if($count > 0)
{
echo "Username ".$_POST['username']." already exists!";
}