用php完成廣告輪播
發表時間:2024-02-14 來源:明輝站整理相關軟件相關文章人氣:
[摘要]網路廣告,變成了 Internet 上的熱門學問。而 468x60 更變成了廣告人員絞盡腦汁的尺寸。 在處理廣告時,若能直接使用瀏覽器將廣告的 468x60 圖檔送到處理廣告的伺服器中,相信是件很舒服的事,不用再開 FTP 程式,搞大半天只為了 upload。 這個問題,是所有 Web C...
網路廣告,變成了 Internet 上的熱門學問。而 468x60 更變成了廣告人員絞盡腦汁的尺寸。
在處理廣告時,若能直接使用瀏覽器將廣告的 468x60 圖檔送到處理廣告的伺服器中,相信是件很舒服的事,不用再開 FTP 程式,搞大半天只為了 upload。
這個問題,是所有 Web CGI 程式的痛,包括 ASP、Prel....等等,都需要再經過系統元件的增加才能達成。號稱最強的 Web CGI 程式: PHP,在這方面的表現沒有令人失望,甚至傲視其它的 CGI 工具。
File Upload 功能在 RFC 1867 文件有有詳細的說明,是利用特殊的文件格式 (content-type) multipart/form-data。值得注意的是瀏覽器一定要用 Netscape 3.0 以上或 MS Internet Explorer 4.0 以上的版本才能將檔案上傳。
先看下面的 HTML 原始碼
< form enctype="multipart/form-data" action="next.php" method=post >
您的大名: < input type=text name=user >< br >
檔案名稱: < input name="myfile" type="file" >< br >
< input type="submit" value="送出" >
< /form >
在 form 的標簽中,要加入 enctype="multipart/form-data" 的字串,表示使用者輸入的資料上有檔案上傳,同時 method 一定要用 POST 而不能用 GET。
在上面的碼中,若使用者姓名填入 Wilson Peng,并選 c:\myphoto.gif 的檔案,在使用者按下送出鍵后,瀏覽器則傳送出下面的 POST 資料。
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="user"
Wilson Peng
--AaB03x
content-disposition: form-data; name="myfile"
Content-type: multipart/mixed, boundary=BbC04y
--BbC04y
Content-disposition: attachment; filename="myphoto.gif"
Content-type: image/gif
Content-Transfer-Encoding: binary
...myphoto.gif 內容略...
--BbC04y--
--AaB03x--
看到上面的資料中,boundary=AaB03x 即為分開不同欄位資料的訊息,其中的 AaB03x 編碼方法,視瀏覽器的版本不同而異,通常是瀏覽器雜湊產生的。之后就可以看到用 --AaB03x 來隔開不同的欄位。
以上面為例,處理 form 的 action 程式 next.php,會主動產生四個變數,見下表
變數名 說明
$myfile 即上傳的檔案內容
$myfile_name 上傳檔案在使用者端的名稱
$myfile_size 上傳檔案的大小
$myfile_type 上傳檔案的格式,如 "image/gif"
在 next.php 程式要做的最重要動作,就是好好的使用這四個變數,否則程式一結束,使用者上傳的檔案就消失了。因此,要先將 $myfile 復制到存放廣告圖的目錄中
copy($banner,"/home1/biglobe3/ad/".$banner_name);
這行程式就是將檔案存在 /home/htdocs/ad 的目錄中,就上面的例子而言,就將檔案存到 /home/htdocs/ad/myphoto.gif。重要的是,存放的目錄不能是 Web Server 無法讀到的目錄,而應放在網站的 Homepage 所在目錄中,才可以在網路上看到。
或許程式要更細部的處理,例如比對取得的檔案大小與系統回報的是否相同....等等,就可以用 $myfile_size 變數了。
若在 form 中設定 input file 的名稱改掉,則在 Upload 的變數也一起改,如
< input name="upfile" type="file" >
則變數就改成 $upfile、$upfile_name、$upfile_size、與 $upfile_type。
因此,下面的例子就利用 File Upload 及 Oracle 7.x 后端資料庫,將檔案放在 Web Homepage 目錄中,相關資訊則存在 Oracle 中。當然,加上使用者認證,讓有帳號的使用者才能上傳圖片,可避免劊客 (cracker) 等將不雅或不適當的廣告上傳。例中有關資料庫的設定和 5.4 留言版的設定相同。
< html >
< head >
< ?php
// adadd.php
if (($banner=="") and ($url=="")) {
? >
< title >新增廣告< /title >
< /head >
< body >
加權值數字愈大,圖片出現的機率就愈高,內定值為 1。
< FORM ENCTYPE="multipart/form-data" ACTION="adadd.php" METHOD=POST >
< table border=0 >
< tr >< td align=right >廣告 Banner: < /td >< td >< input name=banner TYPE="file" >< /td >< /tr >
< tr >< td align=right >廣告網址 URL: < /td >< td >< input name=url type=text size=30 >< /td >< /tr >
< tr >< td align=right >輔助字串 ALT: < /td >< td >< input name=alt type=text size=30 >< /td >< /tr >
< tr >< td align=right >廣告說明: < /td >< td >< input name=descript type=text size=30 >< /td >< /tr >
< tr >< td align=right >顯示加權: < /td >< td >< input name=priority type=text size=5 value=1 >< /td >< /tr >
< tr >< td colspan=2 align=right >< input type="submit" VALUE="確定" >< /td >< /tr >
< /table >
< /FORM >
< ?
} else {
if (file_exists("/home/htdocs/ad/".$banner_name)) {
CommonHeader("檔案 ".$banner_name." 已存在");
echo "< p >< br >< br >廣告檔案已經存在\n< p >< br >< br >< /body >< /html >";
exit;
};
copy($banner,"/home1/biglobe3/ad/".$banner_name);
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);
$query="insert into ad(url, banner, alt, descript, priority) values('$url', '$banner_name', '$alt', '$descript', $priority)";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
ora_close($cursor);
ora_logoff($handle);
echo "< title >廣告新增完成< /title >";
echo "< /head >";
echo "< body >";
echo "< a href=".$url." >< img src=/ad/".$banner_name." alt=\"".$alt."\" border=0 >< /a >< p >";
echo "< ul type=disc >";
echo "< li >廣告網址: ".$url;
echo "< li >輔助字串: ".$alt;
echo "< li >廣告說明: ".$descript;
echo "< li >顯示加權: ".$priority;
echo "< /ul >";
}
? >
< /body >
< /html >
當然要使用上面的程式之前別忘了先增加 ad 資料表,SQL 及欄位如下
CREATE TABLE ad (
url varchar2(1024) not null,
banner varchar2(1024) not null,
alt varchar2(255) null,
descript varchar2(255) null,
priority number(4) not null default 1
);
序號 欄位 名稱 資料形態 資料長度 欄位說明
0 廣告網址 url varchar2 1024
1 圖片路徑 banner varchar2 1024
2 字串顯示 alt varchar2 255
3 廣告說明 descript varchar2 255
4 顯示加權 priority number 4 1 為內定值,0 表停用
值得一提的是在這加入了加權的功能,若一個廣告要提升曝光率,則可以將顯示加權的欄位數字加大,例如 5,它的出現機率就會比只設為 1 的高五倍。
< ?php
// ad.php
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);
$query="SELECT url, banner, alt, priority FROM ad where priority > 0";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=$pricount=0;
while(ora_fetch($cursor)) {
$ad[$i][0] = ora_getcolumn($cursor,0);
$ad[$i][1] = ora_getcolumn($cursor,1);
$ad[$i][2] = ora_getcolumn($cursor,2);
$ad[$i][3] = ora_getcolumn($cursor,3);
$pricount += $ad[$i][3];
$i++;
};
ora_close($cursor);
ora_logoff($handle);
srand((double)microtime()*1000000);
$pri = rand(1,$pricount);
$pricount=0;
for($i=0; $i< count($ad); $i++) {
$pricount += $ad[$i][3];
if ($pri < = $pricount) {
$ad1[]="< a href=".$ad[$i][0]." target=new >< img src=/ad/".$ad[$i][1]." width=468 height=60 border=0 alt=\"".$ad[$i][2]."\" >< /a >";
}
}
echo $ad1[0];
? >
上面的程式為公用的廣告顯示程式,其中的 $pricount 變數為所有廣告 priority 加起來的和。程式先將所有的廣告資訊讀到陣列變數 $ad 中,隨即關上資料庫。再依時間取亂數種子,之后再從 1 到 $pricount 間隨機取一個數字。
網頁中要用廣告程式,只要在需要廣告的地方加上 < ? include("ad.php"); ? > 就可以了,當然 Include 的路徑 (在 httpd.conf 中) 要先設好才行。
上面的程式還有改進空間,可以加入廣告的 Click Log 功能,或是顯示的 Log 功能,改動顯示加權的程式....等等,就不做范例了,畢竟在這兒是要介紹 PHP 的實際應用及程式開發,而不是套件開發。真的需要現成的廣告套件,不妨到 http://www.phpwizard.net/phpAds,這是一套用 PHP 開發出來的廣告程式