Очень необычное поведение 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 о недопустимом индексе.