0

我有以下代码:

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 中未设置 LOANPROVIDER 的情况下运行该页面,则 SWITCH 仍会输入第一种情况,而不是默认值。怎么会??

/鲍勃

4

4 回答 4

2

解释很简单:

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

输出是:

int(0)
bool(false)

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

有关详细信息,请参阅PHP 手册


而且,要真正解决问题,请使用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.

于 2013-09-23T15:23:57.490 回答
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,所以你最终处于第一种情况。

于 2013-09-23T15:16:49.587 回答
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;
于 2013-09-23T15:24:21.100 回答
0

我会首先检查是否设置了 $_GET["loanprovider"] 因为如果你没有在 url 中设置 loanprovider 它将是未定义的并且未定义不必是“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;
  }
}  
于 2013-09-23T15:25:29.753 回答