有很久写文章了,因为最近在写一个小项目,所以博客暂时就没有更新。
昨天交流请里有个友友问我如何实现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; } }
发表评论: