如果PHP无法正常工作,则执行多个else

如果PHP无法正常工作,则执行多个else,php,if-statement,Php,If Statement,我的登录脚本有问题。其余的工作正常,但这里发生了一些奇怪的事情。问题是,即使$IPCHK返回true,elseif函数也不会执行。它只在我将$IPCHK设置为jibberish时执行。任何帮助都会很好。提前谢谢 if ($Numrows == 0) { if ($Fail >= 3) { $Connection = connectToDb(); //return true, false,pending $IPCHK = che

我的登录脚本有问题。其余的工作正常,但这里发生了一些奇怪的事情。问题是,即使$IPCHK返回true,elseif函数也不会执行。它只在我将$IPCHK设置为jibberish时执行。任何帮助都会很好。提前谢谢

if ($Numrows == 0)
{
    if ($Fail >= 3)
    {
        $Connection = connectToDb();
        //return true, false,pending
        $IPCHK = checkIP();
        $IPCHK = true; //forcing it to be true and still broke
        //If no ip id there
        if($IPCHK == false)
        {
            $IP = getIP();
            $Query = "INSERT INTO ip VALUES ('','$IP',Now())";
            mysqli_query($Connection, $Query)
                or die(error(mysqli_error($Connection)));
            echo "You have failed to login too many times";
            echo "<br />Please <a href='login.php'>try again</a> later.";
            $Lock = true;
        }
        //If ip is there but timer is not up
        elseif ($IPCHK == 'pending')
        {
            echo "You have failed to login too many times";
            echo "<br />Please <a href='login.php'>try again</a> later.";
            $Lock = true;
        }
        //Timers Up
        elseif ($IPCHK == true) //here does not execute when it returns true
        {
            $_SESSION['FailedLogin'] = 0;
            $Lock = false;
        }
        else
        {
            error("End of if check");
        }
    }
    else
    {
        $Fail = 3 - $Fail;
        $_SESSION['FailedLogin'] = $_SESSION['FailedLogin'] + 1;
        $Error = $Error."<br />You have ".$Fail." attempts remaining";
    }
}
if($Numrows==0)
{
如果($Fail>=3)
{
$Connection=connectToDb();
//返回true、false、pending
$IPCHK=checkIP();
$IPCHK=true;//强制它为true,但仍然失败
//如果那里没有ip id
如果($IPCHK==false)
{
$IP=getIP();
$Query=“插入ip值(“”,$ip',Now())”;
mysqli_查询($Connection,$query)
或死亡(错误(mysqli_错误($Connection));
echo“您多次登录失败”;
回音“
请稍后再说。”; $Lock=true; } //如果ip存在但计时器未启动 elseif($IPCHK==‘待定’) { echo“您多次登录失败”; 回音“
请稍后再说。”; $Lock=true; } //定时器 elseif($IPCHK==true)//此处在返回true时不执行 { $\u会话['FailedLogin']=0; $Lock=false; } 其他的 { 错误(“如果检查结束”); } } 其他的 { $Fail=3-$Fail; $_会话['FailedLogin']=$_会话['FailedLogin']+1; $Error=$Error。“
您有“$Fail.”剩余尝试次数; } }
在您的情况下

 elseif ($IPCHK == 'pending')
然后

第二个else将永远不会执行,因为$IPCHK=='pending'也意味着$IPCHK==true 如果你想执行第二个条件,你必须把第二个条件改成这样

elseif($IPCHK == 'done')
或者像这样简单地使用===

elseif($IPCHK === 'pending')
然后


Lamari Alaa是正确的,上的相关文档条目有助于理解原因

以下脚本输出:
boolean=string

$test = true;

if( $test == 'pending' ) {
    echo 'boolean = string';
} else if ( $test ) {
   echo 'boolean != string';
}

这是因为字符串“pending”在与布尔值true进行比较之前被强制为布尔值。由于它的计算结果为true,因此采用第一个条件。考虑将<代码>=“待定”<代码> > <代码>==``待定'< /Cult>

为什么不使用一个转换语句?我猜你有一个错误:这两个代码中的一个:<代码> $CONTION = CONTROTBO();代码>
$IPCHK=checkIP()?注释这些行并重试againI将找到一种方法来
var_dump()
输出,以确保您不会得到任何奇怪的结果。==在PHP中是相等的,==是标识。任何非空字符串都强制为“true”,因此当$IPCHK为“true”时,
$IPCHK=='pending'
将计算为true并生效。使用===排除混合类型条件疯狂。感谢ADRock,它工作得很好:D,感谢所有其他人的帮助:)他还可以使用
==
强制类型匹配-
$IPCHK==='pending'
如果$IPCHK是布尔值true,则将为false。seconded。不要混合使用==和===,除非您有很好的理由依赖隐式类型转换,否则始终使用===
elseif($IPCHK === true)
$test = true;

if( $test == 'pending' ) {
    echo 'boolean = string';
} else if ( $test ) {
   echo 'boolean != string';
}