PDO MySQL 不区分大小写的查询区分大小写,并且 SQLSTATE[23000]:完整性约束冲突:1062 键'user_name'的重复条目



当有人(本周早些时候(能够使用相同的电子邮件地址注册两个帐户时,我第一次注意到了这个问题(区分大小写(。我已经解决了这个问题,在注册时添加了strtolower,并且暂时添加了LOWER用于查询(我认为我应该将数据库中所有以前存在的电子邮件都设置为小写,这样我就不需要在查询中使用LOWER(。

我现在遇到的问题(我已经想了大约5天了(是弄清楚如何查询数据库中不区分大小写的现有用户名,并在注册期间与新用户名进行比较(同样不区分大小字母(。

它不起作用(默认情况下,我认为查询不区分大小写,但似乎不是?(,因为我一直收到SQLSTATE[23000]:完整性约束冲突:1062密钥'user_name'的重复条目'[在此处注册时输入的名称]'

至少对我来说,这部分看起来很简单,它是唯一的,所以我不能在数据库中有两个相同的用户名。

我遇到的问题是查询不区分大小写的用户名,或者可能是数据库中用户名的排序规则(但我现在已经尝试了几十次。唯一能达到目的的排序规则是(尽管不是我需要的(latin1_bin,它将允许区分大小写用户名(例如,Duke、Duke、杜克(,如果其他人尝试注册完全相同的用户名,他们就不会注册允许(例如,如果杜克存在,杜克不能注册,但可以注册杜克(。这很好(我可能稍后会在我的另一个俗气网站上使用它,主要是业余爱好和读书的东西(,但对我来说,现在我需要能够阻止用户用大写和小写字母的变体注册相同的名字(例如,如果注册了"Duke",那么其他试图注册"Duke"的人将不被允许这样做(。

以上所有问题似乎都是其他地方的重复问题,但我相信我已经尝试了类似问题中提供的所有答案(我已经更改了几十次代码以适应答案,但没有一个给出不同的结果(。我还尝试更改数据库中用户名的排序规则(几十次((目前为utf8mb4_general_ci(

每次我尝试注册脚本时,它都会允许重复的用户名(例如,即使duke已经在数据库中,duke也会通过(通过,然后(我认为这是意料之中的(我会得到SQLSTATE[23000]:完整性约束违反:1062重复条目

如果这里有人能对我做错了什么提供一些见解,我将不胜感激!谢谢代码如下:

<?php
require_once 'dbconfig.php';
if($user->is_loggedin()!="")
{
$user->redirect('home.php');
}
if(isset($_POST['btn-signup']))
{
$uname = trim($_POST['txt_uname']);
$umail = strtolower(trim($_POST['txt_umail']));
$upass = trim($_POST['txt_upass']); 
if($uname=="")  {
$error[] = "provide username !";    
}
else if($umail=="") {
$error[] = "provide email id !";    
}
else if(!filter_var($umail, FILTER_VALIDATE_EMAIL)) {
$error[] = 'Please enter a valid email address !';
}
else if($upass=="") {
$error[] = "provide password !";
}
else if(strlen($upass) < 6){
$error[] = "Password must be atleast 6 characters"; 
}
else
{
try
{
$stmt = $DB_con->prepare("SELECT user_name,user_email FROM users 
WHERE user_name = :uname OR LOWER(user_email) = LOWER(:umail)");
$stmt->execute(array(':uname'=>$uname, ':umail'=>$umail));
$row=$stmt->fetch(PDO::FETCH_ASSOC);
if($row['user_name']==$uname) {
$error[] = "sorry username already taken !";
}
else if($row['user_email']==$umail) {
$error[] = "sorry email id already taken !";
}
else
{
if($user->register($fname,$lname,$uname,$umail,$upass)) {
$user->redirect('sign-up.php?joined');
}
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}   
}
?>

试试这个代码

$stmt = $DB_con->prepare("SELECT user_name,user_email FROM users WHERE user_name LIKE :uname OR user_email LIKE :umail ");
$stmt->execute([':uname' => $uname, ':umail' => $umail]);
$found = false;
$inRecord = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$__uname = $row['user_name'];
$__umail = $row['user_email'];
if ($__uname == $uname || strtolower($__uname) == strtolower($uname))
{
$inRecord['user_name'] = true;
}
if ($__umail == $umail || strtolower($__umail) == strtolower($umail))
{
$inRecord['user_email'] = true;
}
if (count($inRecord) > 0)
{
$found = true;
break;
}
}
if ($found === true)
{
if (isset($inRecord['user_name']))
{
echo "Username exists!";
}
if (isset($inRecord['user_email']))
{
echo "Email exists!";
}
}
else
{
// register here...
}

只有找到匹配项时才会输出。

用户名存在!电子邮件存在!

相关内容

  • 没有找到相关文章

最新更新