Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查表以查看字符串是否已在使用?_Php_Mysql_String_Comparison - Fatal编程技术网

Php 如何检查表以查看字符串是否已在使用?

Php 如何检查表以查看字符串是否已在使用?,php,mysql,string,comparison,Php,Mysql,String,Comparison,我使用这段代码检查userdb表中的username列(username为primary),以查看该字符串是否已经存在。如果不存在,则将从上一个表单输入的字符串添加到“我的表”的“用户名”列中。但如果它在那里,它会说“(用户名)已经在使用中了!” 当我在用户名列中输入一个条目,如“Sam”,然后在上一个表单中输入Sam时,这就起作用了。但是,如果我在用户名列中有“Sam”,然后在前面的表单中输入Sam(所有小写字母),则会显示键1的重复条目“Sam” 我只想说,不管我在前面的表格中输入了什么样的

我使用这段代码检查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的标准错误处理来捕获和检查错误,我只是不确定如何进行

    *这里的竞争条件是:

  • 检查用户名是否唯一,是否为
  • 另一个用户创建一个