MySQL DATETIME показывает правильную дату, но неправильное время (всегда полночь) в одной таблице, но не в другой таблице?

#php #mysql #date #phpmyadmin

#php #mysql #Дата #phpmyadmin

Вопрос:

Я использую MySQL DATETIME для установки даты и времени в двух разных таблицах базы данных (с помощью PHP). Один из этих экземпляров находится в users таблице и регистрирует время регистрации учетной записи пользователя и время последнего входа в систему. Другое использование находится в отдельной messages таблице (в той же базе данных), которая регистрируется, когда пользователь отправляет сообщение другому пользователю.

Хотя код MySQL DATETIME одинаков в каждой таблице, в messages таблице он записывает дату, но время отправки сообщения всегда ровно в полночь, например 2021-12-06 00:00:00

В phpMyAdmin , который я использую DATETIME , нет значения по умолчанию и нет null в обеих таблицах.

Инструкции, подготовленные PHP для каждого использования, приведены ниже. Как вы можете видеть, там, где необходимы данные и время, я использую эту current_date функцию.

ПРИМЕР 1 users таблица (время правильно записано в базе данных). Примечание: некоторые переменные, такие как fname , взяты из элементов формы. Я не включил код формы, чтобы упростить код.

 $passwordHash = password_hash($pword, PASSWORD_DEFAULT);  $sql = "INSERT INTO lj_users   (firstname, lastname, email, username, password,   date_registered, last_login, active, profile_image,   permissions)   VALUES (:firstname, :lastname, :email, :username, :password,   current_date, current_date, 0, '',   'standard' )";  $stmt = $connection-gt;prepare($sql);  $stmt-gt;bindParam(':firstname', $fname); $stmt-gt;bindParam(':lastname', $lname); $stmt-gt;bindParam(':email', $email); $stmt-gt;bindParam(':username', $uname); $stmt-gt;bindParam(':password', $passwordHash);  $stmt-gt;execute();   

ПРИМЕР 2 (время НЕПРАВИЛЬНО записано в базе данных)

 $message_sql = "INSERT INTO lj_messages   (message_title, message_body, dm_recipient_id,   dm_sender_id, message_date)   VALUES (:message_title, :message_body, :dm_recipient_id,   :dm_sender_id, current_date )";  $stmt = $connection-gt;prepare($message_sql);  $stmt-gt;bindParam(':message_title', $dm_title); $stmt-gt;bindParam(':message_body', $dm_body); $stmt-gt;bindParam(':dm_recipient_id', $dm_recipient_id); $stmt-gt;bindParam(':dm_sender_id', $dm_sender_id); $stmt-gt;execute();  

Я абсолютно не представляю, почему это происходит.

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

1. Потому current_date что это именно так: свидание. Почему это работает на другом столе, я не мог сказать. Если вам нужна дата-время, используйте now() вместо этого.

2. @aynber — спасибо, что разобрались с проблемой в messages таблице. Однако почему current_date работает страница регистрации в таблице пользователей? Я этого не понимаю?

3. Это date_registered and last_login тип ДАТЫ, а не ДАТА-ВРЕМЯ

4. @RiggsFolly нет, это тип ДАТЫ и времени во всех случаях

5. Дважды проверьте show create table `messages` и посмотрите , есть ли в этих полях значение по умолчанию.

Ответ №1:

current_date возвращает только дату:

 mysqlgt; select current_date;   --------------   | current_date |   --------------   | 2021-12-07 |   --------------   

Вы хотите now() , что возвращает дату и время.

 mysqlgt; select now();  ---------------------  | now() |  ---------------------  | 2021-12-07 09:33:40 |  ---------------------