任何的程序和软件都是离不开对文件的操作的,其实说的通俗了一点,所有的程序其实都是对文件的操作,都是对文件中等的某些字符的操作。当然说到文件就有很多。Txt、doc、sql、ini等的文本文件gif、jpg、png等的图片文件当然还有很多swf,flv等的视频文件。有很多很多。既然所有的程序、系统都是文件组成,所以文件是个比较敏感的东西,尤其是在linux这样的操作系统下就更是如此。
文件的权限是个比较敏感的问题,但很多人并不重视,其实合理的对文件分配权限是可以很大的提高程序的安全性的。
今天简单的说一下一个对txt文件的操作。很多时候网站都想做一个这样的功能,一个投票或者类似顶一下的这样的功能。限制一个访客使用一次。在哪个时间结束。显示有多少人参与。类似这样的。
分析这个功能,首先这个人数、百分比肯定是要随点击来变的。再者不能忘了的就是这个蓝环的高度。外层这个遮罩是整个环的高度的1-百分比。这样读取就实现了。
所以我们有的时候搞这样一个活动可能也就是几天,没有太大的必要再重新建一个表来判断ip地址(当然是你的访客并没有太大的话),那么我们就可以利用文件来实现这个功能。首先一个txt文件存储参与人数,一个txt文件来存储日期,一个txt文件来存储ip(我以前也做过一个统计访客在线人数的功能,但是用的是一个dat文件,这样的文件可能更高效一些,这里我们还是用txt).上代码
ajax.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<?php $val = @$_POST['val']; if("1"==$val){ $time = time(); $time2 = date('Y-m-d',$time); $file1 = 'data.txt'; $file2 = 'val.txt'; $f1 = fopen($file1,'r+'); $f2 = fopen($file2,'r+'); $t1 = fread($f1,'99'); $t2 = fread($f2,'99'); if('2012-11-15'){ if($t1==$time2){ $rs['bv'] = round((16-(strtotime('2012-11-15')-strtotime($t1))/86400)/16*40,1)+60; $rs['hv'] = 270*($rs['bv']/100); $rs['zv'] = $t2; }else{ $f1 = fopen($file1,'w+'); $f2 = fopen($file2,'w+'); $t1 = fread($f1,'99'); $t2 = fread($f2,'99'); $rs['bv'] = round((16-(strtotime('2012-11-15')-strtotime($time2))/86400)/16*40,1)+60; $rs['hv'] = 270*($rs['bv']/100); $rs['zv'] = round(999999*($rs['bv']/100)); fwrite($f1,$time2); fwrite($f2,$rs['zv']); } }else{ $rs['bv'] = 100; $rs['hv'] = 270; $rs['hv'] = $t2; } fclose($f1); fclose($f2); echo json_encode($rs); }else //if("2"==$val) { $time = time(); $time2 = date('Y-m-d',$time); if('2012-11-15'>$time2){ $file3 = 'ip.txt'; $f3 = file($file3); $ip = $_SERVER['REMOTE_ADDR']; if(!in_array($ip."\r\n",$f3)){ $f4 = fopen($file3,'a+'); fwrite($f4,$ip."\r\n"); $file2 = 'val.txt'; $f2 = fopen($file2,'r+'); $t2 = fread($f2,'99'); $t2 = $t2+1; $m2 = fopen($file2,'w+'); fwrite($m2,$t2); fclose($f2); fclose($f4); fclose($m2); echo $t2; }else{ echo 2; } exit; }else{ echo 1; } } ?> |
html引用页面代码,我用ajax
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<script> function lookview(){ $.post("ajax.php",{val:1},function(data){ var obj=eval("("+data+")"); $("#bv").html(obj.bv); $("#zv").html(obj.zv); var gd = "-"+obj.hv+"px"; $("#lh_box").css({ "margin-top":gd}); }); } function addview(){ $.post("ajax.php",{val:2},function(data){ if("1"==data){ alert("对不起,浇筑活动已过期,请期待下次活动!"); return false; }else if("2"==data){ alert("对不起,一个人只能浇筑一次!如果您没有留下您的联系方式请填写。"); return false; }else{ $("#zv").html(data); } }); } lookview(); </script> |
代码大体看一下,其实就是以2012-11-15为活动到期日期,将999999为活动的最多也叫满员人数,如果访客在活动期内访问并且是第一次访问就可以投票,而考虑到可能并没有多少人访问,可以判断在活动日期内访问的日期和存储日期不同,就代表过了一天,就按活动剩余天数/总天数*999999这个总人数来获得参与获得人数,并写入。其实说到底这也是个骗人的功能。要知道,其实网路上的绝大部分的数据并不是真实的。这个功能不多说,虽然用到了几个特殊的功能,包括转化json数据等。但今天我们说说file和fopen等的函数,file是将整个文件以行为单位写入一个数组,我们可以在val=2的写入投票可以看出,虽然file_put_contents可以写入文件一个数组,但是却是写入到一行中。所以我们要用fwrite来写入换行。这里要注意几个fopen的参数,查下手册可以看到其有r,r+,w,w+,a,a+等。这个地方有的人看说明搞了半天不知道有什么区别,r和w都有读写的方式,但是其实r是真正意义上的读的方式,w才是真正写的方式,w+是将文件截取为0,才是真正意义上的重新写入。不然用r还是追加,而a是真正意义上的追加。带+都是如果文件不存在就会创建这个文件。很多所\r\n不能写入换行,其实是因为php中双引号和单引号是不一样的,用双引号php会进行变量等特殊字符的解析,所以用双引号才能写入换行,但是要注意的是,在判断ip是否存在时,获取的ip也要补上\r\n来判断才行,不然一直都是不重复的。
本文链接:http://www.521php.com/archives/614/
程序本天成,妙手偶得之!我们只是代码的搬运工!
转载请注明:http://www.521php.com/archives/614/