PHP条件处理Else值不正确

PHP条件处理Else值不正确,php,switch-statement,conditional,Php,Switch Statement,Conditional,我正在用PHP编写一个条件语句来检查是否使用了某些用户凭据,并且正在使用一个if….elseif….else条件语句来完成这项工作。在每个语句中,如果该语句为真,则定义变量的值。无论如何,始终使用else值 另外,如果您想要布朗尼点数,使用switch语句是否更容易做到这一点 $username = $_POST['username']; $password = strong_crypt($_POST['password'] . $username ); $name = $_POST['name

我正在用PHP编写一个条件语句来检查是否使用了某些用户凭据,并且正在使用一个
if….elseif….else
条件语句来完成这项工作。在每个语句中,如果该语句为真,则定义变量的值。无论如何,始终使用
else

另外,如果您想要布朗尼点数,使用
switch
语句是否更容易做到这一点

$username = $_POST['username'];
$password = strong_crypt($_POST['password'] . $username );
$name = $_POST['name'];
$email = $_POST['email'];

while($row = mysqli_fetch_array($query))
{
    $allEmails = $row['email'];
    $allUnames = $row['uname'];
}

if($allEmails === $email)
{
    $message = "That email already exists. You can only have one account per email address.";
}
elseif($allUnames === $username)
{
    $message = "That username has already been taken. Please choose a different one.";
}
elseif($username === null || $email === null || $password === null || $name === null) 
{
    $message = "Please fill out all fields to register";
}
else
{
    mysqli_query($conn, "INSERT INTO login (name, uname, pword, email, lat, lon, it) VALUES ('$name', '$username', '$password', '$email', '$lat', '$lon', '$it')");
    $message = "goodtogo";
}

这里的问题似乎是您在while循环之外执行检查,因此检查将始终针对查询最后一行的值进行。也许这段代码更符合您的目标

$username = $_POST['username'];
$password = strong_crypt($_POST['password'] . $username );
$name = $_POST['name'];
$email = $_POST['email'];
$message = '';

if($username === null || $email === null || $password === null || $name === null) 
{
    $message = "Please fill out all fields to register";
}
else
{
    while($row = mysqli_fetch_array($query))
    {
        $allEmails = $row['email'];
        $allUnames = $row['uname'];

        if($allEmails === $email)
        {
            $message = "That email already exists. You can only have one account per email address.";
            break;
        }
        else if($allUnames === $username)
        {
            $message = "That username has already been taken. Please choose a different one.";
            break;
        }
    }
}
if (!$message)
{
    mysqli_query($conn, "INSERT INTO login (name, uname, pword, email, lat, lon, it) VALUES ('$name', '$username', '$password', '$email', '$lat', '$lon', '$it')");
    $message = "goodtogo";
}

如果查询每行只选择一封电子邮件,那么您的代码应该更像这样吗

 $username = $_POST['username'];
 $password = strong_crypt($_POST['password'] . $username );
 $name = $_POST['name'];
 $email = $_POST['email'];
 $taken=false;
 $invalid=false;
 while($row = mysqli_fetch_array($query))
   {
       $singleEmail = $row['email'];
       $singleUname = $row['uname'];


   if($singleEmail== $email)
   {
      $message = "That email already exists. You can only have one account per email   
       address.";
       $taken=true;
    }
    else if($singleUname== $username)
   {
       $message = "That username has already been taken. Please choose a different 
        one.";
      $taken=true;
   }
   else if($username == null || $email == null || $password == null || $name == null) 
   {
      $message = "Please fill out all fields to register";
      $invalid=true;
   }

}//end while

if (!$taken && !$invalid){

     mysqli_query($conn, "INSERT INTO login (name, uname, pword, email, lat, lon, it) 
     VALUES ('$name', '$username', '$password', '$email', '$lat', '$lon', '$it')");
      $message = "goodtogo";

}
这将使整个事情处于一个循环中。一次检查一封电子邮件

否则,您可以查询数据库以返回所有电子邮件,将它们放入一个数组中,然后将输入的电子邮件与该数组进行比较。比如说

 $allEmails() //assume array populated from db

 if(in_array($email, $allEmails)){ //then it already exists

您应该如下更改查询行

$query = "SELECT * FROM users WHERE `email`='{$email}'"; 
$isEmail = mysql_num_rows(mysql_query($query));
if($isEmail>0) $message = "That email already exists. You can only have one account per email address.";
$query = "SELECT * FROM users WHERE `uname`='{$name}'";
$isUser = mysql_num_rows(mysql_query($query));
if($isUser>0) $message = "That username has already been taken. Please choose a different one.";

变量
$allEmails
$allUnames
包含数据库最后返回的条目的值。我建议您将SQL查询更改为以下内容:

SELECT * FROM `users` where `email` = '$email'

或者使用数组:

$allEmails = array();
$allUnames = array();
while($row = mysqli_fetch_array($query))
{
    $allEmails[] = $row['email'];
    $allUnames[] = $row['uname'];
}
并使用检查输入的值是否在该数组中


此外,您的查询易受攻击。

获取的SELECT语句应返回多少行?附言:在你的if中,你不是在比较类型,不是吗?可能只有
==
吗?==运算符检查它们是否具有相同的值和类型。你试过了吗?考虑到$Acmail和$unMess是最后一个被抓取的用户的电子邮件和名字。因此,实际上if-else-if条件只检查最后一个用户的$username、$email等,而不是检查每一行数据。它返回多个值。我刚刚意识到我需要遍历所有的值请在if语句以
printf开头之前检查数据(“allEmails:%s allUnames:%s username:%s email:%s$password:%s name:%s”、$allEmails、$allUnames、$username、$email、$password、$name)。你得到了什么?应该更容易从_表中选择*,其中email='$email'或name='$name'。然后检查是否有一个或多个results@otome正是我需要的。谢谢你的帮助。忘记处理多个结果
$allEmails = array();
$allUnames = array();
while($row = mysqli_fetch_array($query))
{
    $allEmails[] = $row['email'];
    $allUnames[] = $row['uname'];
}