任何的程序和软件都是离不开对文件的操作的,其实说的通俗了一点,所有的程序其实都是对文件的操作,都是对文件中等的某些字符的操作。当然说到文件就有很多。Txt、doc、sql、ini等的文本文件gif、jpg、png等的图片文件当然还有很多swf,flv等的视频文件。有很多很多。既然所有的程序、系统都是文件组成,所以文件是个比较敏感的东西,尤其是在linux这样的操作系统下就更是如此。
文件的权限是个比较敏感的问题,但很多人并不重视,其实合理的对文件分配权限是可以很大的提高程序的安全性的。
今天简单的说一下一个对txt文件的操作。很多时候网站都想做一个这样的功能,一个投票或者类似顶一下的这样的功能。限制一个访客使用一次。在哪个时间结束。显示有多少人参与。类似这样的。
分析这个功能,首先这个人数、百分比肯定是要随点击来变的。再者不能忘了的就是这个蓝环的高度。外层这个遮罩是整个环的高度的1-百分比。这样读取就实现了。
所以我们有的时候搞这样一个活动可能也就是几天,没有太大的必要再重新建一个表来判断ip地址(当然是你的访客并没有太大的话),那么我们就可以利用文件来实现这个功能。首先一个txt文件存储参与人数,一个txt文件来存储日期,一个txt文件来存储ip(我以前也做过一个统计访客在线人数的功能,但是用的是一个dat文件,这样的文件可能更高效一些,这里我们还是用txt).上代码
ajax.php
- <?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
- <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来判断才行,不然一直都是不重复的。