2010-01-08 66 views
0

我正在创建一个电视指南,其中列出了将要发布的节目(以及某些列表,以前的播出),并将所有数据存储在数据库中。它运行在PHP中,我的版本是5.28(很快升级到5.30或6)。用PHP编写的电视指南 - 有datetime()和数据库功能的问题

下面是(注意现场广播日被存储为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 2009年12月30日 - 下午6:00“第1集 - 光合作用”设置提醒 下一显示在通道1 1月6日
电视节目 - 2:45 PM“第2集 - 音乐背后”设置提醒
下一个显示在通道1 1月7日的电视节目 - 下午8:00“终极汽车罪”设置提醒

不过,我想它做的是在一段时间后删除某些记录已过期(但是这将有要在脚本中的某处设置,因为程序长度会有所不同),而不是手动从数据库中删除它们。有些节目长30分钟,其他节目长60分钟,基本上不同。

我想什么它做的是这个(通知,首批上市不显示的日期,因为它是当前日期。):未来

电视节目显示在通道1下午6:00“CCTV城市 - 威根“设置提醒
电视节目下一显示在通道1 1月9日 - 下午2:45‘罗马帝国 - 它的人民的历史’设置提醒
下一个显示在通道1 1月10日 电视节目 - 下午8:00”百大名人榜最差时刻“设置提醒

但我不知道如何配置它与PHP或date()函数做到这一点。它与日期一起工作良好,并显示它们。 我无权访问cron作业,因为它位于Windows Vista Home Edition上的本地主机Apache安装上。

如果有人可以帮我弄清楚这将是非常感谢 - 所有的帮助,非常感谢。

我没有把它当做一个活的网站,因为它现在正处于“发展中的地狱”,我想尽可能地把事情做好。

+0

什么* *究竟是你的问题?如何根据当前日期或什么显示不同的日期? – 2010-01-08 23:17:38

+0

这是PHP 5.2.8和5.3.0。 PHP 6离你太远,甚至不在乎;-) – phidah 2010-01-08 23:25:44

+0

你介意分享你的电视指南的数据源吗? 谢谢 – Obaid 2010-05-29 23:56:03

回答

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

对于演出列表页我几年前还增加了一个删除algorythm担心可能分贝得到'满' - 但后悔...

+0

“ASC”在airdate后失踪imho – Karsten 2010-01-08 23:29:02

+0

谢谢,这是有效的!解决了一个问题! 为了回应Tatu,它根据当前日期不同显示日期 - 即在当前日期的记录中显示它:

电视节目显示频道1下一个晚上6:00 pm“CCTV Cities - Wigan “设置提醒
请注意当前日期未显示 - 这就是我想要完成的。 它的灵感来自于这个 - http://library.digiguide.com/lib/programmenextshowing/House-238308(当节目播出时,日期自动消失)。 感谢您的建议! – 2010-01-08 23:29:37

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

Tatu,谢谢!像魅力一样工作,简单而有效的编码。 还有一件事......如果现在时间过去了,我怎么才能让它不显示记录(作为一项测试,我插入了一个在今天上午8:30播出的节目,尽管事实上它几个小时前!) 还有一件事...我如何让我的分页工作为这样的多个记录? http://pastebin.com/fccf3500有当前脚本。 感谢您的帮助! – 2010-01-08 23:42:55

+0

第一个问题的答案很简单:在SQL查询中,而不是'CURDATE()',使用NOW()。 'CURDATE()'比较日期,而'NOW()'与当前时间进行比较。关于第二个问题:您最好阅读一些关于创建分页的小册子,或者为此创建一个新问题。并记住;如果您发现此答案有帮助,请不要忘记注册并将其标记为已接受! – 2010-01-09 00:05:47

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