Поведение «header» в if-statement

Это мой код для проверки доступа.

$query = "SELECT user_table.status, expire FROM user_table WHERE username = ?"; if($stmt = $mysqli->prepare($query)){ $username = phpCAS::getAttribute('uid'); $stmt->bind_param('s', $username); $stmt->execute(); $stmt->store_result(); $returned_amount = $stmt->num_rows; if($returned_amount>1) die("To many user names exists for you!"); else if(empty($returned_amount)) header("Location: /101/index.php?type=nouser"); $stmt->bind_result($status, $expire); $stmt->fetch(); $stmt->free_result(); $stmt->close(); if($expire != '0000-00-00 00:00:00' && strtotime($expire) <= time()) header('Location: /101/index.php?type=expired'); $access = $status; }else die("Failed to prepare!"); ?> 

Однако, когда $returned_amount == 0 .

он не попадает в header("Location: /101/index.php?type=nouser");

Если я изменил код на следующий, он устранит проблему, но я не понимаю, почему ее изменение помогло бы.

 if($returned_amount>1) die("To many user names exists for you!"); else if(empty($returned_amount)){ header("Location: /101/index.php?type=nouser"); exit(); } 

Если я удалю exit(); , заголовок не будет выполнен.

Просто использование header() не означает, что выполнение кода прекращается. Всякий раз, когда для переадресации используется header() вам необходимо явно вызвать exit() чтобы остановить выполнение скрипта.

Убедитесь, что нет пробелов или любых других символов, которые выводятся на странице. Заголовок () не будет работать иначе. Добавление exit () останавливает это. Попробуйте удалить?> В конце вашего скрипта (он будет работать без прилагаемой скобки). Однако лучше всего, чтобы вы вышли из сценария после того, как заголовок («Место: …») запущен, потому что он устраняет эту проблему, и это то, что вы намереваетесь сделать в любом случае (чтобы выйти из этой страницы и перейти на другую страницу)