За последние 24 часа нас посетил 16051 программист и 1539 роботов. Сейчас ищут 892 программиста ...

мучительная тема с датами

Тема в разделе "PHP для новичков", создана пользователем wolf777, 20 ноя 2014.

  1. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    такая проблема: $data это сегодняшняя дата т.е 20.11.2014, другая переменная $datenorm - это конечная дата например 23.11.2014

    если прописываю так, то удаляется сразу не дождавшись 23-его числа

    Код (Text):
    1. // Удаление номера
    2. $data = date('d.m.Y'); // дата системная
    3. $datenorm=$row['record_date']; // дата в бд
    4.  
    5. if (strtotime($data) >= strtotime($datenorm)) {
    6. $result=mysql_query("DELETE FROM `".prefix."shinfo` WHERE user='".$USER->id."' and `icq`='".$t."'");
    7. }
    по коду получается так
    если дата 20 число больше или равно 23 то удаляем, а почему сразу удаляет не пойму

    Добавлено спустя 8 минут 18 секунд:
    есть у кого догадки?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    догадки две:
    1. ты запутался в строковом представлении даты. сравнивать две даты в PHP лучше в unix timestamp, т.е. как целые числа.
    2. твой запрос DELETE не имеет никакого отношения к датам. тупо удаляешь все записи пользователя (и при чем здесь icq вообще хз)
     
  3. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    1. я запутался в условии т.е в if (strtotime($data) >= strtotime($datenorm)) {
    2. запрос DELETE у меня верный
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    var_dump($datenorm) что выдаст?
     
  5. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    var_dump($datenorm) в любое место это записать?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    var_dump() сделай непостредственно перед тем if который у тебя говно.

    скажи просто по русски какое действие выполняет твой DELETE
     
  7. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    1. говна у меня тут нет
    2. DELETE удаляет номер ICQ из базы данных

    Добавлено спустя 35 секунд:
    ваш var_dump($datenorm) вот что выдал string(17) "23.11.2014 год"

    Добавлено спустя 7 минут 28 секунд:
    var_dump подставил под 2 переменные if (var_dump($data) >= var_dump($datenorm)) {
    выдало string(10) "20.11.2014" string(17) "23.11.2014 год" - ну почему то 20 числа происходит удаления
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    а откуда взялось значение $datenorm ?

    Добавлено спустя 3 минуты 41 секунду:
    впрочем неважно. попробуй сделать var_dump(strtotime($datenorm)) , и там же var_dump(strtotime($data))
    теперь ты должен понять почему условие if не работает
     
  9. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    $datenorm она выводит значени из бд, в бд таблице строка record_date

    Добавлено спустя 4 минуты 53 секунды:
    ого не ожидал вывело int(1416427200) bool(false)
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    это называется "отладка" ))) всегда так делай чтобы ОГО случалось пореже. в моей подписи есть хорошая ссылка про это.

    строка "23.11.2014 год" это не дата! функция strtotime() пытается из строки получить дату, но с твоей строкой она не справляется — получается значение false. это причина твоей ошибки в if()


    для хранения даты в MYSQL есть специальные типы данных. например тип DATE. а для даты+время есть DATETIME и TIMESTAMP.
    все эти типы выводят дату в формате ISO, как '2014-11-23' и такие значения отлично читаются strtotime()
     
  11. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    исправил теперь выдает int(1416427200) int(1416686400)

    ну опять удаляет 20 числа, хотя должно 23 удалить

    Добавлено спустя 5 минут 16 секунд:
    тип ставил DATA все равно удаляет 20 числа, хотя должен удалить 23, а вообще я люблю для даты использовать тип varchar
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    дату надо хранить как дату и сравнивать как дату, а не как строку. это так просто )))
    смотри результаты и делай выводы. у тебя два целых числа. какое из них больше? как сработает сравнение в if () ?

    машина не ошибается, это ты можешь давать ей неправильные команды.
     
  13. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    большее число получается $datenorm оно 23 число, а $data 20 число

    Добавлено спустя 36 секунд:
    получается ведь верная функция? if (strtotime($data) >= strtotime($datenorm)) {
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    if это не функция, а условный оператор. выглядит нормально. если исходные данные нормальные, условие будет срабатывать правильно.

    еще раз, пожалуйста, непосредственно перед if:
    Код (PHP):
    1. var_dump($data); var_dump($datenorm);
    2. var_dump(strtotime($data)); var_dump(strtotime($datenorm)); 
     
  15. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    ой точно if это условный оператор, что то я туплю чуть под вечер.... щас ваш код вставлю проверю
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    вместо строки с DELETE временно поставь die('bingo!'); чтобы точно знать что условие сработало СЕЙЧАС, а не когда-то в прошлые разы.
     
  17. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    получается вставить выше оператора if?
    var_dump($data); var_dump($datenorm);
    var_dump(strtotime($data)); var_dump(strtotime($datenorm));
    if (strtotime($datenorm) > strtotime("3 day")){

    Добавлено спустя 1 минуту 10 секунд:
    так?

    Код (Text):
    1. // Удаление номера
    2. $data = date('d.m.Y'); // дата системная
    3. $datenorm=$row['record_date']; // дата в бд
    4.  
    5.  
    6. if (var_dump(strtotime($data)) >= var_dump(strtotime($datenorm))) {
    7. die('bingo!');
    8. }
    9. _________________________________
    10. var_dump($data); var_dump($datenorm);
    11. var_dump(strtotime($data)); var_dump(strtotime($datenorm));
    12. _________________________________
    13. if (strtotime($datenorm) > strtotime("3 day")){
    14. echo "<td class='p'><center>".$datenorm."</center></tr>";
    15. }else{
    16. $s=skin_tt('Ваш Номер ICQ -'.'<b>'.$t.'</b>'.' удалиться в течении 3-х дней поэтому распечатайте ваши номера');
    17. echo "<td class='tp'><center>".$datenorm."".$s."</center></td>";
    18. }
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    откуда это: if (strtotime($datenorm) > strtotime("3 day")) ???
    было какое-то другое условие ))))
     
  19. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    так вывело

    int(1416513600) int(1416772800) bingo!

    Добавлено спустя 1 минуту 33 секунды:
    это ниже идет, да ссори тут щас этот if не нужен, я понял как вставить так будет

    Код (Text):
    1. // Удаление номера
    2. $data = date('d.m.Y'); // дата системная
    3. $datenorm=$row['record_date']; // дата в бд
    4.  
    5. var_dump($data); var_dump($datenorm);
    6. var_dump(strtotime($data)); var_dump(strtotime($datenorm));
    7.  
    8. if (var_dump(strtotime($data)) >= var_dump(strtotime($datenorm))) {
    9. die('bingo!');
    10. }
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    спасибо поржал. ты шалунишка.

    вот это говно
    Код (PHP):
    1. if (var_dump(strtotime($data)) >= var_dump(strtotime($datenorm))) {
    2. die('bingo!');
    3. } 
    исправь на
    Код (PHP):
    1. var_dump($data); var_dump($datenorm);
    2. var_dump(strtotime($data)); var_dump(strtotime($datenorm)); 
    3.  
    4. if (strtotime($data) >= strtotime($datenorm)) {
    5.   die('bingo!');
    6. } 
    я тебя не просил var_dump() ставить внутрь условия ))) пипец!

    и больше никаких var_dump() нигде не ставь, ок?
     
  21. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    вывело вот это

    string(10) "21.11.2014" string(10) "24.11.2014" int(1416513600) int(1416772800) int(1416513600) int(1416772800) bingo!

    Добавлено спустя 1 минуту 16 секунд:
    ps даты поменялись потому что пришлось по новой номер добавить так как изначальный удалился
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    убери var_dump из условия!!!!!
     
  23. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    убрал, ссори) выдало вот это
    string(10) "21.11.2014" string(10) "24.11.2014" int(1416513600) int(1416772800)

    Добавлено спустя 1 минуту 37 секунд:
    Код (Text):
    1. // Удаление номера
    2. $data = date('d.m.Y'); // дата системная
    3. $datenorm=$row['record_date']; // дата в бд
    4.  
    5. var_dump($data); var_dump($datenorm);
    6. var_dump(strtotime($data)); var_dump(strtotime($datenorm));
    7.  
    8. if (strtotime($data) >= strtotime($datenorm)) {
    9.   die('bingo!');
    10. }
    так добавил))) как вы написали)
     
  24. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    вот. строка 'bingo!' не вывелась, значит условие не сработало, потому что 21е число меньше 24го. теперь можешь возвращать на место свой DELETE и удалить все var_dump().

    на будущее: сделай дату в базе с типом DATE, тогда var_dump($datenorm) будет выглядеть как (string) 2014-11-24
    аналогично когда тебе захочется получить дату из строки, пиши strtotime('2014-11-21') ок? это стандарт.

    Добавлено спустя 1 минуту 33 секунды:
    а вообще дата "сегодня" получается как strtotime('today')
    а дата+время "сейчас" получается как time()
     
  25. wolf777

    wolf777 Новичок

    С нами с:
    26 авг 2014
    Сообщения:
    207
    Симпатии:
    0
    хорошо, просто читать не удобно так 2014-11-21 тем более дата выводится на сайт((((
    щас кстате проверю все ж удалится или нет))) интересно ведь :=)

    Добавлено спустя 2 минуты 18 секунд:
    вернул все на место
    Код (Text):
    1.  
    2. // Удаление номера
    3. $data = date('d.m.Y'); // дата системная
    4. $datenorm=$row['record_date']; // дата в бд
    5.  
    6. if (strtotime($datenorm) >= strtotime($data)) {
    7. $result=mysql_query("DELETE FROM `".prefix."shinfo` WHERE user='".$USER->id."' and `icq`='".$t."'");
    8. }
    и опять удалилось, странно