所以我在我的网站上有一个php注册脚本,这是我今天注意到有人注册了相同用户名的mysql有一个工作人员。我已经尝试过这样做我的自己但if语句停止了我但是有些他们如何通过它所以我只需要问如果在php中= =和===之间的差异我认为我读了一些是如果我使用===它会使它完全正确。
// here we check to see if the username is all ready in the db
$sql2 = "SELECT `username` FROM `users` WHERE `username` = '" . $user2. "'";
$result2 = mysql_query($sql2) or die(mysql_error());
if (mysql_num_rows($result2)==1) {
echo "A Account Is All Ready Here";
} else {
//
now we made the account
}
我知道我应该转移到pdo我想也许这会解决它
// here we check to see if the username is all ready in the db
$sql2 = "SELECT `username` FROM `users` WHERE `username` = '" . $user2. "'";
$result2 = mysql_query($sql2) or die(mysql_error());
if (mysql_num_rows($result2)===1) {
echo "A Account Is All Ready Here";
} else {
}
问题是一个用户注册了abc,然后另一个注册用abc< - 后面有一个空格,它表示用户名没有被使用,然后当用户登录时用户名ti将登录他们进入正常的abc ......
答案 0 :(得分:1)
这是我的意见
mysql_real_escape_string($user2)
。if (mysql_num_rows($result2) > 0)
因为如果有两个或多个重复帐户,您的情况将被破坏。username
字段作为UNIQUE放在数据库中。问题是一个用户注册的是abc,然后是另一个 注册abc< - 后面有一个空格,它表示用户名 没有使用,然后当人登录后的空格 用户名ti将登录到正常的abc ..
解决方案是构建用户名验证。您需要指定允许用户名的字符集。例如:仅字母,数字和下划线。如果用户注册了不支持的字符,请给他一条错误消息。
答案 1 :(得分:0)
==
比较值
===
比较值和类型,然后'1'
不是1
通常在php中
还在UNIQUE
数据库表列上添加username
约束,以避免在数据库中出现重复。
答案 2 :(得分:0)
==运算符只是检查左右值是否相等。但是,===运算符(注意额外的“=”)实际检查左边和右边的值是否相等,并检查它们是否属于相同的变量类型
答案 3 :(得分:0)
==
是比较运算符(检查是否
两个变量具有相等的值)===
是完全相同的比较
运算符(检查两个变量
具有相同的价值并且是相同的
类型)。如果您要检查用户名结果,则应为>
if (mysql_num_rows($result2)>0){
echo "A Account Is All Ready Here";
}
答案 4 :(得分:0)
首先,比较差异(PHP):
1 == true
(将导致为真)
1 === true
(会导致错误)
==
只检查相等的值(1 == true
返回true),而===
也检查类型(1 === true
是false
(整数vs布尔型))
第二:你的空白问题:
如果您使用的是MYSQL =
,那并不意味着值必须100%相等。
SELECT 'abc ' = 'abc'
将返回单个字段1
,因为ist线程相等。
请改为使用Like
比较:SELECT 'abc ' LIKE 'abc'
将返回0
原因:=
不关心尾随空格。 LIKE
会这样做。
根据SQL标准,LIKE基于每个字符执行匹配, 因此它可以产生与=比较运算符不同的结果:
特别是,尾随空格很重要,但事实并非如此 使用=运算符...
执行CHAR或VARCHAR比较
在Sitenode上:在SQL中使用=
以及某个整理可能很有用,例如。什么时候
特殊字符:SELECT 'Mass' = 'Maß' Collate utf8_unicode_ci
将返回true,而SELECT 'Mass' LIKE 'Maß' Collate utf8_unicode_ci
将因字符串长度不同而返回false。