я пытаюсь получить переменную даты и времени (пример: 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();
С точки зрения @TheImpaler, что означает «ровно год»? +365 дней? +1 год? +365,25 дней? Немного расплывчато.






Вы можете сделать это в 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.
@tim странно, что у них есть эта заметка, когда 3 из их 7 примеров относятся к математическим операциям ... Я обновлю ответ, чтобы привести пример использования DateTime для изменения даты.
до сих пор я получил неопределенный индекс, поэтому я добавил: $stmt->bindValue(':expirationdate', isset($_SESSION['expirationdate']), PDO::PARAM_STR);
однако выполнение ответа, написанного на момент написания этого комментария, превращает мою дату истечения срока действия во все 0 (0000-00-00 00:00:00)
@JeremiahCanuto, это не сработает, так как даст пустое значение в запросе, что вызовет синтаксическую ошибку.
Какую версию ответа вы используете?
это просто странно, потому что я получаю дату истечения срока действия от $_SESSION, которая будет логином пользователя, она не должна быть пустой.
Возможно, вам нужно print_r($_SESSION) для отладки?
я не знаю, глупый ли это вопрос, откуда print_r($_SESSION) берет свой массив? это потому, что у меня, кажется, нет функции с тем же порядком, что и print_r
Устранимая фатальная ошибка: объект класса DateTime не может быть преобразован в строку
@JeremiahCanuto извините за это, я запутался, поместив два фрагмента кода в один. Я внес изменения в часть кода DateTime, которая это исправит.
Что произойдет, если дата 29 февраля?