为啥我的脚本无法检查数据库中的相似用户名? [复制]
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? [复制]