2010-01-08 48 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); 
}