неожиданное приведение к логическому значению? - PullRequest
4 голосов
/ 23 февраля 2011

С учетом этого ввода: http://example.com/item.php?room=248&supply_id=18823, следующие 2 блока должны давать одинаковый результат.Почему не они?Чего мне не хватает, кроме кофе?

Этот блок дает ожидаемые значения:

if (isset($_GET['supply_id']) && isset($_GET['room'])) {
    $id=validkey($_GET['supply_id']); //18823
    $room=validkey($_GET['room']); //248
    $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248
}

Но если я выполню проверку и присваивание за один шаг, $ id в конечном итоге будет равен 1вместо 18823. Почему?

if (isset($_GET['supply_id']) && isset($_GET['room'])) {
    if($id=validkey($_GET['supply_id']) && $room=validkey($_GET['room'])) 
        $arr=array('s'=>$id",'r'=>$room); //s=>1, r=>248
}

Я использую эту функцию:

function validkey($value){
    if(is_scalar($value)){
        $value=(int)$value;
        return ($value>0) ? $value : false;
    }
    return false;
}

Ответы [ 3 ]

7 голосов
/ 23 февраля 2011

Вы должны использовать скобки:

if(($id=validkey($_GET['supply_id'])) && ($room=validkey($_GET['room']))) 

В противном случае результат validkey($_GET['supply_id']) && $room=validkey($_GET['room']) присваивается переменной $id, поскольку оператор && имеет более высокий приоритет, чем =

3 голосов
/ 23 февраля 2011

Оператор && связывает сильнее, чем оператор =.

Таким образом, ваш код в основном становится if ($id = (validkey($_GET['supply_id']) && $room = validkey($_GET['room'])))

-> Добавьте скобки вокруг выражений $foo = $bar в вашемЕСЛИ заявление.

2 голосов
/ 23 февраля 2011

Похоже, у вас есть небольшая ошибка во втором примере - случайная двойная кавычка после $ id.Кроме того, ваш второй подход обычно не одобряется (присваивание переменных в конструкции if), поскольку это значительно затрудняет выполнение кода.Более понятным будет следующее:

if (isset($_GET['supply_id']) && isset($_GET['room'])) {     
    $id=validkey($_GET['supply_id']); //18823     
    $room=validkey($_GET['room']); //248

    if($id && $room) {     
        $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248 
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...