在这个项目中,我们需要统计文件的下载次数。用户每次下载文件,对应的下载次数会增加1。许多下载站都使用类似的应用程序。本文使用PHP Mysql jQuery实现了点击文件、下载文件、积累次数的过程,整个过程非常流畅。
为了准备这个例子,读者需要具备PHP、Mysql、jQuery、html、css等基础知识。在开发这个例子之前,他们需要准备Mysql数据表。本文假设有一个文件下载表,用来记录文件名、保存在文件服务器上的文件名和下载次数。前提是下载表中已经存在数据,在项目后台上传文件时可能会插入,这样我们就可以在页面上读取。下载表结构如下:
CREATE TABLE IF NOT EXISTS ` downloads `(` id ' int(6)无符号NOT NULL AUTO_INCREMENT,` filename ' varchar(50)NOT NULL,` save name ' varchar(50)NOT NULL,` downloads ' int(10)无符号NOT NULL DEFAULT '1 ',PRIMARY KEY (`id `),UNIQUE KEY ` filename `(` filename `))ENGINE=MyISAM DEFAULT CHARSET=utf8;也可以直接下载Demo,导入SQL文件,拥有所有数据。html我们在index.html页面的正文中添加了下面的HTML结构,其中ul.filelist用来显示文件列表,但是现在里面没有内容了,所以我们就用jQuery来异步读取文件列表,所以不要忘记,我们还需要在HTML中加载jQuery库文件。
div id=' demo ' ul class=' file list '/ul/div CSS为了让demo更好的显示页面效果,我们用CSS来修饰页面。下面的代码主要设置文件列表的显示效果。当然,实际项目中可以根据需要设置相应的样式。
# demo { width:728pxmargin:50px汽车;padding:10pxborder:1px实心# ddd背景色: # eee;} ul . file list Li { background : URL(' img/BG _ gradient . gif ')repeat-x中心底部# F5F5F5border:1px实心# ddd边框-顶部-颜色: # fff;list-style : none;位置:相对;} ul . file list Li . load { background : URL(' img/Ajax _ load . gif ')no-repeat;左填充left:20pxborder:none位置:相对;left:150pxtop:30pxwidth:200px} ul.filelist阿利{ display:blockpadding:8px} ul.filelist li a:hover。下载{ display:block} span . download { background-color : # 64b 126;border:1px固体# 4e9416颜色:白色;display:nonefont-size :12 px;padding:2px 4px位置:绝对;right:8px文本装饰: none;text-shadow :0 0 1px # 315 d0d;top:6px-moz-border-radius :3 px;-web kit-border-radius :3 px;边界半径:3 px;} span . down count { color : # 999;padding:5px位置:绝对;边距-left :10 px;文本装饰: none;} PHP为了更好的理解,我们有两个PHP文件,一个是filelist.php,用于读取mysql数据表中的数据,并以JSON格式输出数据,用于调用前台index.html页面,另一个是download.php,用于响应下载动作,更新相应文件的下载次数,通过浏览器完成下载。Filelist.php读取下载表,并通过json_encode()以JSON格式输出数据,这是为下面的Ajax异步操作准备的。
需要“conn . PHP”;//连接到数据库$ result=MySQL _ query(‘从下载中选择*);if(MySQL _ num _ rows($ result)){ while($ row=MySQL _ fetch _ assoc($ result)){ $ data[]=array(' id '=$ row[' id '],' file'=$row['filename'],' downloads '=$ row[' downloads ']);} echo JSON _ encode($ data);} download.php根据url查询对应的数据,检测是否存在要下载的文件,如果存在,则将对应数据的下载次数更新1,并使用header()实现下载功能。值得一提的是,header()函数用于强制下载文件,下载后可以设置保存在本地的文件名。一般情况下,我们会对上传的文件进行重命名,通过后台上传程序保存在服务器上,以日期和时间命名的文件比较常见。这样做的一个好处是避免了文件名重复和中文名字乱码的情况。我们在本地下载的文件可以使用header(' content-disposition :附件;文件名='。$filename)将文件名设置为易于识别的文件名。
需要(' conn . PHP ');//连接到数据库$ id=(int)$ _ GET[' id '];if(!Isset($id) || $id==0) die('错误的参数!);$ query=MySQL _ query(' select * from downloads,其中id=' $ id ');$ row=MySQL _ fetch _ array($ query);if(!$row)退出;$filename=iconv('UTF-8 ',' GBK ',$ row[' filename ']);//中文名注意转换代码$ save name=$ row[' save name '];//服务器上实际保存的名称是$myfile='file/'。$ savenameIf(file_exists($myfile)){//如果文件存在//更新下载次数MySQL _ query('更新下载集下载次数=下载次数1其中id=' $ id ');//下载文件$file=@ fopen($myfile,' r ');标题(“内容类型:应用程序/八位字节流”);标题('内容-处置:附件;文件名='。$ filename);while(!feof($file)) { echo fread($file,50000);} fc lose($ file);退出;} else { echo }文件不存在!} jQuery的首页jQuery主要完成两个任务,一是通过Ajax异步读取文件列表并显示,二是响应用户的点击事件,下载相应的文件1次查看代码:
$(function(){ $)。ajax({ //异步请求类型:' get ',url3360' filelist.php ',datatype3360' JSON ',cache3360 false,beforesend3360function () {$()。file list’)。html('。},success:函数(JSON){ if(JSON){ var Li=' ';$.每个(json,函数(index,array){ Li=Li ' lia href=' download . PHP?id=' array[' id ']' array[' file ']' span class=' downlount ' title='下载次数' ' array[' downloads ']'/span span class=' download ' Click to download/span/a/Li;});$('.file list’)。html(Li);} } });$('ul.filelist a ')。live('click ',function(){ var count=$(')。' downcount ',这个);count . text(ParSeint(count . text())1);//下载次数1 });});首先,页面加载后,通过$,以GET的形式向后台filelist.php发送一个Ajax请求。ajax()。当filelist.php成功时,接收返回的json数据,通过$遍历json数据对象。每个(),构造一个html字符串,并将结果字符串添加到ul.filelist中,在demo中形成一个文件列表。然后在下载文件时,使用live()响应动态添加列表元素的点击事件,并累计下载次数。最后其实看完这篇文章,这是一个我们平时应用到的Ajax案例,当然还有结合mysql下载PHP的知识,希望对大家有所帮助。