За последние 24 часа нас посетили 17363 программиста и 1722 робота. Сейчас ищут 1488 программистов ...

Регистрация пользователей помощь с логикой

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 16 ноя 2017.

  1. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    т.е. ты имеешь ввиду что запись в БД лежит лежит, прошло время, она там сама удалилась. Хз, по моему такого не бывает. Для таких вещей что-то слышал про handler или триггер. Ну т.е. на таблицу вешается триггер, и по определенному событию он срабатывает и делает DELETE | UPDATE | INSERT /* могу путаться в терминах */
    и еще момент, удалять запись из таблицы плохая практика. Если со временем запись перестанет быть нужна, на нее лучше повесить какой-нибудь флаг, чтобы она перестала выводиться.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Можно. С типами datetime, timestamp можно делать операции сравнения. Т.е. где-нибудь в начале скрипта делаешь запрос к БД
    PHP:
    1. $time = date("Y-m-d H:i:s", strtotime("5 minutes ago")); $db->query("delete from table where time_column < '$time'");
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    классно, хорошо объяснил а если я использую для вычисления времени int поле в базе данных, не пойдет для вычисления?
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну int тем более можно сравнивать :) Хотя время должно храниться как время, а не как число. Но, если тип int, то просто не нужен вызов date. Посмотри, что возвращает strtotime
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Я тебя не понял, мне запрос сделать что ли? Если просто через var_dump(strtotime($timePoleBase)); то выводит false. Подставил поле время int из базы.
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    strtotime возвращает int. Ты реально не можешь в доку зайти и прочитать?
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    PHP:
    1. echo strtotime("now"), "\n";
    2. echo strtotime("10 September 2000"), "\n";
    3. echo strtotime("+1 day"), "\n";
    4. echo strtotime("+1 week"), "\n";
    5. echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
    6. echo strtotime("next Thursday"), "\n";
    7. echo strtotime("last Monday"), "\n";
    Мануал в моем браузере !
    Ты все время комментируешь в х*ю сторону. Мне не нравится так, можно было бы ставить палец вниз поставил бы :mad:
    Я не помню когда ты положительный ответ мне ставил.
     

    Вложения:

    • 111.png
      111.png
      Размер файла:
      8,8 КБ
      Просмотров:
      4
    #32 _ne_scaju_, 19 ноя 2017
    Последнее редактирование: 19 ноя 2017
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну так начинай соображать. Если у тебя время хранится в int, значит там unix-метка. strtotime возвращает unix-метку. Одну unix-метку можно сравнить с другой unix-меткой. Значит из кода, который я привёл, достаточно убрать date, оставить один strtotime. И обязательно надо, чтоб так разжёвано всё было? А мануалы надо читать, те, что русским языком написаны.
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Лучше лишний раз похвалить чем сразу рога наставлять, я читаю мануал когда вижу не понятную функцию. А пока мне все было понятно в твоем примере. Можно его использовать даже без крона?
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Можно и без крона, да. Просто на инициализацию приложения. Он не должен замедлить загрузку. Понятно было не всё, иначе не спросил бы такое:
    После прочтения мануала по strtotime передавать в неё timestamp в виде целого числа в голову приходить не должно
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer;) согласен ;) завтра попробую сегодня время спать уже!
     
  12. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Вот сылка на юпуп
    Тебе обязательно надо посмотреть хотя бы 4 лекции, там почти все ответы на твои вопросы.

    @mkramer предлагает тебе сделать новый запрос к БД, можно и так, но смысл, если это простой сайт одно, а если у тебя высоконагруженная база? если 1 000 000 записей и 1 000 пользователей в час?? 1000 бесполезных запросов к базе в час? плохая логика, если ты хочешь быть хорошим разработчиком, надо делать четко, продумывать логику заранее, а не ждать когда система упадет, а потом переделывать.

    Мне кажется это плохой вариант, и сама логика... int? скажи, нахрена хранить дату в int??
    Опиши саму логику, зачем удалять запись из БД, только пошагово опиши, как ты пишешь скрипт.
     
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @karmay
    Затем чтобы база не засорялась ссылками восстановления пароля.
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @karmay, это же не какой-нибудь тяжёлый запрос, этот delete займёт не больше времени, чем предлагаемая тобой установка флага, который конкретно в данном случае не нужен. По поводу int для времени - мне тоже не нравится, согласен. В базе уже есть хорошие типы для времени
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    я все время тренировался с int а timestamp обходил стороной.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Ок если я выбираю тип timestamp нужно ли всегда указывать что по умолчанию будет использоваться CURRENT_TIMESTAMP или это не всегда нужно?
    И если я проверку времени делал так с иcпользованием int:
    PHP:
    1.  $infoList = $checkIdKey -> fetch(); //Вытащили данные из запроса SELECT
    2.  
    3. # Расчет времени для проверки не прошло ли время
    4. $send_unix_date = $infoList['time_activation']; # время из базы
    5. $time = $_SERVER['REQUEST_TIME']; # получаем время начала запроса веб-страницы
    6. $activation_period = 3600; # время на активацию 1 час
    7. $difference = floor(($time - $send_unix_date) / $activation_period);
    8.  
    9. # если время из базы не превышает период показываю форму иначе удаляем запись и делаем редирект
    10. if(!$difference)
    11. {
    12. echo 'все ок'; //показываем форму
    13. }else{
    14. echo 'time out'; //удалить запись //перенаправить пользователя
    15. }
    а как же проверить с использованием timestamp? Что бы я с уверенностью мог перейти на него и пользоваться им!!!
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Хорошо почему лучше использовать именно этот тип для базы а не int, по удобству чтения согласен видно реальную дату и время.
    По весу не знаю что тяжелей по оптимизации тоже не знаю. Приведи пару аргументов.
    --- Добавлено ---
    Правильно ли собираюсь хранить дату и время пишу в базе так как на скриншоте:
     

    Вложения:

  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Я уже привёл - можно использовать родные функции mysql для работы со временем, организации выборок. Потом, если будет индексация по этому полю, то, возможно, если mysql будет точно знать, что это - время, а не просто целое число, он сможет организовать индекс более эффективно. Возможно, в будущем изменит формат хранения (внутренний) так, чтоб не было проблемы 2035-го (если я не ошибаюсь) года.

    И опять вопрос - правильно/неправильно. Под задачу. Вот ты там на скрине ставишь, чтоб при обновлении записывался current_timestamp. Я не знаю твоей задачи, нужно тебе это или нет.
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я строку эту обновляю, если он повторно оправляет данные с ссылочкой.
     
  22. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну значит в твоём случае уместно. Всё зависит от решаемой задачи. Сказать, что что-то в корне неправильно, можно лишь о какой-нибудь глупости, типа попытке передать целое число в strtotime
     
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Почему у меня в базу сохраняется дата на час вперед, хотя у меня время не такое?
    Такое поведение и в timestamp что в int сохраняю тоже самое на час вперед в базу сохраняется поле.
    Ах да и я решил работать чисто с int разницы нет в каком формате я храню дату, все ровно оно все будет преобразовываться из unix в нормальную дату.
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    С настройками часовых поясов что-то.
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mkramer
    Подскажи пожалуйста как исправить можно на компе проверил все правильно стоит и часовой пояс тоже правильный стоит.