#php #mysql #datetime #strtotime
#php #mysql #дата и время #strtotime
Вопрос:
Почему «strtotime ()» по-прежнему отображает дату и время, даже если таблица базы данных имеет значение null?
и как не отображать «strtotime», если таблица базы данных имеет значение null?
SQL:
CREATE TABLE logtrail(
login_id INT(100) PRIMARY KEY AUTO_INCREMENT,
admin_id INT(100),
first_name VARCHAR(100),
last_name VARCHAR(100),
dateandtime_login DATETIME DEFAULT CURRENT_TIMESTAMP,
dateandtime_logout DATETIME
);
PHP-код для отображения:
<?php
$sql1 = "SELECT * FROM logtrail ORDER BY login_id DESC";
$result1 = mysqli_query($conn, $sql1);
$logtrail = mysqli_num_rows($result1);
if($logtrail > 0 ){
while($row = mysqli_fetch_assoc($result1) ) {
$dateandtime_login = strtotime($row['dateandtime_login']);
$dateandtime_logout = strtotime($row['dateandtime_logout']);
?>
<tr>
<td><?php echo $row['login_id'] ?></td>
<td><?php echo $row['admin_id'] ?></td>
<td><?php echo $row['first_name'], $row['last_name'] ?></td>
<td><?php echo date('F d Y', $dateandtime_login) ?></td>
<td><?php echo date('h:i A', $dateandtime_login) ?></td>
<td><?php echo date('h:i A', $dateandtime_logout) ?></td>
</tr>
<?php }} ?>
Ответ №1:
Проверьте, являются ли значения, возвращаемые из базы данных, пустыми. В противном случае функция даты вернет стандартную дату (31 декабря 1969 года).
Пример:
echo ($dateandtime_login != null ? date('F d Y', $dateandtime_login) : false);
Ответ №2:
Есть много способов, которыми вы можете это сделать. Что вам нужно сделать, это проверить, равно ли значение null, и предоставить пустую строку по умолчанию.
Взгляните на два способа, которыми я это сделал. Первый использует if
оператор, а второй использует троичный оператор. Значения подготавливаются перед отображением. Я настоятельно рекомендую никогда не смешивать логику представления и базы данных. Держите их отдельно. Для простоты я не разделил их в приведенном ниже примере.
$sql1 = "SELECT * FROM logtrail ORDER BY login_id DESC";
$result1 = mysqli_query($conn, $sql1);
foreach ($result1 as $row):
if ($row['dateandtime_login']) {
$dt = new DateTime($row['dateandtime_login']);
$row['date_login'] = $dt->format('F d Y');
$row['time_login'] = $dt->format('h:i A');
} else {
$row['date_login'] = '';
$row['time_login'] = '';
}
$row['dateandtime_logout'] = $row['dateandtime_logout'] ? (new DateTime($row['dateandtime_logout']))->format('h:i A') : '';
?>
<tr>
<td><?php echo $row['login_id'] ?></td>
<td><?php echo $row['admin_id'] ?></td>
<td><?php echo $row['first_name'], $row['last_name'] ?></td>
<td><?php echo $row['date_login'] ?></td>
<td><?php echo $row['time_login'] ?></td>
<td><?php echo $row['dateandtime_logout'] ?></td>
</tr>
<?php
endforeach;
Комментарии:
1. Я не считаю правильным использовать класс DateTime в этом коде. Форматирование желаемой даты здесь. Для этого мы должны использовать функции форматирования, не включая целый класс. Я использую класс DateTime в основном с методом modify, чтобы сделать код более читаемым.
2. @sercanarga я не понимаю, что вы имеете в виду.
DateTime
класс заменилstrtotime
иdate
. Какая возможная причина может быть для использования более ограниченной функциональности? Я не чувствую себя вправе предлагать в своих ответах старые функции, если только это не для чего-то действительно тривиального. В этом случае я считаюDateTime
, что class — лучший выбор.3. Производительность. Для этого кода нет необходимости создавать целый класс.
4. Я не думаю, что разница в производительности будет достаточно большой, чтобы ее можно было заметить, если она вообще есть. Я считаю, что преимущества перевешивают любые потенциальные и крошечные затраты на производительность