2013-09-23 4 views
0

я в follwing код:Переключить оператор не работает, как ожидалось

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; 
} 

Если я запустить страницу без установки LOANPROVIDER в URL, переключатель еще входит первый случай и не DEFAULT. Как так??

/Bob

+0

Проблемы вы испытываете, что результат выражения результатов в значении ИСТИНЫ или ЛЖИ (1 или 0). Поэтому ваше выражение проверяет if (int) $ _ GET ["loanprovider"]) = 1 или 0, в зависимости от обстоятельств. Исправьте свою логику и получите ожидаемые результаты. – crafter

ответ

0

Я бы сначала проверить, если $ _GET [ «loanprovider»] установлено значение, потому что если вы не установите loanprovider в URL будет неопределенным и неопределенным, не должен быть «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; 
    } 
} 
+0

Большое спасибо, отлично работает! –

+0

Интересно отметить, что 'case ((int) $ _ GET [" loanprovider "]> 1)' возвращает предупреждение msg, если не задано, но все равно возвращает положительное! –

0

Я не PHP эксперта, но я думаю, что ваше излишнее использование 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

Объяснение довольно простое:

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

Выход:

int(0) 
bool(false) 

Они оба одинаковы (целое число 0 (ноль) рассматривается как FALSE), и случай 1 всегда будет выполняться, если параметр запроса loanprovider пуст.

Для получения дополнительной информации см. 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.

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; 
Смежные вопросы