2015-10-22 3 views
2

Я не знаком с PHP. Я люблю его до сих пор, за исключением того, что этот бит кода работает иногда и в других случаях совсем не так.Что случилось с моим кодом PHP-кода?

Я пытаюсь перенаправить в зависимости от времени суток. У меня есть этот скрипт, настроенный на несколько доменов, с разным временем для каждого. Иногда он работает правильно, а иногда и нет. Я модифицировал свой файл php.ini, а также .htaccess, чтобы попытаться установить часовой пояс. Я пробовал написать время в CST, на котором находится мой сервер (Hostgator), но и не повезло. Я должен отметить, что есть некоторый HTML, который следует за моим кодом здесь, но он находится вне php.

Это не имеет смысла для меня, почему это работает только ИНОГДА. Я пытался разархивировать свой кеш-браузер много раз, но он никогда не помогал. В этом коде он должен отображать только html под ним в период с 17:46 до 18:43 и перенаправлять в любое другое время, не так ли? Это какая-то проблема кеширования? Сохраняется ли сценарий, а затем не выполняется, когда я посещаю несколько сайтов подряд? Любая помощь приветствуется.

Самый лучший сценарий - это происходит только со мной, потому что я слишком часто посещаю сайты, чтобы убедиться, что скрипт работает правильно. Это возможно?

<?php 
date_default_timezone_set('America/Los_Angeles'); 
$hour = date("G"); 
$min = date("i"); 

if(($hour >= "0" and $min >= "00") and ($hour <="17" and $min <= "47")) 
    { 
    header('Location: http://mysite.php'); 
    exit(); 
} 
elseif(($hour >= "18" and $min >= "43") and ($hour <="23" and $min <= "59")) 
    { 
    header('Location: http://mysite.php'); 
    exit(); 
} 
?> 
+1

Ваши условия неверны. Попробуйте вручную подсчитать результаты '15: 59' или' 19: 40', они не будут такими, какие вы ожидаете. – DCoder

+0

Извините, но что это значит? Как рассчитать результаты 15:59 и 19:40. У меня теперь есть решение, но я все еще не понимаю, что случилось с моим кодом и почему он работал с перерывами. – TSpinVirus

+0

То, что я имел в виду, делал вид, что время теперь '15: 59', это означает' $ hour = "15"; $ min = "59"; '. Умственно пройдите свой код и подумайте, что происходит с каждым шагом, как каждое сравнение работает и т. Д. – DCoder

ответ

1

Вот укороченный код, я преобразовал время в военное время. Если военное время меньше 1747 г. или больше 1843 г., оно будет перенаправлено, иначе будет отображаться содержимое HTML.

  date_default_timezone_set('America/Toronto'); 
      $hour = date("G"); 
      $min = date("i"); 
      $milTime = $hour . $min ; 

      if($milTime < 1747 || $milTime > 1843) 
      { 
      header('Location: http://stackoverflow.com/questions/'); 
      echo "Redirect"; 
      exit(); 
      } 
      echo "<h1>$milTime Show HTML Content</h1>"; 
+0

Хорошо, пока что, похоже, хорошо работает, а также легче справиться. Благодаря! Мой оригинальный код работает на данный момент для моих других доменов, но я собираюсь перейти к этому военному временному коду и, надеюсь, достичь надежности, которую я ищу. – TSpinVirus

0

Попробуйте использовать intval(), чтобы получить действительное число, и сравнить:

date_default_timezone_set('America/Los_Angeles'); 
$hour = intval(date("G"), 10); 
$min = intval(date("i"), 10); 

if(($hour >= 0 and $min >= 0) and ($hour <= 17 and $min <= 47)) 
{ 
header('Location: http://mysite.php'); 
exit(); 
} 
elseif (($hour >= 18 and $min >= 43) and ($hour <= 23 and $min <= 59)) 
{ 
header('Location: http://mysite.php'); 
exit(); 
} 

Что вы делаете, сравнивая строки, которые персонаж за символом сравнения (их порядок таблица ASCII). Так, например, если вы сравниваете "13" > "10", это правильно, потому что "1" == "1" (равно, продолжается), а затем "3" > "1" (true, возвращает true).

Но что, если вы сравните "098" > "100"? "0" > "1" (false, возвращает false). Очевидно, что это не работает для ваших целей, так как 098 = 98 на самом деле меньше 100.

EDIT: Как правильно упомянул @DCoder, строки сначала преобразуются в числа (целые числа), а затем сравниваются. Я настоятельно рекомендую обязательно их преобразовать в числа, а затем сравнить, чтобы избежать возможных проблем при работе со строками.

+0

Не было никаких изменений, если я попытался использовать intval() – TSpinVirus

+0

Сравнение чисел более семантически корректно, но PHP имеет специальное правило, в котором говорится: «Если вы сравниваете число со строкой или сравниваете числовые строки, то каждая строка преобразованный в число и сравнение, выполненное численно. »* (http://php.net/manual/en/language.operators.comparison.php).Кроме того, вы выбрали плохой пример для численного сравнения, '098' не равен' 98', это недопустимый * восьмеричный * номер, который становится '0'. – DCoder

+0

@DCoder вы правы, я должен был написать 'intval (..., 10);' указать целое число базы 10. Изменено. Одна проблема с этим правилом (и именно поэтому я его избегаю) заключается в том, что он говорит **, преобразованный в число **, которое в документах говорит, что это «целое число» ... но в какой базе? 2, 8, 10, 16? Час '17' будет в базе 10, но' 09' в базе 8 (восьмеричный). Поскольку я не знаю, что будет, я заставил бы 10 и сделать сравнение в той же базе. –

Смежные вопросы