Php 如何检查表以查看字符串是否已在使用?
我使用这段代码检查userdb表中的username列(username为primary),以查看该字符串是否已经存在。如果不存在,则将从上一个表单输入的字符串添加到“我的表”的“用户名”列中。但如果它在那里,它会说“(用户名)已经在使用中了!” 当我在用户名列中输入一个条目,如“Sam”,然后在上一个表单中输入Sam时,这就起作用了。但是,如果我在用户名列中有“Sam”,然后在前面的表单中输入Sam(所有小写字母),则会显示键1的重复条目“Sam” 我只想说,不管我在前面的表格中输入了什么样的套管,管柱已经在使用了Php 如何检查表以查看字符串是否已在使用?,php,mysql,string,comparison,Php,Mysql,String,Comparison,我使用这段代码检查userdb表中的username列(username为primary),以查看该字符串是否已经存在。如果不存在,则将从上一个表单输入的字符串添加到“我的表”的“用户名”列中。但如果它在那里,它会说“(用户名)已经在使用中了!” 当我在用户名列中输入一个条目,如“Sam”,然后在上一个表单中输入Sam时,这就起作用了。但是,如果我在用户名列中有“Sam”,然后在前面的表单中输入Sam(所有小写字母),则会显示键1的重复条目“Sam” 我只想说,不管我在前面的表格中输入了什么样的
$result = mysql_query("SELECT username FROM userdb") or die(mysql_error());
$row = mysql_fetch_array( $result );
$checkuser = $row['username'];
if ( $checkuser == $username ) {
echo "<font color='red'>" .$username. "<font color='black'> is already in use!";
die(mysql_error());
} else {
mysql_query("INSERT INTO userdb (username, password) VALUES('$username', '$password' ) ") or die(mysql_error());;
echo "Data Inserted!";
}
$result=mysql\u query(“从userdb中选择用户名”)或die(mysql\u error());
$row=mysql\u fetch\u数组($result);
$checkuser=$row['username'];
如果($checkuser==$username){
echo“$username.”已在使用中;
die(mysql_error());
}否则{
mysql_查询(“插入到userdb(用户名、密码)值(“$username”,“$password”)中)或死(mysql_error());;
回显“插入数据!”;
}
将代码更改为:
strtolower($checkuser) == strtolower($username)
将代码更改为:
strtolower($checkuser) == strtolower($username)
检查结果中的行数
伪代码:
If num_rows>0
Username exists;
检查结果中的行数
伪代码:
If num_rows>0
Username exists;
你不应该这样做,因为这会导致比赛条件。如果在您的支票和insert之间,其他人将该用户名插入到表中,就会发生这种情况 正确的方法是在用户名上有一个主键并插入记录,捕获从DBMS返回的异常或错误代码 如果用户名已在其中,则不会再次插入,您将捕获错误 如果它不在那里,它将被插入,您将不会得到任何错误
关于大小写问题,我要么在插入或检查之前将所有用户名转换为小写,要么在所有检查中插入混合大小写版本和小写的DB副本和本地副本。您不应该这样做,因为这可能导致争用条件。如果在您的支票和insert之间,其他人将该用户名插入到表中,就会发生这种情况 正确的方法是在用户名上有一个主键并插入记录,捕获从DBMS返回的异常或错误代码 如果用户名已在其中,则不会再次插入,您将捕获错误 如果它不在那里,它将被插入,您将不会得到任何错误 就大小写问题而言,我要么在插入或检查之前将所有用户名转换为小写,要么在所有检查中同时插入DB副本和本地副本的大小写混合版本和小写。简短回答是: 如果希望用户名不区分大小写,则需要以不区分大小写的方式将其存储在数据库中。首先将给定用户名转换为所有小写(或所有大写) 然后在您提供的代码中使用$username的地方使用$lcusername 答案很长: 您不需要检查表中是否存在键。假设username字段上有主键属性,只需尝试将数据转换到表中(将其转换为小写)。如果数据库返回“复制密钥”错误,则您知道用户名已经存在,并且可以显示错误消息。如果数据库返回它成功插入了行(可能是通过使用mysql\u-affected\u-rows函数)。这使您不必在插入之前进行选择,从而大大简化了代码 您还应该转义要插入到表中的所有字符串,以帮助避免潜在的安全漏洞
$lcusername = strtolower($username);
// Escape strings
$esclcusername = mysql_real_escape_string($lcusername);
$escpassword = mysql_real_escape_string($password);
mysql_query("INSERT INTO userdb (username, password) VALUES('$esclcusername', '$escpassword') ");
if (mysql_affected_rows() == -1) {
// Display error message
} elseif (mysql_affected_rows() == 1) {
// Yay! Insert successful
} else {
// Affected rows is 0. Something went wrong
}
简单的回答是:
如果希望用户名不区分大小写,则需要以不区分大小写的方式将其存储在数据库中。首先将给定用户名转换为所有小写(或所有大写)
然后在您提供的代码中使用$username的地方使用$lcusername
答案很长:
您不需要检查表中是否存在键。假设username字段上有主键属性,只需尝试将数据转换到表中(将其转换为小写)。如果数据库返回“复制密钥”错误,则您知道用户名已经存在,并且可以显示错误消息。如果数据库返回它成功插入了行(可能是通过使用mysql\u-affected\u-rows函数)。这使您不必在插入之前进行选择,从而大大简化了代码
您还应该转义要插入到表中的所有字符串,以帮助避免潜在的安全漏洞
$lcusername = strtolower($username);
// Escape strings
$esclcusername = mysql_real_escape_string($lcusername);
$escpassword = mysql_real_escape_string($password);
mysql_query("INSERT INTO userdb (username, password) VALUES('$esclcusername', '$escpassword') ");
if (mysql_affected_rows() == -1) {
// Display error message
} elseif (mysql_affected_rows() == 1) {
// Yay! Insert successful
} else {
// Affected rows is 0. Something went wrong
}
正确执行此操作并避免竞争条件*的唯一方法是尝试插入用户的数据并检查任何错误,以查看该错误是否为重复密钥错误。如果您正在使用PDO(您应该这样做),它将抛出一个异常,您可以捕获并检查该异常。我认为您仍然可以使用PHP的标准错误处理来捕获和检查错误,我只是不确定如何进行 *这里的竞争条件是:
正确执行此操作并避免竞争条件*的唯一方法是尝试插入用户的数据并检查任何错误,以查看该错误是否为重复密钥错误。如果您正在使用PDO(您应该这样做),它将抛出一个异常,您可以捕获并检查该异常。我认为您仍然可以使用PHP的标准错误处理来捕获和检查错误,我只是不确定如何进行 *这里的竞争条件是: