有很久写文章了,因为最近在写一个小项目,所以博客暂时就没有更新。
昨天交流请里有个友友问我如何实现php的计数效果,我告诉他了实现原理,但是他紧接着来了句,你可以教我吗?我一看到消息,心想完蛋,这家伙是来要源码的。如果你直接说要源码,我就能拿给你了,你让我教你,小杰本着负责任的态度,也会教,但是从何说起?从php语法开始讲吗?显然不是很现实。废话也不多说了,小杰也没有其他意思,这是想讲讲关于提问的艺术。
今天花了一个多小时把php计数器的源码写出来,如果那位群友能看到,希望你能理解我当时的心情,谢谢。
文件方式计数器
function fileCounter($default=0){
//文件名
$file = './count.dat';
//最大读取位数
$Maxlenght = '10';
if(!file_exists($file)){
//如果计数器文件不存在
//初始值
$counter = $default;
//新建文件
$cf = fopen($file,"w");
//写入数字
fputs($cf,$counter);
//关闭文件
fclose($cf);
}else{
//取回当前计数器的值
$cf = fopen($file,"r");
//去除空格并取出值
$counter = trim(fgets($cf,$Maxlenght));
//关闭文件
fclose($cf);
}
//计数器加一
$counter++;
//写入新的数据
$cf = fopen($file,"w");
fputs($cf,$counter);
fclose($cf);
return $counter;
}
数据库方式计数器
sqlCounter($default=0){
//数据表名
$sql_table = 'counter';
//数据库连接(地址,账号,密码)
$conn=@mysqli_connect("localhost","root","root");
//判断数据库是否正常连接
if (!mysqli_select_db($conn,$sql_table)) {
mysqli_close($conn);
exit('error('.mysqli_errno($conn).'):'.mysqli_error($conn));
}
//判断数据表是否存在
$result = mysqli_query($conn,"SHOW TABLES LIKE '%{$sql_table}%'");
if ($result && mysqli_num_rows($result)) {
//数据表存在的情况下直接读取数据
$re=mysqli_query($conn,"select count from {$sql_table} where id='1'");
$counter = mysqli_fetch_assoc($re);
$count = $counter['count'];
}else{
//数据表不存在则直接创建数据表
$count = $default;
$sql = "CREATE TABLE `{$sql_table}` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`count` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`)
);INSERT INTO {$sql_table} (id,count) VALUES ('1','{$count}');";
$re=mysqli_multi_query($conn,$sql);
if(!$re){
exit('error('.mysqli_errno($conn).'):'.mysqli_error($conn));
}
}
$up = "update {$sql_table} set count=count+1 where id='1'";
mysqli_multi_query($conn,$up);
mysqli_close($conn);
return $count;
}
sql方式的记得修改数据库连接信息,然后给数据库创建一个counter的数据表,其他都已经备注好了。
下面是class方式的汇总
<?php
/**
* PHP计数器
* @author Youngxj <blog@youngxj.cn>
* @time 2018年8月11日
* 使用方法:
$count = new Counter();
sql方式:echo $count::sqlCounter();
文件方式:echo $count::fileCounter();
初始值:echo $count::fileCounter('100');
*/
class Counter{
/**
* 文件形式计数
* @param integer $default 初始值
* @return [type] [description]
*/
public static function fileCounter($default=0){
//文件名
$file = './count.dat';
//最大读取位数
$Maxlenght = '10';
if(!file_exists($file)){
//如果计数器文件不存在
//初始值
$counter = $default;
//新建文件
$cf = fopen($file,"w");
//写入数字
fputs($cf,$counter);
//关闭文件
fclose($cf);
}else{
//取回当前计数器的值
$cf = fopen($file,"r");
//去除空格并取出值
$counter = trim(fgets($cf,$Maxlenght));
//关闭文件
fclose($cf);
}
//计数器加一
$counter++;
//写入新的数据
$cf = fopen($file,"w");
fputs($cf,$counter);
fclose($cf);
return $counter;
}
/**
* sql方式计数
* @param integer $default 初始值
* @return [type] [description]
*/
public static function sqlCounter($default=0){
//数据表名
$sql_table = 'counter';
//数据库连接(地址,账号,密码)
$conn=@mysqli_connect("localhost","root","root");
//判断数据库是否正常连接
if (!mysqli_select_db($conn,$sql_table)) {
mysqli_close($conn);
exit('error('.mysqli_errno($conn).'):'.mysqli_error($conn));
}
//判断数据表是否存在
$result = mysqli_query($conn,"SHOW TABLES LIKE '%{$sql_table}%'");
if ($result && mysqli_num_rows($result)) {
//数据表存在的情况下直接读取数据
$re=mysqli_query($conn,"select count from {$sql_table} where id='1'");
$counter = mysqli_fetch_assoc($re);
$count = $counter['count'];
}else{
//数据表不存在则直接创建数据表
$count = $default;
$sql = "CREATE TABLE `{$sql_table}` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`count` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`)
);INSERT INTO {$sql_table} (id,count) VALUES ('1','{$count}');";
$re=mysqli_multi_query($conn,$sql);
if(!$re){
exit('error('.mysqli_errno($conn).'):'.mysqli_error($conn));
}
}
$up = "update {$sql_table} set count=count+1 where id='1'";
mysqli_multi_query($conn,$up);
mysqli_close($conn);
return $count;
}
} 












发表评论: