Очень необычное поведение PHP

Для кода ниже я получаю страницу, которая выполняет задание на печать, а затем завершаю работу, даже если значение задания равно нулю.

$task = (isset($_POST['task']))?$_POST['task'] :(isset($_GET['task']))?$_GET['task']:0; 
if($task == "delete") {
    echo $task;
    exit(); 
}

выход:

0

однако, если я изменю первую строку на:

$task = (isset($_POST['task'])) ? $_POST['task'] :(isset($_GET['task'])) ? $_GET['task'] : NULL;    

это будет работать нормально, так почему же значение строки 'delete' равно 0?

2 ответа

Любая строка, которая не может быть преобразована в число, автоматически конвертируется в 0; поэтому "удалить" равно 0 при сравнении с числом.

Вы можете сравнить с помощью оператора идентичности, чтобы проверить типы, а также

if($task === "delete") {
    echo $task;
    exit(); 
}

Это гарантирует, что тип проверен и вернет false в результате.

Вам не хватает скобок в вашем троичном операторе, см. Пример в приоритете оператора:

$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

Ваш пример:

$task =
  (
    (isset($_POST['task']))
    ? $_POST['task']
    : (isset($_GET['task']))
  )
  ? $_GET['task']
  : 0;

Так что в зависимости от вашего $_POST а также $_GET Вы можете даже получить предупреждение PHP о недопустимом индексе.

Другие вопросы по тегам