PHP条件处理Else值不正确
我正在用PHP编写一个条件语句来检查是否使用了某些用户凭据,并且正在使用一个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
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'];
}