用php实现广告轮播
2024年02月23日
网路广告,变成了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开发出来的广告程式