Switch语句未按预期工作

时间:2013-09-23 15:10:56

标签: php

我有以下代码:

switch ((int)$_GET["loanprovider"]) {
    case ((int)$_GET["loanprovider"] > 1):
        $sql_loanprovider1a = " l.id in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
        $sql_loanprovider1b = " l.loanid in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
        break;
    default:
        break;
}

如果我在URL中没有设置LOAN PROVIDER的情况下运行页面,SWITCH仍会进入第一种情况,而不是DEFAULT。怎么来的?

/鲍勃

4 个答案:

答案 0 :(得分:2)

解释很简单:

var_dump( (int)$_GET["loanprovider"]  );
var_dump( (int)$_GET["loanprovider"] > 1 );

输出结果为:

int(0)
bool(false)

它们都是相同的(整数0(零)被视为FALSE),如果查询参数loanprovider为空,则案例1将始终执行。

有关详细信息,请参阅PHP Manual


并且,要实际解决问题,请使用isset()。如果以后需要重新使用变量和存储值,这也是一个好主意。

在我看来,以下内容看起来更整洁,并且有效(测试):

if(isset($_GET['loanprovider'])) 
{
    $value = (int)$_GET["loanprovider"];
    switch ($value) {
        case ($value > 1):
            $sql_loanprovider1a = " l.id in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
            $sql_loanprovider1b = " l.loanid in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
            break;
        default:
            break;
    }
}

要调试此问题,您始终可以使用var_dump

答案 1 :(得分:0)

我不是PHP专家,但我认为你在switch语句中多次使用loanprovider是一个线索。我认为如果你没有设置loanprovider,你将有一个空值的值,这将在切换的参数中,然后在这种情况下使用类似的值。假设(int)$_GET["loanprovider"]为0.那么表达式(int)$_GET["loanprovider"] > 1也将返回0,因为0不大于1.你最终得到的是:

switch (0) {
case 0:
  // your code
  break;
default:
  break;
}

因为0 == 0,你最终会遇到第一种情况。

答案 2 :(得分:0)

未经测试但请求尝试(尽管编码为> 1)

但负值会是错误的。

switch (intval($_GET["loanprovider"])) {
    case 0:
        break;
    case 1:
        break;
    default:
        $sql_loanprovider1a = " l.id in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
        $sql_loanprovider1b = " l.loanid in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
        break;

答案 3 :(得分:0)

我首先检查是否设置了$ _GET [“loanprovider”],因为如果你没有在url中设置loanprovider它将是未定义的并且undefined不必是“0”它可以是其他东西。在这种情况下,它可能是一些值使你的语句((int)$ _ GET [“loanprovider”]> 1):true。

正确的代码是:

if (isset((int)$_GET["loanprovider"]))
{
  switch ((int)$_GET["loanprovider"]) {
    case ((int)$_GET["loanprovider"] > 1):
        $sql_loanprovider1a = " l.id in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
        $sql_loanprovider1b = " l.loanid in (select la.loanid from loan_approvals la where la.bankid = ".$_GET["loanprovider"].") and";
        break;
    default:
        break;
  }
}