как использовать strotime для обновления метки времени mysql unix

#php #mysql #unix

#php #mysql #unix

Вопрос:

 date_default_timezone_set('America/Los_Angeles'); 
$insert = "INSERT INTO sql(name, time, time_end) VALUES ('".$name."', '". strtotime('now')."', '". strtotime(' 2 days')."') ;";
    mysqli_query($conn, $insert);
  

Вставить запрос для обработки данных из формы и отображения времени в формате PST

 dispay.php

name             started at                    ending at 

test            March 7, 2019, 3:41 pm        March 10, 2019, 3:41 pm

stack           March 8, 2019, 6:53 am        March 9, 2019, 6:53 pm 
  

Итак, у меня есть радиокнопки в форме, чтобы выбрать продолжительность часов для добавления, а затем отправить..
Добавлено 72 часа для тестирования и 24 часа для стекирования

Если мне нужно обновить time_end, я не знаю, как именно использовать strtotime в запросе обновления, поэтому я попытался добавить секунды непосредственно к нему, используя этот запрос

 $update = "UPDATE table SET
    time_end = time_end   252900
    where name = 'test' ;";
    mysqli_query($conn, $update);
  

Затем он отобразит

 dispay.php

name             started at                    ending at 

test            March 7, 2019, 3:41 pm        March 13, 2019, 4:41 pm

stack           March 8, 2019, 6:53 am        March 9, 2019, 6:53 pm 
  

Проблема в том, что это добавляет дополнительный час, когда я использую запрос update таким образом, а не при использовании запроса insert. Пожалуйста, скажите мне, как это исправить

Комментарии:

1. Что это значит, что он не отображает время точно? Приведите нам несколько примеров. Каковы ваши ожидания, какие значения вы получаете. Какое отношение к этому имеет база данных? Если вы храните целые числа, то схема БД не должна иметь значения. Как преобразовать временную метку в PST?

2. Объяснено в edit @Dharman

3. Это связано с тем, что Калифорния перейдет на летнее время в воскресенье, 10 марта, в 02:00

4. ПРЕДУПРЕЖДЕНИЕ : При использовании mysqli вы должны использовать параметризованные запросы и bind_param добавлять любые данные в свой запрос. НЕ используйте интерполяцию строк или конкатенацию для выполнения этого, потому что вы создали серьезную ошибку SQL-инъекции . НИКОГДА не помещайте $_POST , $_GET или данные любого вида непосредственно в запрос, это может быть очень вредным, если кто-то попытается воспользоваться вашей ошибкой.

5. Примечание: Объектно-ориентированный интерфейс к mysqli значительно менее подробный, что упрощает чтение кода и аудит, и его нелегко спутать с устаревшим mysql_query интерфейсом. Прежде чем вы слишком увлекетесь процедурным стилем, стоит переключиться. Пример: $db = new mysqli(…) и $db->prepare("…") процедурный интерфейс — это артефакт эпохи PHP 4, когда был представлен mysqli API, и в идеале его не следует использовать в новом коде.

Ответ №1:

Время можно почти идеально посчитать в последовательных секундах. т.е. прошло 1,2,3,4 секунды и так далее.
Это именно то, что представляет собой временная метка unix; это количество секунд, прошедших с определенного момента времени, который является эпохой UNIX. Поскольку это количество прошедших секунд, оно может быть выражено как целое число.
Однако наши календари и часы не отсчитывают время последовательно по прямой. Время и даты — очень сложные и относительные понятия. В один момент это может быть 1.59 утра, а буквально в следующую секунду это будет 3.00 утра. Еще через шесть месяцев после этого вы дважды переживаете один и тот же час.
Это иллюстрируется моим примером в PHP здесь.

В вашем примере вы пропускаете час на часах, но ваше количество секунд не учитывало эту разницу. Один из простых способов сделать это может быть следующим:

 $start = 1552211999;
$dt = new DateTime('@'.$start);
$dt->setTimezone(new DateTimeZone('America/Los_Angeles'));
$dt->modify(' 1 day');
  

Попробуйте онлайн на Ideone

Ответ №2:

Вы должны использовать mysqli_ подготовленные инструкции, чтобы избежать уязвимостей при внедрении sql.

Но вот UPDATE запрос, который должен сработать;

https://www.db-fiddle.com/f/4AH8mJyogLMeruseABPhiD/0

 $insert = "INSERT INTO sql(name, time, time_end) 
           VALUES ( ? , NOW() , NOW()   INTERVAL 2 DAY)";

$update = "UPDATE sql SET
                  time_end = time_end   INTERVAL 2 DAY
           WHERRE name = ? ";
  

Вы можете использовать этот запрос для подготовленной инструкции следующим образом:

 $stmt = mysqli_prepare($conn, $insert); 
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $name);
/* execute query */
mysqli_stmt_execute($stmt);
  

Комментарии:

1. Я не думаю, что ИНТЕРВАЛ MySQL будет работать с целыми числами. Вам нужно было бы преобразовать ее в исходные данные, а затем снова в int.

2. @Dharman у вас есть схема таблицы? откуда вы знаете type? Я бы ожидал, что это будет datetime, а не целое число

3. Да, этот запрос на обновление тоже не работает. У меня установлено значение time_end с типом INT, должен ли я изменить что-то еще для работы?

4. Да, OP опубликовал в исходном вопросе, что поля являются целыми числами. С тех пор он удалил это замечание.

5. @influence Алекс прав. Хотя он не объяснил вашу проблему, как я, он прав в том, что вы должны хранить время и дату в собственных форматах MySQL. Затем вы можете использовать встроенные функции SQL для простого выполнения таких операций.