#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');
Ответ №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 для простого выполнения таких операций.