Back

JDatabase——以TXT文本形式存储的PHP数据库操作类0.2.1发布——抛弃MySQL!

mysql一般的数据库防注入、读取什么的都很麻烦。特别是MySQL数据库的搬运,不在同一个网站空间。编写ASP的人用access数据库,可是虽然说php也可以调用access,但是需要odbc,并且如果用它开发项目还涉及到版权问题。之后就尝试使用ini文件读取的方法来存储数据,但...

mysql一般的数据库防注入、读取什么的都很麻烦。特别是MySQL数据库的搬运,不在同一个网站空间。编写ASP的人用access数据库,可是虽然说php也可以调用access,但是需要odbc,并且如果用它开发项目还涉及到版权问题。之后就尝试使用ini文件读取的方法来存储数据,但是又太麻烦,于是JDatabase就此诞生了

<pre class="prettyprint">
<?php
/*
* 文件名:JDb.php
* 程序名:JuzeonDataBase
* 目前版本:0.2.1
* [说明:
* 本程序遵循MIT开源守则。
* 被授权人权利:
* 被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软件及软件的副本。
* 被授权人可根据程序的需要修改授权条款为适当的内容。
* 被授权人义务:
* 在软件和软件的所有副本中都必须包含版权声明和许可声明。
* 协议:
* Copyright (C) 2015 juzeon
* Permission is hereby granted, free of charge, 
* to any person obtaining a copy of this software 
* and associated documentation files (the "Software"),
* to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, 
* merge, publish, distribute, sublicense, and/or sell 
* copies of the Software, and to permit persons to whom 
* the Software is furnished to do so, subject to the 
* following conditions:
* The above copyright notice and this permission notice 
* shall be included in all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
* DEALINGS IN THE SOFTWARE.
* ]
* JDb作者:居正
* 作者网站: http://www.skyju.cc
* 文件最初创作日期:2015/05/29 晚
* (本段注释在任何时候请勿删除)
* */
class JDb{
   function createTable($table,$columns){
       $path=$this->mainpath;
       $columns="id," . $columns;
       $filedir=$path . $table . "/";
       mkdir($path . $table);
       $c=explode(",", $columns);
       $count=count($c);
       for($i=0;$i<$count;$i++){
           $file=fopen($path . $table . "/" . $c[$i] . ".php", "w");
           fwrite($file, "<?php /* #!#");
           fclose($file);
       }
   }
   function JDb($mainpath){
       $this->mainpath=$mainpath . "/";
       if(!file_exists($this->mainpath)){
           mkdir($this->mainpath);
       }
   }
   /*最初函数*/
   
   
   function read($table,$column,$name){
       $path=$this->mainpath;
       $filedir=$path . $table . "/";
       $fr=fopen($filedir . $column . ".php","r");
       $t=explode("#!#", fread($fr, filesize($filedir . $column . ".php")));
       $count=count($t);
       for($i=0;$i<$count;$i++){
           if(stripos($t[$i],$name . "=")===false){}else{
               return str_ireplace($name . "=","" , $t[$i]);
           }
       }
       return "jdb_error";
   }
   /*read函数快想吐血了,终于出来了*/
   
   function update($table,$column,$name,$newdata){
       $path=$this->mainpath;
       $filedir=$path . $table . "/";
       $fr=fopen($filedir . $column . ".php","r");
       $oldtext=fread($fr, filesize($filedir . $column . ".php"));
       $newnovel=$name . "=" . $newdata;
       $oldnovel=$name . "=" . $this->read($table, $column, $name);
       $newtext=str_ireplace($oldnovel, $newnovel, $oldtext);
       $fw=fopen($filedir . $column . ".php","w");
       fwrite($fw, $newtext);
   }
   /*update在insert的脑补之后也完成了*/
   function insert($table,$column,$name,$data){
       $path=$this->mainpath;
       $filedir=$path . $table . "/";
       $fr=fopen($filedir . $column . ".php","r");
       $fw=fopen($filedir . $column . ".php","a");
       fwrite($fw, $name . "=" . $data . "#!#");
   }
   /*最后才知道原来可以如此简单,read可以调用的*/
   
   function delete($table,$column,$name){
       $path=$this->mainpath;
       $filedir=$path . $table . "/";
       $fr=fopen($filedir . $column . ".php","r");
       $oldtext=fread($fr, filesize($filedir . $column . ".php"));
       $oldnovel=$name . "=" . $this->read($table, $column, $name);
       $newtext=str_ireplace($oldnovel . "#!#", "", $oldtext);
       $fw=fopen($filedir . $column . ".php","w");
       fwrite($fw, $newtext);
   }
   /*这次delete轻松地在update之后完成了*/
   /*呼~delete与insert第二次修改,解决了换行符方式*/
   
   function findMaxId($table){/*返回0就是没有数据*/
       $i=1;
       while(true){
           $return=$this->read($table,"id",$i);
           if($return=="jdb_error"){
               return $i-1;
           }
           $i++;
       }
   }
   function findNextId($table){/*使用insert时候下一个添加的ID值*/
       return $this->findMaxId($table)+1;
   }
   function findIdByData($table,$column,$data){/*使用一个字段的字符串查找它的ID,登录验证(判断)时可以用到*/
       $maxid=$this->findMaxId($table);
       for($i=0;$i<=$maxid;$i++){
           $result=$this->read($table,$column,$i);
           if($data==$result){
               return $i;
           }
       }
       return "jdb_error";
   }
   function idPlus($table){/*增加数据时操作ID请使用此函数,不要直接调用insert。本函数用于id++*/
       $nextid=$this->findNextId($table);
       $this->insert($table, "id",$nextid, $nextid);
   }
   function idDelete($table,$id){/*删除数据时操作ID请使用此函数,不要直接调用delete。本函数用于delete an id*/
       $this->delete($table, "id", $id);
   }
   /*新增为了操作方便的函数*/
   function debug($de){
       if($de==0){
           error_reporting(0);
       }else{
           error_reporting(-1);
       }
   }
   function killInject($str){
       $str=str_ireplace("/*","\\*", $str);
       $str=str_ireplace("*/","*\\", $str);
       $str=str_ireplace("#!#","!#!", $str);
       $str=str_ireplace("?>","?)", $str);
       return $str;
   }
}
?>

程序如上,虽然现在网络上有一个叫做txttbl的文本数据库操作类,但是好像太复杂,都看不懂。于是自己编写一个,自己用用也行。

使用教程如下:

<pre class="prettyprint">
/* 
* (echo "<meta charset='utf-8' />")
* 性质:
* \
* 【唯一性】:ID是所有字段的身份识别的标志。ID是唯一的、绝对的、安全的。在此之内任何字段可以提交唯一性,比如username可以
* 是唯一的,但是password就不行。只有唯一的字段才能使用findIdByData函数。
* \
* 
* 初始化类
* \
* require 'JDb.php';//导入jdb类文件
* $jdb=new JDb("./test");//test是你的目录(数据库)名字,随意取
* \
*
* 在test目录(数据库)下创建一个叫做tb的表
* \
* $jdb->createTable("tb","name,password");//第二个项填写的是字段(columns),不同字段之间用逗号隔开
* //其中第一个字段为id,是系统自动加上的,不需要你自己写
* \
*
* 给tb这个表加入一条数据
* \
* $nextid=$jdb->findNextId("tb");//找到下一个要添加的ID
* $jdb->insert("tb","name",$nextid,$jdb->killInject("admin"));//添加名字,并且防止注入。主键是ID,所以任何字段都得通过ID来识别。切记ID要对上号!
* $jdb->insert("tb","password",$nextid,$jdb->killInject(md5("123456789")));//添加admin的密码,并且防止注入
* $jdb->idPlus("tb");//id表++。本函数必须在所有其他字段添加完成之后调用,并由系统自动完成,不要你自己调用insert
* \
* 
* 账号密码遍历器(读所有字段内容示范)
* \
* for($i=1;$i<=$jdb->findMaxId($table);$i++){//使用for循环,查找最大的ID,如果读的字段达到了最大的ID就停止。这里切记使用<=
* 	echo "这个人的名字:" . $jdb->read("tb","name", $i);//读内容,名字是name,读取ID(主键)为$i的这个数据
* 	echo "&nbsp;&nbsp";
* 	echo "这个人的密码:" . $jdb->read("tb","password", $i);
* 	echo "<br/>";
* }
* \
* 
* 登录验证(ID与findIdByData的使用)
* \
* $name="admin";
* $password=md5("123456789");//这里实际使用时是传入的参数
* $name_id=findIdByData("tb","name",$name);//因为name有唯一性,所以使用findIdByData
* $id_password=read("tb","password",$name_id);//因为password有不唯一性,所以通过主键ID读取对应的password
* if($password==$id_password){//通过输入的密码和数据库读取到的密码判断是否正确
* 	//登录成功
* }else{
* 	//登录失败
* }
* \
* 
* 删除一个数据(idDelete和delete函数的使用)
* \
* //比如我要删除一个名字是admin的人,我可以这样操作
* $name="admin";//名字是admin的人
* $id=findIdByData("tb","name",$name);//找到这个人的ID。注意此处的name(用户名)必须具有唯一性
* $jdb->delete("tb","name",$id);//删除这个人的名字
* $jdb->delete("tb","password",$id);//删除这个人的密码
* $jdb->idDelete("tb",$id);//最后删除这个人的ID表
* \
* 
* */

要是有需要就拿去用吧,目前版本是0.2.1,如果有bug可以在评论里面说,我会完善的

Licensed under CC BY-NC-SA 4.0
-1