异世界

— 居正 And RUI_wj 's BLOG

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

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是一个大项目,正在持续更新,不断完善,速度越来越快,功能越来越多,越来越可靠!

<?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的代码中已经包括了使用的教程与实例,没有厚厚的帮助手册,查看几段简单的教程就可以轻松上手,毫无压力!

发表评论:

Powered By Z-BlogPHP 1.5.2 Zero

搭建与于2014/12,RUI_wj 居正 所有。