Почему этот редирект PHP header () застревает в бесконечном цикле? - PullRequest
1 голос
/ 07 сентября 2011

У меня есть этот фрагмент кода, который должен получить текущую дату, сопоставить ее с установленной датой окончания и перенаправить, если текущая дата превышает дату окончания. Всякий раз, когда я устанавливаю $ promoend на прошлую дату, я застреваю в цикле перенаправления.

Блок if () должен перенаправляться только в том случае, если продвижение завершено, а я еще не на странице closed.php.

$currentdate = new DateTime("now");
$promoend = new DateTime("11/01/2010 00:00:00");
$promoend = $currentdate->diff($promoend)->invert;
if ($promoend && !strpos($_SERVER["PHP_SELF"],"closed.php")) {
    header("Location: ".$environment->root."/closed.php");
}

Есть идеи, почему это зацикливается?

Ответы [ 3 ]

5 голосов
/ 07 сентября 2011

strpos может вернуть 0, если стрелка ('closed.php') находится в начале стога сена ($ _SERVER ['PHP_SELF']).Это будет рассматриваться как «false» в PHP, поскольку вы не используете оператор строгого сравнения.

Вы ДОЛЖНЫ использовать оператор строгого сравнения для проверки этого случая:

if ($promoend && (strpos(...) !== FALSE)) {
   header(...);
}
1 голос
/ 07 сентября 2011

<code>
if ($promoend && !strpos($_SERVER["PHP_SELF"],"closed.php")) {
    header("Location: ".$environment->root."/closed.php");
}

... вероятно должно быть ...


if ($promoend && strpos($_SERVER["PHP_SELF"],"closed.php")!==true) {
    header("Location: ".$environment->root."/closed.php");
}

Поскольку strpos () не всегда возвращает логическое значение, поэтому вы должны использовать PHPоператор эквивалентности.

0 голосов
/ 07 сентября 2011

Предполагая, что ваши вычисления даты верны, причина в том, что strpos возвращает 0, потому что строка, которую вы ищете в PHP_SELF, находится в позиции 0.

Вы должны использовать! == "" вместо просто! Val, потому что 0 совпадает с "" и равно NULL

...