PHP, MySQL - вопросы
6039
7
Продолжаю по мере свободного времени изучать основы.
На данный момент у меня возник вопрос по корректному отображению даты из MySQL.
Дано: Таблица со столбцом "timestamp", в котором отображается дата и время, в часовом поясе, который установлен на сервере (если я правильно понимаю) и имеет вид 2013-02-06 18:23:34, например.
Необходимо: выводить данные в формате date("d.m.Y H:i"); и нужном часовом поясе.

Вечером попробовал сделать сам, не получилось :хммм:
Имею код:

<?php
date_default_timezone_set('Asia/Novosibirsk');

$dbc = mysqli_connect('localhost', 'user', 'pass', 'host_db')
or die('Ошибка соединения с MySQL сервером.');
mysqli_set_charset($dbc, "utf8");

$query = "SELECT * FROM table";
$result = mysqli_query($dbc, $query)
or die('Невозможно выполнить запрос к базе данных.');

while($row = mysqli_fetch_array($result)) {
echo $row['date_time'] . '<br />'; //Здесь выводится время в том же формате и часовом поясе, что и в базе
}

mysqli_close($dbc);

echo '<br />' . date("d.m.Y H:i"); //Здесь выводится корректное время Новосибирска в нужно формате

?>


Пробовал писать date("d.m.Y H:i", $row['date_time']), формат получается нормальный, но дата и время что то около 70-го года.

Подскажите, пожалуйста еще варианты которые можно попробовать? :dnknow:
Alexander_
Таблица со столбцом "timestamp", в котором отображается дата и время, в часовом поясе, который установлен на сервере
первое.

в данном случае таймзона-на-сервере - это та таймзона, которая указана в конфиге mysql, или, которая была при старте mysql (если в конфиге не определена). ваш вызов "date_default_timezone_set('Asia/Novosibirsk');" для php бесполезен.

вообще, самое простое решение - храните дату/время в UTC, и UTC поставте таймзону mysql. и внутри приложения уже переводите с помощью средств php дату из UTC в нужную таймзону. помните, что ваше возвернутое из недр mysql поле с датой / временем - обычная строка текста для php

второе.
вам нужна скорее всего вот эта функция - http://www.php.net/manual/ru/function.strftime.php
Alexander_
Не мучай пыхапу.

SELECT FROM_UNIXTIME('date_time');
или
SELECT FROM_UNIXTIME('date_time','%Y %D %M %h:%i:%s');

если надо зону поставить, то перед запросом еще выполни
SET time_zone = 'Asia/Novosibirsk';
Alexander_
Пока получилось только вывести дату в нужном мне формате.

while($row = mysqli_fetch_array($result)) {
$time = date("d.m.Y H:i", strtotime($row['date_time']));
echo 'Дата:' . $time . '<br />';
}


С функциями которые Вы посоветовали, я конечно попробую разобраться, но пока ничего не понятно :улыб:

Я пока не пойму саму логику того, как сделать, чтобы отображалось мое локальное время, а не то, которое установлено в конфиге MySQL.
Alexander_
Возник вопрос, насколько оправдано в данный момент использовать подобные проверки отправленных данных

$name = mysqli_real_escape_string($dbc, trim($_POST['name']));
$score = mysqli_real_escape_string($dbc, trim($_POST['score']));
$screenshot = mysqli_real_escape_string($dbc, trim($_FILES['screenshot']['name']));


Иными словами, на данный момент существует уязвимости с помощью которых можно передать через текстовые поля в MySQL? Или в подобных проверках нет необходимости?
Alexander_
Пользуйте PDO и не грейте себе голову. Данные методы ни от каких "уязвимостей" не избавляют... была статья на Хабре, пошукайте.
Alexander_
Из документации:


<?php
/* Выполнение запроса с привязкой PHP переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
IEEE
Я пока не пойму саму логику того, как сделать, чтобы отображалось мое локальное время, а не то, которое установлено в конфиге MySQL.
Таймзона установлена в php.ini?