为啥我的脚本无法检查数据库中的相似用户名? [复制]

Posted

技术标签:

【中文标题】为啥我的脚本无法检查数据库中的相似用户名? [复制]【英文标题】:How come my script can't check the database for similar usernames? [duplicate]为什么我的脚本无法检查数据库中的相似用户名? [复制] 【发布时间】:2020-02-09 16:12:46 【问题描述】:

我正在尝试在用户注册时检查数据库中的用户名。与数据库的连接工作正常,因为类似的密码将被添加到表中。

$username = $_POST['user'];
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);

$s = 'SELECT * FROM users WHERE username = "$username"';

$result = mysqli_query($con, $s);

$num = mysqli_num_rows($result);

if ($num == 1) 
    echo "Username is taken";
else 

table for users

它转到 else 并将用户名添加到数据库中。我已经检查以确保用户名不超过一个,尽管大于号会更好。有任何想法吗?

【问题讨论】:

您的数据库中可能有 2 个或更多 same 用户名? 抱歉,我已经为另一部分准备了声明,并计划在我可以让这部分实际工作时进行。不过还是谢谢提醒。 if ($num == 1) ... 如果您的数据库中已经有 2 个或更多 same 用户名,则此条件将始终默认为 else。因此,请确保之前的测试用例没有将重复的用户名添加到您的数据库中。 是的,目前我尝试(并随后删除)的用户名在表中只有一个。结果只能是 0 或 1。 @Wenis 然后echo$num。它的价值是什么? 【参考方案1】:

您的代码必须使用参数绑定将$username 的值发送到数据库,否则"$username" 将被视为文字字符串。它还将保护您免受 SQL 注入。

在该列上创建一个唯一键可能会更好。如果您出于某种原因想在应用程序层执行此操作,您可以获取结果并使用它。

$stmt = $con->prepare('SELECT * FROM users WHERE username = ?');
$stmt->bind_param('s', $username);
$stmt->execute();
$result = $stmt->get_result()->fetch_all();

if ($result) 
    echo "Username is taken";
 else 
    // No such username in the database yet

这不会很有效,所以我们可以使用COUNT(1) 来简化它。它将返回一个包含匹配行数的值。

$stmt = $con->prepare('SELECT COUNT(1) FROM users WHERE username = ?');
$stmt->bind_param('s', $username);
$stmt->execute();
$usernameTaken = $stmt->get_result()->fetch_row()[0];

if ($usernameTaken) 
    echo "Username is taken";
 else 
    // No such username in the database yet

更多解释见https://phpdelusions.net/mysqli/check_value

【讨论】:

我在他们的问题下发表了评论,说明他们为什么使用password_hash()。我想你可能会被追到一个兔子洞里。 @FunkFortyNiner 我认为这只是后面代码的一部分。在其他部分,他们将创建新帐户 @FunkFortyNiner 我刚刚对其进行了测试,它可以工作。与密码相关的两行与答案无关,所以我将它们删除。 我不质疑你的回答 :) 我只是不确定他们是否包含 password_hash() 我想知道为什么我的第一条评论询问你是否 100% 确定被删除了。【参考方案2】:

$s = 'SELECT * FROM users WHERE username = "$username"';

您在单引号内使用双引号,因此不会发生插值。将顺序改为

$s = "SELECT * FROM users WHERE username = '$username'";

【讨论】:

这应该通过参数绑定来解决。

以上是关于为啥我的脚本无法检查数据库中的相似用户名? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Android 应用程序无法识别 drawables 目录的子目录中的 PNG? [复制]

为啥我无法在文档上设置 innerHTML? [复制]

为啥在 Redis 实现 Lua 脚本事务

为啥我的 IF 在我的 PL?SQL 脚本中被忽略? [复制]

未经检查的调用 ifPresent 检查,为啥? [复制]

为啥我重命名后无法访问 pandas 中的列? [复制]