PHP教程.应用实例8

教程|应用实例

PHP下定制自己的记数器
计数器是让 Web 访客知道该网页或者网站的人气指数最直接的方法,同时,访客人数也是给广告商做广告的最好依据。虽然很多网站都提供免费的计数器,可毕竟不是自己亲手制作的,不能体现出自己的特色。下面就PHP环境下记数器的制作过程进行详细的讨论。

访客计数器的流程如下:

第一位使用者浏览某页。

服务器程式从资料库或档案中读取该页被浏览次数。

将次数加一储存,并将它送回第一位使用者。

下一位使用者浏览某页。

服务器程式从资料库或档案中读取该页被浏览次数。

将次数再加一储存,并将它送回下一位使用者。

PHP中没有直接的计数器函数,但利用它强大的功能,我们可以很容易地自己编写一个计数器。计数器的实现分为两个阶段:一是实现计数;二是实现数字的显示。在实现计数时又有两种方式:一是基于文件的计数方式;二是基于数据库的计数方式。同样在实现数字的显示上也有两种方式:一是普通的文本显示;二是图形方式显示。下面就分别将这四种情况作一一介绍.

一、计数的实现

1.基于文件的计数

原理:把以往的访问人数记录在一个文本文件中,当网页被访问的时候,打开该文件并从中读出以往的访问人数,加 1,得到最新的访问人数,再把最新的访问数字回写到纪录访问人数的文件中。
实现;

<?php

$counterFile = "counter.txt";
if (!file_exists($counterFile)) {
//判断文件是否存在
$fp = fopen($counterFile, "w");
fputs($fp, "0");
fclose($fp);
}
//读文件
$n=10;
$fp = fopen($counterFile, "r");
$str1 = fgets($fp,$n);
$str1++;
fclose($fp);
//回写文件
$fp = fopen($counterFile, "w");
fputs($fp, $str1);
fclose($fp);

?>

程序说明:在浏览到本页时,PHP 程式先找寻 counter.txt 文件是否存在,若不存在,则建立一个 counter.txt 文件,并将 0 写入文件。然后读取 counter.txt 文件的内容,并将读出的数字加一,然后回写到文件中。

2、基于数据库的计数

原理:把访问人数记录在一个数据库中,当网页被访问的时候,从数据库中读出以往的访问人数,加 1,得到最新的访问人数,再把最新的访问数字回写到数据库中。

实现:假设数据库为Mysql数据库,名为XinXiKu,先建一数据表count,表字段中仅有counter一个字段,默认值为0,来记录访问人数。

<?php

//连接数据
$db=mysql_connect("localhost","root","");
mysql_select_db("XinXiKu",$db);
//更新访问人数
$result=mysql_query("update count set counter=counter+1",$db);

?>

程序说明:访问者在浏览到本页时,首先连接到数据库,并把记数字段用原值加1来进行更新操作,实现访问数的递增。

二、记数的显示

1、普通的文本方式显示

这种显示方法很简单,在需要显示记数的地方直接输出即可。以上面的例子分别说明:

基于文件的计数,直接输出变量str1的内容即可。
<?php echo $str1 ; ?>

基于数据库的计数,首先从数据库中读出,然后再输出。

<?php

//查询数据库
$sql="select * from count";
$result=mysql_query($sql,$db);
//取得记录集
$record=mysql_fetch_array($result);
//取得访问人数
$str1=$record["counter"];
echo $str1;

?>

同样,你也可以用html语句像 <font color size>等对输出的数字进行修饰。文本显示的优点是减少下载时间,浏览速度快。缺点是显示方式不够活泼。

2、图形方式显示

原理:把读出的访问数据格式化成标准的格式,然后利用php提供的图像处理函数,把数字输出成图片格式。这样,数字的显示格式可以随意控制,真正能体现出自己的特色来。

实现:

<?
Header("Content-type: image/gif");
//定义输出为图像类型
$n=10;
//变量$n是显示位数

//利用上面的方法,取得访问人数并赋值给变量$str1 (程序略)
$str1=取得访问人数的值
$str2 = "";
//位数如果不够$n位,在前面补0
$len1 = strlen($str1);
for ($i=1;$i<=$n;$i++) {
$str2 = "0".$str2;
};
//得到$n位0
$len2 = strlen($str2);
//计算访问人数的位数
$dif = $len2 - $len1;
$rest = substr($str2, 0, $dif);
$string = $rest.$str1;
//位数如果不够$n位,在前面补0
for ($i=0;$i<=$n-1;$i++) {
$str[$i]=substr($string,$i,1);
};
//以数组存储每位数字
$font = 4;
//定义字号
$im = imagecreate($n*11-1,16);
//新建图象
$black = ImageColorAllocate($im, 0,0,0);
$white = ImageColorAllocate($im, 255,255,255);
//定义颜色
imagefill($im, 0,0,$black);
//把计数器的底色设置成黑色
ImageString($im,$font,1,0,$str[0],$white);
for ($i=1;$i<=$n-1;$i++) {
imageline($im, $i*11-1,0,$i*11-1,16, $white);
ImageString($im,$font,$i*11+1,0,$str[$i],$white);
};
//将每位写入图象,并以竖线分隔
ImageGif($im);
//图象输出
ImageDestroy($im);
//释放图象
?>

输出图形如图如示:

函数说明:

imagecreate(int x_size, int y_size):建立一张全空的图形。参数 x_size、y_size 为图形的尺寸,单位为像素 (pixel)。

imagecolorallocate(int im, int red, int green, int blue):用来匹配图形的颜色,供其它绘图函数使用。参数 im 表示图形的 handle。参数 red、green、blue 是色彩三原色,其值从 0 至 255。

imagefill(int im, int x, int y, int col):将图片坐标 (x,y) 所在的区域着色。参数 col 表示欲涂上的颜色。

imagestring(int im, int font, int x, int y, string s, int col):在图片上绘出水平的横式字符串。参数 font 为字形,设为 1 到 5 表示使用默认字形。参数 x、y 为字符串起点坐标。字符串的内容放在参数 s 上。参数 col 表示字符串的颜色。

imageline(int im, int x1, int y1, int x2, int y2, int col):在图形上画出一条实线。从 x1、y1 连接到 x2、y2,原点 (0,0) 为图形的左上角。参数 col 为实线的颜色。

imagegif(int im, string [filename]):建立一张 GIF 格式图形。参数 im 为使用 ImageCreate() 所建立的图片代码。

imagedestroy(int im):将图片 handle 解构,释于内存空间。

三、结束语

1、上述代码如果直接放在文件头,那么只要有人访问该页,无论是刷新还是从网站的其它页跳转到该页,就会使计数值加1,从而使主页计数失去了真实性。有两个很简单的办法可以解决。

a、在返回到该页的链接上传递一个参数flag,比如:index.php?flag=1,在计数之前首先检查flag变量是否已赋值,若未赋值,计数器加1。否则不加。

if(empty($flag)){
$counter+=1;
}

b、用Session记录一标志flag,在记数前先判断flag是否已赋值,如果没赋值,则记数加1,并给flag赋值,否则,记数器不变。

if (!isset($flag))
{
//处理记数器加1语句
...
//赋值flag
session_start();
session_register("flag");
$flag=1;
}

2、为了方便,可以将计数器作为一个函数MyCounter(),这样只许需在主页开头加入require("filename"); 使MyCounter()成为此主页的一部分,需要的时候,将<? MyCounter();?>加在需要计数器的地方显示就可以了。

3、利用图形显示计数器时,在需要的地方直接插入:<img src="counter.php" border=0>即可。但要注意的是PHP中必须安装GD库才能利用php中的图像处理函数。

时间: 2024-09-09 22:39:46

PHP教程.应用实例8的相关文章

PHP教程.应用实例5

教程|应用实例 php生成WAP页面 WAP(无线通讯协议)是在数字移动电话.个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准.由于静态的WAP页面在很多方面不能满足用户个性化的服务请求,因此通过WAP服务器端语言产生动态的WML页面,具有很广泛的应用价值和很高的商业价值. WAP应用结构非常类似于Internet,一个典型的WAP应用请求是这样的:首先,具有WAP用户代理功能的移动终端(WAP手机等)通过内部运行的微浏览器(Micro Browser)对某一网站以无线方式发送WAP

PHP教程.应用实例4

教程|应用实例 PHP开发文件系统实例讲解PHP中有许多与文件系统有关的函数,这些函数不仅可以打开文件,还可以显示目录中的内容.移动文件和其他一些功能,许多人甚至用PHP开发基于互联网的文件资源管理器. 下面的脚本样例可以显示一个目录清单,注释已经包含在代码中: <? /把要读取的目录的全路径名存入一个名字为$dir_name的变量中./$dir_name = "/home/me/";/ 创建一个句柄,其值是打开一个给定目录的结果/$dir = opendir($dir_n

PHP教程.应用实例14

教程|应用实例 多文件上载系统程序<?php //多文件上载系统完整版 include("../include/common.inc"); $title = "多个文件的上载程序"; include("../include/header.inc"); //定义允许上载文件的数目 define("UPLOAD_NO", 10); echo("<p align='center'><font siz

PHP教程.应用实例13

教程|应用实例 PHP中用户身份认证实现二法(2)AddType application/x-httpd-php4 .php3AddType application/x-httpd-php4 .php4Action application/x-httpd-php4 /php4/php.exe 要想使PHP支持更多的后缀名,没问题.在给出的配置文件mod_php4.conf已经支持了三种后缀名php,php3,php4,如果你还想支持更多的后缀名可以更改这个文件,很简单的. 4.测试 用<? ph

PHP教程.应用实例12

教程|应用实例 PHP中用户身份认证实现二法(1)用户在设计和维护站点的时候,经常需要限制对某些重要文件或信息的访问.通常,我们可以采用内置于WEB服务器的基于HTTP协议的用户身份验证机制.当访问者浏览受保护页面时,客户端浏览器会弹出对话窗口要求用户输入用户名和密码,对用户的身份进行验证,以决定用户是否有权访问页面.下面用两种方法来说明其实现原理. 一.用HTTP标头来实现 标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串.HTTP采用一种挑战/响应模式对试图进入受密码保护区域

PHP教程.应用实例11

教程|应用实例 PHP应用提速面面观PHP最大的优点之一显然在于它的快速度.一般情况下PHP总是具有足够的速度支持Web内容动态生成,许多时候你甚至无法找出比它更快的方法.然而,当你不得不面对庞大的访问量.高负荷的应用.有限的带宽以及其他各种带来性能瓶颈的因素时,你可能会问问自己是否可以做点什么让网站运行得更好.或许只要加上一个很不起眼的免费模块,你的PHP应用性能以及Web服务器响应速度就会有显著的改善.本文讨论的就是如何进一步提高php应用的性能,给用户以更美妙的浏览感受.本文分三个方面(代

PHP教程.应用实例10

教程|应用实例 php写的发送附件的程序(二)<?php class html_mime_mail{ var $headers; var $body; var $multipart; var $mime; var $html; var $html_text; var $html_images = array(); var $cids = array(); var $do_html; var $parts = array(); /**********************************

PHP教程.应用实例2

教程|应用实例 PHP-Push技术实现刷新功能Server push 前一段时间炒得很热的"推"技术,不过网上大部分都是cgi的资料,偶尔看到一个法国的网站上有这么个介绍,可惜法语看不懂,只能从他的程序中看懂点东西,现整理个例子出来大家学习一下.可以用于聊天室的数据传输.网站上的新闻更新.等等各类更新频繁的页面. 以前做刷新主要通过页面上加标签. < META HTTP-EQUIV=REFRESH CONTENT="time;URL=url" > 或者

PHP教程.应用实例1

教程|应用实例 PHP/MySQL 购物车程序 <? if(!$session && !$scid) { $session = md5(uniqid(rand())); SetCookie("scid", "$session", time() + 14400); } /* last number is expiration time in seconds, 14400 sec = 4 hrs */ class Cart { function c

PHP教程.应用实例18

教程|应用实例 基于PHP的聊天室(三)现在我们有了需要通过$REMOTE_ADDR变量来交叉引用的文件,这样我们可以区分出想要发贴的用户是否已经被扁或没有被扁.很简单: <?php for ($counter=0;$counter<sizeof($banned_array);$counter++) { if ($banned_array[$counter] == $REMOTE_ADDR) { print("<font color="red" face=&