неверный запрос времени в таблице sql из-за разного количества цифр - PullRequest
1 голос
/ 02 марта 2012

Надеюсь, у вас есть время, чтобы старая собака (71 год) научилась новым трюкам.У меня есть около недели опыта работы с PHP и mysql, но я получаю удовольствие, изучая, как это работает, и я добился определенного прогресса.Но у меня есть проблема запроса / логики / синтаксиса, и я хотел бы получить некоторую информацию, если вы не будете слишком сильно смеяться над моими извилинами.

У меня есть программа-календарь, которая не может вывести напоминаниякак я хочу их.Я думал, что попробую разобраться в этом ради забавы, но я не могу изменить содержимое таблицы, чтобы не испортить всю программу.Я преуспел в том, чтобы заставить его делать то, что я хотел: отправлять все свои напоминания за один день в одном письме, просто взяв записи таблицы «время», отсортировав их и отфильтровав в то, что я хотел.Но пару дней спустя я заметил, что любая запись, которая была до 17:00 моего времени (GMT -7), была в порядке, но любая после этого времени была мусором.Так что, присмотревшись к таблице, я заметил, что в любое время после 23:59 по Гринвичу было 5 цифр, а до этого - 6 цифр.Итак, я нашел проблему.Я решил, что все, что мне нужно было сделать, это поместить IF в середину и соответственно добавить дополнительные цифры, изменить его на время эпохи UNIX с помощью strtotime, а затем выполнить date () и использовать только часы и минуты.Ты уже смеешься?Позвольте мне повторить, я очень мало знаю о PHP и MySQL, но я учусь, и это делает меня счастливым и, возможно, немного моложе.

Вот что у меня есть.Я отправлю запрос только потому, что подключение к БД и отправка почты работает нормально.Этот первый работает ... за исключением проблемы, упомянутой ранее ...

date_default_timezone_set('America/Denver');
$today = date("Ymd");
mysql_select_db($dbname);
$query = sprintf("SELECT cal_name, cal_time, cal_description, cal_date FROM webcal_entry WHERE cal_date = '".$today."'");
$result = mysql_query($query);
$body = '';
$mail = '';
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    $mail = sprintf("Event: %s \nTime: %s \nDesc: %s \n\n", $row[0], date("H:i",((strtotime($row[1])-25200))), $row[2]);
}
mysql_free_result($result);

Это сумасшедшее исправление, в котором действительно чего-то не хватает ...

date_default_timezone_set('America/Denver');
$today = date("Ymd");
mysql_select_db($dbname);
$query = sprintf("SELECT cal_name, cal_time, cal_description, cal_date FROM webcal_entry WHERE cal_date = '".$today."'");
$result = mysql_query($query);
$body = '';
$mail = '';
$stt = '';
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    $mail = sprintf("Event: %s \nTime: %s \nDesc: %s \n\n", $row[0], ($stt = { if ($row[1] < 100000, + 1234500000) ELSE ($row[1] + 1234000000) }) date("H:i",((strtotime($stt)-25200))), $row[2])
};

Надеюсь, одноиз вас хочет взять это и пошутить над старым парнем ... и перестать смеяться!

1 Ответ

1 голос
/ 02 марта 2012

Попробуйте следующее.Я добавил комментарии для более легкого понимания:

/* I assume that the times and dates in your database are stored in UTC, 
     so set the UTC timezone first. */
date_default_timezone_set('UTC');

/* $today might now contain a value of tomorrow if it's past 17:00 in your timezone.
     This is required though, as there could be an event at e.g. 18:00 of your time which would
     not be returned otherwise. sprintf is not needed, as you don't format anyting here */
$today = date("Ymd");
$query = "SELECT cal_name, cal_time, cal_description, cal_date FROM webcal_entry WHERE cal_date = " . $today;

mysql_select_db($dbname);
$result = mysql_query($query);

$body = '';
$mail = '';

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    // Store the value of the returned time in a $fixedTime
    $fixedTime = $row[1];

    /* Simple approach: While the length of the time is less than 6 digits, prepend a leading 0
         This will even work for times like 00:00:15 */
    while (strlen($fixedTime) < 6)
        $fixedTime = '0' . $fixedTime;

    // Now store the unix timestamp (still in UTC!)
    $unixEpoch = strtotime($fixedTime);

    // Set the timezone to your local time ...
    date_default_timezone_set('America/Denver');

    // ... and $formattedTime receives the formatted time value in your timezone
    $formattedTime = date("H:i", $unixEpoch);

    // Now create the mail content
$mail .= sprintf("Event: %s \nTime: %s \nDesc: %s \n\n", $row[0], $formattedTime, $row[2]);
}

mysql_free_result($result);

Столбцы базы данных, содержащие значения времени и даты, должны быть объявлены как DATE, TIME или DATETIME.
Это значительно упростит ситуацию, поскольку MySQL может обрабатывать как преобразование часового пояса, так и форматирование даты / времени.

...