Телегид, написанный на PHP - проблемы с datetime () и функциями базы данных - PullRequest
0 голосов
/ 09 января 2010

Я создаю ТВ-гид, в котором перечислены программы, которые появятся (и в некоторых списках, предыдущие выпуски из прошлого) со всеми данными, хранящимися в базе данных. Он работает на PHP, моя версия 5.28 (скоро обновление до 5.30 или 6).

Ниже приведен скрипт, который работает (обратите внимание, что поле airdate хранится в базе данных как DATETIME):

[Отказ от ответственности: скрипт не мой, а общий, который я скачал и изменил в соответствии со своими потребностями.]


<? //connect to mysql //change user and password to your mySQL name and password
mysql_connect("localhost","root","PASSWORD"); 
//select which database you want to edit
mysql_select_db("tvguide1"); 
//select the table
$result = mysql_query("select * from epdata3 order by airdate LIMIT 20;");
//grab all the content
while($r=mysql_fetch_array($result))
{ 
 //the format is $variable = $r["nameofmysqlcolumn"];
 //modify these to match your mysql table columns
$programme=$r["programme"];
$channel=$r["channel"];
#$airdate = strtotime($r['airdate']);
  $airdate = strtotime($r['airdate']);
  $now = strtotime("NOW");
 $currentYear = date("Y", $now);
$yearOfDateFromDatabase = date("Y", $airdate);
 if($yearOfDateFromDatabase == $currentYear)
$dateFormat = "F jS - g:ia"; // dateFormat = 24 December
else
$dateFormat = "F jS, Y - g:ia"; // dateFormat = 01 January 2010
$currentTime = date("g:ia", $airdate); // format of "Y" gives four digit year ie 
2009 not 09
$airdateFormatted = date($dateFormat, $airdate);
$sDate = date("F dS, Y - g:ia",$airdate);
$episode=$r["episode"];
$setreminder=$r["setreminder"];
echo "<tr><td><b>$programme</b></td><td>showing on $channel</td>";
echo "<td>$airdateFormatted</td><td>$episode</td><td>$setreminder</td></tr>";
}
?>

Здесь отображаются все готовящиеся эпизоды, а если они появятся в следующем году, они отображают их вместе с годом, например:

Телепередача, следующая на канале 1, 30 декабря 2009 г. - 18:00. «Эпизод 1 - Фотосинтез». Напоминание
Телепередача, которая будет показана на канале 1 6 января - 14:45. «Эпизод 2 - За музыкой». Напоминание
Телепередача, которая будет показана на канале 1 с 7 января до 20:00. Напоминание о "Совершенных автомобильных преступлениях"

Однако я хотел бы удалить определенные записи по истечении определенного периода времени (но это должно быть задано где-то в сценарии, поскольку длины программ различаются), а не удалять их вручную из базы данных. , Некоторые программы длятся 30 минут, другие - 60 минут ... в основном это разные длины.

Я хотел бы, чтобы это было так (обратите внимание, что в первом листинге дата не отображается, поскольку она является текущей датой.): ​​

Телепередача будет показана на Первом канале в 18:00. «CCTV Cities - Wigan» - напоминание
Телевизионная программа, которая будет показана на Первом канале 9 января - 14:45. «Римская империя. История ее народа». Напоминание
Телепередача, следующая на канале 1, 10 января - 20:00. Напоминание о "100 знаменитостях в мире ужасов"

но я не знаю, как настроить это, чтобы сделать это с помощью PHP или функции date (). Он отлично работает с датами, и показывает их. У меня нет доступа к заданиям cron, так как они установлены на локальном хосте Apache в Windows Vista Home Edition.

Если бы кто-нибудь мог помочь мне понять это, это было бы очень ценно - вся помощь очень ценится.

Я не назвал это живым сайтом, так как он сейчас "в разработке", и я хочу как можно точнее все исправить.

Ответы [ 3 ]

1 голос
/ 09 января 2010

Ваш вопрос немного неясен, но я предполагаю, что вы спрашиваете, как вы можете выбрать только эпизоды из сегодняшнего или будущего и как отформатировать дату, чтобы, когда эпизод транслировался сегодня, показывать только дату.

Вот пересмотренная версия вашего кода, которая может обрабатывать оба из них:

<?php
//connect to mysql
mysql_connect("localhost","root","PASSWORD");
mysql_select_db("tvguide1"); 

// Select only results for today and future
$result = mysql_query("SELECT * FROM epdata3 WHERE airdate >= CURDATE() ORDER BY airdate ASC LIMIT 20;");

while($r = mysql_fetch_array($result)) { 

    $programme   = $r["programme"];
    $channel     = $r["channel"];
    $airdate     = strtotime($r['airdate']);
    $episode     = $r["episode"];
    $setreminder = $r["setreminder"];
    $now         = time();

    if(date('Y-m-d') == date('Y-m-d', $airdate)) {
        // Same date, show only time
        $dateFormat = 'g:ia';
    } elseif(date('Y') == date('Y', $airdate)) {
        // Same year, show date without year
        $dateFormat = 'F jS - g:ia';
    } else {
        // Other cases, show full date
        $dateFormat = 'F jS, Y - g:ia';
    }

    $airdateFormatted = date($dateFormat, $airdate);

    echo "<tr><td><b>$programme</b></td><td>showing on $channel</td>";
    echo "<td>$airdateFormatted</td><td>$episode</td><td>$setreminder</td></tr>";
}
?>
1 голос
/ 09 января 2010
function reldate ($time) {
    $now = time();
    $cmp_fmt = '%Y%m%d';
    if (strftime($cmp_fmt, $time) == strftime($cmp_fmt, $now)) {
        $out_fmt = '%I:%M %P';
    } else {
        $day = strftime('%e', $time);
        if (preg_match('/([^1]1|^1)$/', $day)) {
            $day_suffix = 'st';
        } elseif (preg_match('/([^1]2|^2)$/', $day)) {
            $day_suffix = 'nd';
        } elseif (preg_match('/([^1]3|^3)$/', $day)) {
            $day_suffix = 'rd';
        } else {
            $day_suffix = 'th';
        }
        $out_fmt = '%B %e' . $day_suffix . ' - %I:%M %P';
    }

    return strftime($out_fmt, $time);
}
1 голос
/ 09 января 2010

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

для перечисления будущих записей вместо этого:

$result = mysql_query("select * from epdata3 order by airdate LIMIT 20;");

Я бы предложил что-то вроде этого:

$result = mysql_query("select * from epdata3 WHERE airdate > '$today' ORDER BY airdate LIMIT 20;");

Для страницы со списком концертов, которую я много лет назад также добавил алгоритм удаления, боясь, что БД может заполниться, но потом пожалел об этом ...

...