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