2010-01-08 1 views
0

Я создаю телегид, в котором перечислены программы, которые появляются (и в некоторых списках, предыдущие эфиры из прошлого), со всеми данными, хранящимися в базе данных. Он работает в PHP, моя версия - 5,28 (до 5:30 или 6 скоро).ТВ-гид, написанный на PHP - проблемы с функциями datetime() и базы данных

Ниже приведен скрипт, который работает (обратите внимание на поле 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>"; 
} 
?> 

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

ТВ Программа показывает следующий на CHANNEL1 30 декабря 2009 - 6:00 вечера «Эпизод 1 - Фотосинтез» Установить напоминание
ТВ Программа показывает следующий на CHANNEL1 6 января - 2:45 вечера «Эпизод 2 - За Music» Установить напоминание
Телепрограмма показывает следующий на CHANNEL1 7 января - 8:00 PM «Преступление Окончательных автомобилей» Установить напоминание

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

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

ТВ Программа показывает следующий на CHANNEL1 6:00 вечера «CCTV городов - Уиган «Установить напоминание
ТВ Программа показывает следующий на CHANNEL1 9 января - 2:45 PM„Римская империя - История его народа“Установить напоминание
ТВ Программа показывает следующий на CHANNEL1 10 января - 8:00 вечера» Celebrity 100 Worst Moments "Напоминание

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

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

Я не ставил это в качестве живого сайта, так как сейчас он «в адском развитии», и я хочу как можно больше сделать все правильно.

+0

Что * точно * Ваш вопрос? Как отображать даты по-разному на основе текущей даты или что? –

+0

Это PHP 5.2.8 и 5.3.0. PHP 6 слишком далеко, чтобы вы даже заботились об этом ;-) – phidah

+0

Не могли бы вы поделиться с другими источниками данных ur для руководства по телевизору? Спасибо – Obaid

ответ

1

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;"); 

Для страницы гига листинга I лет назад также добавил удаление Algorythm опасаясь дб мог получить «полный», но позже пожалел ...

+0

«ASC» отсутствует после airdate imho – Karsten

+0

Спасибо, что работает! Решили одну проблему! В ответ на Tatu, он является отображение даты по-разному на основе текущей даты - то есть, чтобы показать, как это для текущей записи Дейта:

ТВ Программа показывает следующий на CHANNEL1 6:00 вечера «CCTV Города - Уиган "Set Reminder
Обратите внимание, как текущая дата не отображается - это то, что я пытаюсь выполнить. Это было вдохновлено этим - http://library.digiguide.com/lib/programmenextshowing/House-238308 (дата автоматически исчезает в тот день, когда программа транслируется). Благодарим вас за советы! –

1

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

Вот пересмотренный вариант кода, который может обрабатывать оба эти:

<?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>"; 
} 
?> 
+0

Тату, спасибо за это! Работал как шарм, простое и эффективное кодирование. Еще одна вещь ... как я могу заставить ее не показывать записи, как только текущее время прошло (в качестве теста я вставил программу, которая транслировалась в 8:30 сегодня, и она появилась, несмотря на то, что было несколько часов назад !) Еще одна вещь ... как мне заставить разбивать страницы на несколько записей? http://pastebin.com/fccf3500 имеет текущий скрипт. Благодарим вас за помощь! –

+0

Ответ на ваш первый вопрос прост: в SQL-запросе вместо 'CURDATE()' используйте 'NOW()'. 'CURDATE()' сравнивает дату, тогда как 'NOW()' также сравнивается с текущим временем. К вашему второму вопросу: вы бы лучше прочитали некоторые туриалы о создании разбивки на страницы или создали для этого новый вопрос. И запомни; если вы нашли этот ответ полезным, не забудьте поднять и отметить его как принято! –

1
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); 
}