Back

JDatabase-基于PHP以文本储存的数据库0.2.3震撼发布!-抛弃MySQL!

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

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

你是否觉得PHP的数据存储是个很大的问题?虽然MySQL具有多方面的优点,但其最大的、也是最让我们头疼的缺点就是数据备份、搬迁超级不方便!与asp相比php是优点胜于缺点的,但为了数据库的问题不少站长可是操碎了心。接下来让我们对比一下MySQL网站与JDb网站之间的不同点:

MySQL运行环境: 服务器必须安装MySQL程序,连接速度慢 JDb: 只需一个php class类,全网通用

MySQL的数据搬迁: 备份网站文件;使用phpmyadmin备份数据库,还要注意编码问题 JDb的网站搬迁: 备份网站文件,数据库同时备份了,非常方便

MySQL的防注入: 没有任何防注入机制,数据库极易被入侵 JDb的防注入: 自带检查注入的函数,一键防止注入,安全有保障

JDb就如一个php脚本数据库,无需安装;将数据文件保存在网站空间上,备份方便;随着版本的更新JDb也越来越快速、安全、简单,让小型数据存储更加方便快捷!

JDb遵守MIT开源协议,任何组织或个人都可以随意更改与发布,但注意保留版权注释。

JDb是一个大项目,正在持续更新,不断完善,速度越来越快,功能越来越多,越来越可靠!

<pre class="prettyprint">
<?php
/*
* 文件名:JDb.php
* 程序名:JuzeonDataBase
* 目前版本:0.2.3
* [说明:
* 本程序遵循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");
           if(flock($file, LOCK_EX)){
               fwrite($file, "<?php /* #!#");
               flock($file, LOCK_UN);
           }
       }
   }
   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");
       if(flock($fr, LOCK_EX)){
           $t=explode("#!#", fread($fr, filesize($filedir . $column . ".php")));
           flock($fr, LOCK_UN);
       }
       $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");
       if(flock($fr, LOCK_EX)){
           $oldtext=fread($fr, filesize($filedir . $column . ".php"));
           flock($fr,LOCK_UN);
       }
       $newnovel=$name . "=" . $newdata;
       $oldnovel=$name . "=" . $this->read($table, $column, $name);
       $newtext=str_ireplace($oldnovel, $newnovel, $oldtext);
       $fw=fopen($filedir . $column . ".php","w");
       if(flock($fw,LOCK_EX)){
           fwrite($fw, $newtext);
           flock($fw, LOCK_UN);
       }
   }
   /*update在insert的脑补之后也完成了*/
   function insert($table,$column,$name,$data){
       $path=$this->mainpath;
       $filedir=$path . $table . "/";
       $fw=fopen($filedir . $column . ".php","a");
       if(flock($fw, LOCK_EX)){
           fwrite($fw, $name . "=" . $data . "#!#");
           flock($fw, LOCK_UN);
       }
   }
   /*最后才知道原来可以如此简单,read可以调用的*/
   
   function delete($table,$column,$name){
       $path=$this->mainpath;
       $filedir=$path . $table . "/";
       $fr=fopen($filedir . $column . ".php","r");
       if(flock($fw, LOCK_EX)){
           $oldtext=fread($fr, filesize($filedir . $column . ".php"));
           flock($fw, LOCK_UN);
       }
       $oldnovel=$name . "=" . $this->read($table, $column, $name);
       $newtext=str_ireplace($oldnovel . "#!#", "", $oldtext);
       $fw=fopen($filedir . $column . ".php","w");
       if(flock($fw, LOCK_EX)){
           fwrite($fw, $newtext);
           flock($fw,LOCK_UN);
       }
   }
   /*这次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;
   }
}

/* 使用实例:(此处在使用时可以删除)
* (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表
* \
* 
* */
?>

JDb下载地址:http://pan.baidu.com/s/1c08lTMo

JDb使用范例: http://ec.skyju.cc

在JDb的代码中已经包括了使用的教程与实例,没有厚厚的帮助手册,查看几段简单的教程就可以轻松上手,毫无压力!

Licensed under CC BY-NC-SA 4.0
-1