Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > php + mysql (дата)


Автор: Dmitry_177 12.12.2007, 20:55
вывод таблицы:
Код

$select_q = mysql_query("SELECT * FROM table WHERE ...);
while($select_arr = mysql_fetch_array($select_q))
  {
...вывод
  }

так вот при выводе таблицы, мне нужно знать, есть ли в одном поле таблицы дата или нет.. вот так правильно будет, если поле с датой "date"?
Код

if ($select_arr['date'] == 0)
  {
    дата не установлена
  }

или как-то еще надо определять на нулевую дату значение $select_arr['date']?

Автор: HotHead 12.12.2007, 21:43
Dmitry_177, посмотрите в структуре таблицы значение по умолчанию для этого поля. На него и надо проверять. Традиционно это строка '0000-00-00'.

Автор: Dmitry_177 12.12.2007, 22:04
Я совсем забыл про empty smile 

Автор: Feldmarschall 12.12.2007, 22:09
Dmitry_177, а при чем здесь empty? 
во-первых, эта функция проверяет существование переменной, а переменная однозначно есть. следовательно, половина функционала не используется.
во-вторых, как тебе правильно указал HotHead, при наличии дефолтного значения в таблице будет '0000-00-00', а это не пустая строка. еще половина функционала долой.
интересная получается мысль - пользоваться функцией, которая на 100% здесь не подходит.

Автор: BuShaRt 13.12.2007, 14:53
Дату лучше всего хранить в int формате, а само содержимое должно являться UnixTime'ом.
Причем установить по умолчанию поле равное нулю. В таком случае
Код

if ($date > 0 ) {дата установлена}

если структуру нельзя уже менять, тогда
Код

if (!empty($date )) {дата установлена}

Автор: Feldmarschall 13.12.2007, 15:02
BuShaRt, вроде бы, HotHead выше показывал, почему empty не подходит для поля date
да и слово "лучше" стоит говорить с осторожностью. Всё-таки, скажем, дату рождения пока ещё не все системы могут хранить в поле типа int

Автор: Astraller 13.12.2007, 15:30
Feldmarschall, учить матчасть! В особенности понятие timestamp. 

Автор: HotHead 13.12.2007, 15:59
Ну тут много тонкостей. Я сам раньше хранил данные в основном в timestamp. Потом перешёл на date, т.к. в MySQL есть куча удобных встроенных функций для работы с датой. Dmitry_177 не говорил в чём он её хранит, так что я предположил что именно в date.

Автор: Dmitry_177 13.12.2007, 22:42
Цитата

Dmitry_177 не говорил в чём он её хранит, так что я предположил что именно в date.

да, я в date храню..

кстати говорят что timestamp быстрей обрабатывается чем date.. интересно чем.. может знает кто?

и еще такой вопрос про дату: как можно сравнить $select_arr['date'], если она там есть с текущей датой? вот так?
Код

if($select_arr['date'] > getdate())
{
  дата в БД больше нынешней даты..
}

Автор: Feldmarschall 13.12.2007, 23:10

Цитата(Dmitry_177 @  13.12.2007,  22:42 Найти цитируемый пост)
говорят что timestamp быстрей обрабатывается чем date


врут.

Цитата(Dmitry_177 @  13.12.2007,  22:42 Найти цитируемый пост)
как можно сравнить $select_arr['date'], если она там есть с текущей датой? вот так?


сравнивать надо в запросе.
но если надо именно в скрипте, скажем, чтобы раскрасить текущую дату, то да, примерно так. Но только чтобы функция, которую ты используешь в пхп для получения даты, возвращала строку в том же формате, в каком дата хранится в базе. getdate возвращает совсем не то что нужно

Автор: Dmitry_177 13.12.2007, 23:27
Да, мне нужно именно в скрипте.. Вот так работает =)))
Код

if($select_arr['date'] > date("Y-m-d H:i:s"))
{
  дата в БД больше нынешней даты..
}


И кстати empty корректно работает! если даты нету... строка ПУСТАЯ! если даты нет..

Автор: Feldmarschall 13.12.2007, 23:30
И ты так перебираешь все строки, коотрые лежат в базе - правильно?

Автор: Dmitry_177 13.12.2007, 23:37
Цитата

И ты так перебираешь все строки, коотрые лежат в базе - правильно?

нет, проверяю только дату.. а вывожу почти все строки из таблицы..

Цитата

И кстати empty корректно работает! если даты нету... строка ПУСТАЯ! если даты нет..


может это в последней версии PHP так сделали? у меня на компе все новенькое стоит..=))) Если в предыдущих версиях не так, то придется переделывать.. на хосте может одна из более старых версий PHP стоять..

Автор: Feldmarschall 13.12.2007, 23:41
А что делаешь, если дата больше, и что - если нет?
А если пустая - что делаешь?
Мне кажется, большую часть этих проверок можно убрать в запрос.

по поводу empty -  дело не в php. а в том, что в базе для этого поля у тебя нет значения по умолчанию. следовательно, туда пишется null. от этого будут проблемы в запросах.

Автор: Dmitry_177 13.12.2007, 23:51
Цитата

А что делаешь, если дата больше, и что - если нет?
А если пустая - что делаешь?
Мне кажется, большую часть этих проверок можно убрать в запрос.

вывожу ВСЕ строки, делаю один запрос в БД и в цикле каждую строку вывожу.. Если даты нету или если меньше текущей, то добавляю определенную надпись в строке при выводе.. Если есть и она больше текущей то просто дату вывожу.. Я уже думал что-то с запросами придумать, но мне кажется как я делаю всеже для моей задачи лучший выриант..

Цитата

по поводу empty -  дело не в php. а в том, что в базе для этого поля у тебя нет значения по умолчанию. следовательно, туда пишется null. от этого будут проблемы в запросах.

при создании таблицы в БД я специально этому полю прописал DEFAULT NULL. А проблем в запросах из-за этого я пока что-то не наблюдал..

Автор: HotHead 14.12.2007, 13:22
Цитата(Dmitry_177 @  13.12.2007,  23:51 Найти цитируемый пост)
при создании таблицы в БД я специально этому полю прописал DEFAULT NULL. А проблем в запросах из-за этого я пока что-то не наблюдал..

Ну если вы себе поставили NULL по умолчанию, то всё замечательно. Юзайте empty или is_null. Главное не забывать, что NULL это не пустая строка, не 0 и т.п. с точки зрения MySQL. Соответственно и проверять его в запросе надо будет через IS NULL. В остальном проблем возникнуть не должно.

Автор: Feldmarschall 14.12.2007, 13:28
HotHead, вот именно - с точки зрения Mysql. поэтому рекомендация про is_null в пхп - не совсем правильная, мягко говоря ;-)

Автор: HotHead 14.12.2007, 14:00
Feldmarschall, а вы попробуйте применить на результат запроса, вернувшего NULL, функцию var_dump. Видимо вас ожидает большой сюрприз. smile 

Автор: Feldmarschall 14.12.2007, 14:14
Хм. Твоя правда. Я был уверен, что приходит пустая строка. Был неправ.

Автор: SelenIT 15.12.2007, 12:01
Цитата(Feldmarschall @  13.12.2007,  15:02 Найти цитируемый пост)
дату рождения пока ещё не все системы могут хранить в поле типа int

Цитата(Astraller @  13.12.2007,  15:30 Найти цитируемый пост)
учить матчасть! В особенности понятие timestamp.

Во избежание дальнейших недомолвок и вызванных ими непоняток (если, конечно, я сам понял ;) - тут подразумевалось злополучное непонимание отрицательных таймштампов виндами. Отчего гарантированная нижняя граница диапазона дат - лишь 1970-й год, что, разумеется, для дат рождения взрослых юзеров не подходит. К тому же, системы с таймштампом в виде четырехбайтного целого ожидает еще одна хоть и нескорая, но малоприятная перспектива - проблема 2038 года... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)