[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод приветствия в зависимости от времени
SilverFox
есть такой код:
<?php
$hour = (int)strftime('%H');
$welcome = '';// Инициализируем переменную для приветствия

if ($hour > 0 or $hour < 6):
$welcome = 'Доброй ночи';
elseif ($hour >= 6 or $hour < 12):
$welcome = 'Доброе утро';
elseif ($hour >= 12 or $hour < 18):
$welcome = 'Добрый день';
elseif ($hour >= 18 or $hour < 23):
$welcome = 'Добрый вечер';
else :
$welcome = 'Доброй ночи';
endif;

echo '<h1> Время:'.$hour .'<br /> Приветствие: '. $welcome.'</h1>';
?>

при его выполнении получаем все время одно и тоже сообщение

Время:13 (время выводится правильно, только округленно в большую сторону, например в 12:15 выдало 13)
Приветствие: Доброй ночи

а вот сообщение выводится все время одно и тоже - Доброй ночи.

тот же кусок кода набраный на турбо паскале выводит все правельно

в чем подвох???
kjdgh
if ($hour > 0 or $hour < 6)
перевожу: если $hour больше нуля или меньше шести, то...
Но ты не учел то, что если выполняется условие $hour > 0, то следующее игнорируется. Советую применить AND.

_____________
Новичек в программировании и вообще не разбираюсь в этом, так что не вините.



McLotos
$hour=date(H);
if ($hour > 0 && $hour < 6) {$welcome = 'Доброй ночи';}
elseif ($hour >= 6 && $hour < 12) {$welcome = 'Доброе утро';}
elseif ($hour >= 12 && $hour < 18) {$welcome = 'Добрый день';}
elseif ($hour >= 18 && $hour < 23) {$welcome = 'Добрый вечер';}
else {$welcome = 'Доброй ночи';}

Ну во-первых синтаксис PHP всё-же немного отличается от синтаксиса TP (альтернативный синтаксис не в счет =))
Во-вторых OR это логическое ИЛИ, у него немного другое назначение, здесь нужно использовать логическое И
В-третьих, очень хорошим плюсом PHP является то, что он умеет создавать переменные на лету.

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
SilverFox
Спасибо, исправил or на && и все заработало
проверил с AND, также работает.
Всем спасибо, тему можно закрывать.

зы посыпаю голову пеплом... вот что значит что то писать в час ночи... wink.gif
sergeiss
Цитата (SergeySA @ 5.07.2014 - 14:25)
В-третьих, очень хорошим плюсом PHP является то, что он умеет создавать переменные на лету.

Но, тем не менее, инициализация переменной, как сделал ТС, является очень правильным подходом.
В данном случае не принципиально, но нередки ситуации, где это может быть важно. Поэтому лучше взять за правило всегда инициализировать. Ведь заранее не знаешь, как придется модифицировать текст; неинициализированная переменная может стать причиной гемора.
И еще. В данном случаен не важно, используешь ты '&&' или 'and'. Мне больше 'and' нравится, т.е. более "человеко-читаемо" smile.gif получается.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
McLotos
просто && короче и привычнее, роднее так сказать =)
А почему предварительная инициализация это хорошо? Я не вижу в ней смысла, есле конечно это не ООП, там да. Но там это просто удобно, а не принципиально

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
Цитата (SergeySA @ 5.07.2014 - 21:35)
А почему предварительная инициализация это хорошо?

Потому что при попытке работать с неинициализированной переменной ты получишь нотис. А это "не есть хорошо". Ну допустим, так...

if( any_condition )
{
$str = 'This is a string';
}

if( $str != '' )
{
...
}

Я написал некий упрощенный код, чтобы показать суть. Во втором ИФе переменная $str будет неизвестна, если в первом ИФе не сработает условие. И не говори, что ты не напишешь такой код :) Элементарно. Было что-то, ты изменил, получил такой код. Ну, например, убрал else у первого ИФа, в котором шло присвоение этой переменной другой величины, либо еще что-то сделал.

Цитата (SergeySA @ 5.07.2014 - 21:35)
просто && короче и привычнее, роднее...

Если ты пришел в ПХП из Си, то может быть и роднее :)

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
McLotos
Ну так в таком случаем мне логичнее получить notice чем сидеть и не понимать почему всё не так как должно быть. А оказывается переменная осталась пустая. или нет?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
Цитата (SergeySA @ 5.07.2014 - 21:49)
Ну так в таком случаем мне логичнее получить notice...

Неправильный подход!!! Надо код так писать, чтобы ни каких нотисов не было. Лучше включать режим показа всех ошибок/нотисов, хотя бы на время разработки.

И намного логичнее просто перед первым ИФом (в моем примере) написать
$str='';
if(....)

Именно это будет более правильно :)


PS.
Цитата (sergeiss @ 5.07.2014 - 21:34)
'&&' или 'and'

разница между ними вот тут описана: http://www.php.net/manual/ru/language.operators.logical.php

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
McLotos
Цитата (sergeiss @ 5.07.2014 - 22:05)
Надо код так писать, чтобы ни каких нотисов не было.

так я об этом и говорю. Конечно на действующем проекте у меня отключен вывод ошибок, только логирование. а при разработке error_reporting(E_ALL)

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
SergeySA, так вот и получается, что инициализация переменных заведомо приводит к более "чистому" и правильному коду, который не выдает нотисов.

И кстати. В ряде случаев можно получить более суровые грабли. Вот, например, надо прочитать данные из таблицы из БД и поместить их в массив.

// тут, перед циклом, делается запрос данных в БД - код не пишу, он не важен для примера
while( $row = ......)
{
$data[] = $row;
}

if( count($data) == 0 ) ...

Что получим, когда попробуем подсчитать количество элементов массива? Если данных не было, то получим геморрой на свою голову. Потому что массив $data нет (!!!). Решается это очень просто: надо перед циклом while инициализировать массив:
$data = array();

Тогда, по окончании обработки данных, массив может быть нулевой длины. А если он не был инициализирован заранее, то он не может быть нулевой длины.

Когда сколько-то раз по таким граблям пробежишь, то поймешь, что "ну его"... Лучше инициализировать и заведомо обойти подобные проблемы.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
McLotos
Цитата (sergeiss @ 5.07.2014 - 22:32)
надо перед циклом while инициализировать массив:

или if(!empty($data)) или даже if(is_array($data))
кстати второй вариант ответит "да", даже есть $data пустой, так что попытка подсчета тоже выдаст ошибку
Цитата (sergeiss @ 5.07.2014 - 22:32)
Лучше инициализировать и заведомо обойти подобные проблемы.

Это да. я к этому пришёл когда начал ковырять ООП в PHP
но только в классах. Вне ООП всё ещё не вижу никакого смысла в предварительном создании переменных. Есть же способы проверить перед обработкой. зачем заморачиваться? вдруг туда ничего не попадёт? а unset я забыл что такое, мало ли =))))

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
sergeiss
Делай так, как лично тебе удобнее, кто ж мешает-то? Я тебе объяснил, да показал на примерах, где и зачем полезна предварительная инициализация переменных.

Если не тебе, так еще кому-нибудь пригодится эта инфа.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.