用户名可用性检查在PHP中不起作用

用户名可用性检查在PHP中不起作用,php,mysql,pdo,Php,Mysql,Pdo,如果我完全填写表格,电子邮件可用性检查将失败,即使我的数据库中已经有该检查,但如果我将任何字段留空或输入与要求相反的内容,则将报告错误,并且电子邮件可用性检查也将报告电子邮件已被使用。这严重阻碍了我在项目中的进展 <?PHP if(isset($_POST['submit'])) { if (empty($_POST["firstName"])) {$Err[] = "* First Name is required";} else { $name = test

如果我完全填写表格,电子邮件可用性检查将失败,即使我的数据库中已经有该检查,但如果我将任何字段留空或输入与要求相反的内容,则将报告错误,并且电子邮件可用性检查也将报告电子邮件已被使用。这严重阻碍了我在项目中的进展

<?PHP
   if(isset($_POST['submit'])) 
{
  if (empty($_POST["firstName"]))
   {$Err[] = "* First Name is required";}
  else
 {
  $name = test_input($_POST["firstName"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z ]*$/",$name))
  {
  $Err[] = "Only letters are allowed in First Name"; 
  }
}

if (empty($_POST["email"]))
  {$Err[] = "* Email is required";}
else
{
  $email = test_input($_POST["email"]);
// check if e-mail address syntax is valid
  if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
  {
    $Err[] = "Invalid email format"; 
  }
  else 
{
$emailSQL = "SELECT email FROM userdetails WHERE email = ?";
$SQ = $conn->prepare($emailSQL) or die("ERROR: " . implode(":", $conn->errorInfo()));

    $SQ->bindParam(1, $email);
    $SQ->execute();
    /* $result = $SQ->fetch(); */
    $count = $SQ->rowCount();
if($count !== 0){
    $Err[] = "Sorry, email is already in use by another user";
}}}

if (empty($_POST["surname"]))
        {$Err[] = "* Surname is required";}
else
    {
        $surname = test_input($_POST["surname"]);
        // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$name))
   {
        $Err[] = "Only letters are allowed in Surname"; 
    }
   }
if (empty($_POST["password"]))
        {$Err[] = "* Password is required";}
else
   {
        $password = test_input($_POST["password"]);
}
if (empty($_POST["userName"]))
         {$Err[] = "* Username is required";}
else 
    {
      $username = test_input($_POST["userName"]);
     // check if name only contains letters and whitespace
      if (!preg_match("/^[a-zA-Z ]*$/",$name))
    {
       $Err[] = "Only letters are allowed in Username"; 
    }
   }

if (count($Err > 0)) {
    echo "<div id = 'errors'>";
    foreach ($Err as $error) {
        echo $error;
        echo "<br />";
    }
    echo "</div>";
}
?>
替换

if($count !== 0){
   $Err[] = "Sorry, email is already in use by another user";
}

rowCount()重新运行受上次delete、insert或update sql语句影响的行数

使用下面的命令获取记录返回的编号

$row = $SQ->fetch(PDO::FETCH_NUM);

if($row[0] > 0){
    $Err[] = "Sorry, email is already in use by another user";
}

即使这样也无济于事,请对代码和逻辑进行疑难解答。

我通常使用嵌套的if-then语句或else-if语句。返回受上一条语句影响的行数,而不是返回的行数并将其与零进行比较,但如果所有字段都已填充,它仍然不起作用。@Passer Uhm,继续阅读该函数的其余部分说明…@Passerby如果关联PDO语句执行的最后一条SQL语句是SELECT语句。。。return该语句返回的行数。我已经这样做了,但仍然是一样的。如果所有字段都已填充,则不工作@Rohith您是否检查过$count=$SQ->rowCount();返回正确的计数??我必须承认它确实起作用,但最肯定的不是因为你认为它起作用的原因。@deceze你怎么想?
fetch(PDO::fetch_NUM)
返回一个结果行数组或
false
。使用
时,这些值分别转换为
1
0
。因此,它碰巧起作用,但只是出于纯粹的偶然。
$row = $SQ->fetch(PDO::FETCH_NUM);

if($row[0] > 0){
    $Err[] = "Sorry, email is already in use by another user";
}