Обновление значения sql datetime ровно на год

я пытаюсь получить переменную даты и времени (пример: 2019-02-10 03:13:33), чтобы обновить ровно год. я прочитал, что datetime записывается в виде строки, поэтому я попытался вычесть саму себя и добавить +365.

код работает, если я удалю все «expirationdate», включая значение привязки. также по какой-то причине я должен держать свои UPDATE в одинарных кавычках, потому что в моей базе данных нет изменений, если они находятся внутри двойных кавычек.

 $stmt = $db->prepare('UPDATE usr_customer_profile SET packageid = 3, expirationdate = .'$oneyear'. WHERE usrcustomerid = :usrcustomerid');
 $stmt->bindValue(':expirationdate', $_SESSION['expirationdate'], PDO::PARAM_STR);
 $stmt->bindValue(':usrcustomerid', $_SESSION['usrcustomerid'], PDO::PARAM_INT);
 $oneyear = (':expirationdate' - ':expirationdate') + 365;
 $stmt->execute();

Что произойдет, если дата 29 февраля?

The Impaler 23.01.2019 05:02

С точки зрения @TheImpaler, что означает «ровно год»? +365 дней? +1 год? +365,25 дней? Немного расплывчато.

Eric Brandt 23.01.2019 05:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это в PHP или SQL. В PHP вы можете использовать strtotime или (предпочтительно) класс DateTime, чтобы добавить один год к значению в $_SESSION['expirationdate']:

// using strtotime
$expirationdate = date('Y-m-d H:i:s', strtotime($_SESSION['expirationdate'] . ' + 1 year'));
// using DateTime
$expiration = new DateTime($_SESSION['expiration_date']);
$expiration->add(new DateInterval('P1Y'));
$expirationdate = $expiration->format('Y-m-d H:i:s');
// do the query
$stmt = $db->prepare('UPDATE usr_customer_profile
                      SET packageid = 3, 
                          expirationdate = :expirationdate 
                      WHERE usrcustomerid = :usrcustomerid');
$stmt->bindValue(':expirationdate', $expirationdate, PDO::PARAM_STR);
$stmt->bindValue(':usrcustomerid', $_SESSION['usrcustomerid'], PDO::PARAM_INT);
$oneyear = (':expirationdate' - ':expirationdate') + 365;
$stmt->execute();

В SQL используйте + INTERVAL 1 YEAR, чтобы добавить 1 год к дате истечения срока действия:

$stmt = $db->prepare('UPDATE usr_customer_profile
                      SET packageid = 3,
                          expirationdate = :expirationdate + INTERVAL 1 YEAR
                      WHERE usrcustomerid = :usrcustomerid');
$stmt->bindValue(':expirationdate', $_SESSION['expirationdate'], PDO::PARAM_STR);
$stmt->bindValue(':usrcustomerid', $_SESSION['usrcustomerid'], PDO::PARAM_INT);
$oneyear = (':expirationdate' - ':expirationdate') + 365;
$stmt->execute();

Примечание. Использование этой функции для математических операций не рекомендуется. Лучше использовать DateTime::add() и DateTime::sub() в PHP 5.3 и более поздних версиях или DateTime::modify() в PHP 5.2.

user10051234 23.01.2019 05:58

@tim странно, что у них есть эта заметка, когда 3 из их 7 примеров относятся к математическим операциям ... Я обновлю ответ, чтобы привести пример использования DateTime для изменения даты.

Nick 23.01.2019 06:30

до сих пор я получил неопределенный индекс, поэтому я добавил: $stmt->bindValue(':expirationdate', isset($_SESSION['expirationdate']), PDO::PARAM_STR);

Button Press 23.01.2019 06:35

однако выполнение ответа, написанного на момент написания этого комментария, превращает мою дату истечения срока действия во все 0 (0000-00-00 00:00:00)

Button Press 23.01.2019 06:36

@JeremiahCanuto, это не сработает, так как даст пустое значение в запросе, что вызовет синтаксическую ошибку.

Nick 23.01.2019 06:36

Какую версию ответа вы используете?

Nick 23.01.2019 06:37

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

Button Press 23.01.2019 06:39

Возможно, вам нужно print_r($_SESSION) для отладки?

Nick 23.01.2019 06:40

я не знаю, глупый ли это вопрос, откуда print_r($_SESSION) берет свой массив? это потому, что у меня, кажется, нет функции с тем же порядком, что и print_r

Button Press 23.01.2019 07:21
print_r — встроенная функция PHP.
Nick 23.01.2019 07:22

Устранимая фатальная ошибка: объект класса DateTime не может быть преобразован в строку

Button Press 23.01.2019 07:38

@JeremiahCanuto извините за это, я запутался, поместив два фрагмента кода в один. Я внес изменения в часть кода DateTime, которая это исправит.

Nick 23.01.2019 08:18

Другие вопросы по теме