手机
当前位置:查字典教程网 >编程开发 >php教程 >加强版phplib的DB类
加强版phplib的DB类
摘要:复制代码代码如下:

复制代码 代码如下:

<?php

/****************************************************************************************************************

为了便于自己的开发,又不想使用ADODB、PEAR::DB这样的庞然大物,

就用在PHPLibDB类的基础上、参考PEAR::DB类,封装的DB类,简单好使,非常方便。

MySQL有效

[连接数据库]

//包含数据库处理类文件

include_once("database.inc.php");

//本地数据库配置

define("DB_HOST","localhost");//数据库服务器

define("DB_USER_NAME","root");//数据库用户名

define("DB_USER_PASS","");//密码

define("DB_DATABASE","test");//数据库

//连接本地数据库

$db=newDB_Sql();

$db->connect(DB_DATABASE,DB_HOST,DB_USER_NAME,DB_USER_PASS);

[使用方法]

//获取所有记录

$sql="SELECT*FROMtable1";

$all_record=$db->get_all($sql);

//获取一条

$sql="SELECT*FROMtable1WHEREid='1'";

$one_row=$db->get_one($sql);

//分页查询,提取20条记录

$sql="SELECT*FROMtable1";

$page_record=$db->limit_query($sql,$start=0,$offset=20,$order="ORDERBYidDESC");

//提取指定数目的记录

$sql="SELECT*FROMtable1";

$limit_record=$db->get_limit($sql,10);

//统计记录数,统计所有类型为学生的

$count=$db->count("table1","id","type='student'");

//插入一条记录

$info_array=array(

"name"=>"heiyeluren",

"type"=>"student",

"age"=>"22",

"gender"=>"boy"

);

$db->insert("table1",$info_array);

//更新一条记录

$info_array=array(

"name"=>"heiyeluren",

"type"=>"teacher",

"age"=>"22",

"gender"=>"boy"

);

$db->update("table1",$info_array,"name='heiyeluren'");

//删除记录

$db->delete("table1","name='heiyeluren'");

//执行一条无结果集的SQL

$db->execute("DELETEFROMtable1WHEREname='heiyeluren'");

********************************************************************************************************/

/**

*文件:database.inc.php

*描述:数据库操作类

*说明:本库使用PHPLibDB库作为核心,同时增加一些实用方法,详细参考注释

*/

classDB_Sql

{

/*public:connectionparameters*/

var$Host="";

var$Database="";

var$User="";

var$Password="";

/*public:configurationparameters*/

var$Auto_Free=1;##Setto1forautomaticmysql_free_result()

var$Debug=0;##Setto1fordebuggingmessages.

var$Halt_On_Error="yes";##"yes"(haltwithmessage),"no"(ignoreerrorsquietly),"report"(ignoreerrror,butspitawarning)

var$PConnect=0;##Setto1tousepersistentdatabaseconnections

var$Seq_Table="db_sequence";

/*public:resultarrayandcurrentrownumber*/

var$Record=array();

var$Row;

/*public:currenterrornumberanderrortext*/

var$Errno=0;

var$Error="";

/*public:thisisanapirevision,notaCVSrevision.*/

var$type="mysql";

//var$revision="1.2";

/*private:linkandqueryhandles*/

var$Link_ID=0;

var$Query_ID=0;

var$locked=false;##settotruewhilewehavealock

/*public:constructor*/

functionDB_Sql(){

$this->query($query);

}

/*public:sometrivialreporting*/

functionlink_id(){

return$this->Link_ID;

}

functionquery_id(){

return$this->Query_ID;

}

/*public:connectionmanagement*/

functionconnect($Database="",$Host="",$User="",$Password=""){

/*Handledefaults*/

if(""==$Database)

$Database=$this->Database;

if(""==$Host)

$Host=$this->Host;

if(""==$User)

$User=$this->User;

if(""==$Password)

$Password=$this->Password;

/*establishconnection,selectdatabase*/

if(0==$this->Link_ID){

if(!$this->PConnect){

$this->Link_ID=mysql_connect($Host,$User,$Password);

}else{

$this->Link_ID=mysql_pconnect($Host,$User,$Password);

}

if(!$this->Link_ID){

$this->halt("connect($Host,$User,$Password)failed.");

return0;

}

if(!@mysql_select_db($Database,$this->Link_ID)){

$this->halt("cannotusedatabase".$Database);

return0;

}

}

return$this->Link_ID;

}

/*public:discardthequeryresult*/

functionfree(){

@mysql_free_result($this->Query_ID);

$this->Query_ID=0;

}

/*public:performaquery*/

functionquery($Query_String){

/*Noemptyqueries,please,sincePHP4chokesonthem.*/

if($Query_String=="")

/*Theemptyquerystringispassedonfromtheconstructor,

*whencallingtheclasswithoutaquery,e.g.insituations

*likethese:'$db=newDB_Sql_Subclass;'

*/

return0;

if(!$this->connect()){

return0;/*wealreadycomplainedinconnect()aboutthat.*/

};

#Newquery,discardpreviousresult.

if($this->Query_ID){

$this->free();

}

if($this->Debug)

printf("Debug:query=%s<br>n",$Query_String);

$this->Query_ID=@mysql_query($Query_String,$this->Link_ID);

$this->Row=0;

$this->Errno=mysql_errno();

$this->Error=mysql_error();

if(!$this->Query_ID){

$this->halt("InvalidSQL:".$Query_String);

}

#Willreturnnadaifitfails.That'sfine.

return$this->Query_ID;

}

/*public:walkresultset*/

functionnext_record(){

if(!$this->Query_ID){

$this->halt("next_recordcalledwithnoquerypending.");

return0;

}

$this->Record=@mysql_fetch_array($this->Query_ID);

$this->Row+=1;

$this->Errno=mysql_errno();

$this->Error=mysql_error();

$stat=is_array($this->Record);

if(!$stat&&$this->Auto_Free){

$this->free();

}

return$stat;

}

/*public:positioninresultset*/

functionseek($pos=0){

$status=@mysql_data_seek($this->Query_ID,$pos);

if($status)

$this->Row=$pos;

else{

$this->halt("seek($pos)failed:resulthas".$this->num_rows()."rows.");

/*halfassedattempttosavetheday,

*butdonotconsiderthisdocumentedoreven

*desireablebehaviour.

*/

@mysql_data_seek($this->Query_ID,$this->num_rows());

$this->Row=$this->num_rows();

return0;

}

return1;

}

/*public:tablelocking*/

functionlock($table,$mode="write"){

$query="locktables";

if(is_array($table)){

while(list($key,$value)=each($table)){

//textkeysare"read","readlocal","write","lowprioritywrite"

if(is_int($key))$key=$mode;

if(strpos($value,",")){

$query.=str_replace(",","$key,",$value)."$key,";

}else{

$query.="$value$key,";

}

}

$query=substr($query,0,-2);

}elseif(strpos($table,",")){

$query.=str_replace(",","$mode,",$table)."$mode";

}else{

$query.="$table$mode";

}

if(!$this->query($query)){

$this->halt("lock()failed.");

returnfalse;

}

$this->locked=true;

returntrue;

}

functionunlock(){

//setbeforeunlocktoavoidpotentialloop

$this->locked=false;

if(!$this->query("unlocktables")){

$this->halt("unlock()failed.");

returnfalse;

}

returntrue;

}

/*public:evaluatetheresult(size,width)*/

functionaffected_rows(){

return@mysql_affected_rows($this->Link_ID);

}

functionnum_rows(){

return@mysql_num_rows($this->Query_ID);

}

functionnum_fields(){

return@mysql_num_fields($this->Query_ID);

}

/*public:shorthandnotation*/

functionnf(){

return$this->num_rows();

}

functionnp(){

print$this->num_rows();

}

functionf($Name){

if(isset($this->Record[$Name])){

return$this->Record[$Name];

}

}

functionp($Name){

if(isset($this->Record[$Name])){

print$this->Record[$Name];

}

}

/*public:sequencenumbers*/

functionnextid($seq_name){

/*ifnocurrentlock,locksequencetable*/

if(!$this->locked){

if($this->lock($this->Seq_Table)){

$locked=true;

}else{

$this->halt("cannotlock".$this->Seq_Table."-hasitbeencreated?");

return0;

}

}

/*getsequencenumberandincrement*/

$q=sprintf("selectnextidfrom%swhereseq_name='%s'",

$this->Seq_Table,

$seq_name);

if(!$this->query($q)){

$this->halt('queryfailedinnextid:'.$q);

return0;

}

/*Nocurrentvalue,makeone*/

if(!$this->next_record()){

$currentid=0;

$q=sprintf("insertinto%svalues('%s',%s)",

$this->Seq_Table,

$seq_name,

$currentid);

if(!$this->query($q)){

$this->halt('queryfailedinnextid:'.$q);

return0;

}

}else{

$currentid=$this->f("nextid");

}

$nextid=$currentid+1;

$q=sprintf("update%ssetnextid='%s'whereseq_name='%s'",

$this->Seq_Table,

$nextid,

$seq_name);

if(!$this->query($q)){

$this->halt('queryfailedinnextid:'.$q);

return0;

}

/*ifnextid()lockedthesequencetable,unlockit*/

if($locked){

$this->unlock();

}

return$nextid;

}

/*public:returntablemetadata*/

functionmetadata($table="",$full=false){

$count=0;

$id=0;

$res=array();

/*

*DuetocompatibilityproblemswithTablewechangedthebehavior

*ofmetadata();

*dependingon$full,metadatareturnsthefollowingvalues:

*

*-fullisfalse(default):

*$result[]:

*[0]["table"]tablename

*[0]["name"]fieldname

*[0]["type"]fieldtype

*[0]["len"]fieldlength

*[0]["flags"]fieldflags

*

*-fullistrue

*$result[]:

*["num_fields"]numberofmetadatarecords

*[0]["table"]tablename

*[0]["name"]fieldname

*[0]["type"]fieldtype

*[0]["len"]fieldlength

*[0]["flags"]fieldflags

*["meta"][fieldname]indexoffieldnamed"fieldname"

*Thislastonecouldbeusedifyouhaveafieldname,butnoindex.

*Test:if(isset($result['meta']['myfield'])){...

*/

//ifno$tablespecified,assumethatweareworkingwithaquery

//result

if($table){

$this->connect();

$id=@mysql_list_fields($this->Database,$table);

if(!$id){

$this->halt("Metadataqueryfailed.");

returnfalse;

}

}else{

$id=$this->Query_ID;

if(!$id){

$this->halt("Noqueryspecified.");

returnfalse;

}

}

$count=@mysql_num_fields($id);

//madethisIFduetoperformance(oneifisfasterthan$countif's)

if(!$full){

for($i=0;$i<$count;$i++){

$res[$i]["table"]=@mysql_field_table($id,$i);

$res[$i]["name"]=@mysql_field_name($id,$i);

$res[$i]["type"]=@mysql_field_type($id,$i);

$res[$i]["len"]=@mysql_field_len($id,$i);

$res[$i]["flags"]=@mysql_field_flags($id,$i);

}

}else{//full

$res["num_fields"]=$count;

for($i=0;$i<$count;$i++){

$res[$i]["table"]=@mysql_field_table($id,$i);

$res[$i]["name"]=@mysql_field_name($id,$i);

$res[$i]["type"]=@mysql_field_type($id,$i);

$res[$i]["len"]=@mysql_field_len($id,$i);

$res[$i]["flags"]=@mysql_field_flags($id,$i);

$res["meta"][$res[$i]["name"]]=$i;

}

}

//freetheresultonlyifwewerecalledonatable

if($table){

@mysql_free_result($id);

}

return$res;

}

/*public:findavailabletablenames*/

functiontable_names(){

$this->connect();

$h=@mysql_query("showtables",$this->Link_ID);

$i=0;

while($info=@mysql_fetch_row($h)){

$return[$i]["table_name"]=$info[0];

$return[$i]["tablespace_name"]=$this->Database;

$return[$i]["database"]=$this->Database;

$i++;

}

@mysql_free_result($h);

return$return;

}

/*private:errorhandling*/

functionhalt($msg){

$this->Error=@mysql_error($this->Link_ID);

$this->Errno=@mysql_errno($this->Link_ID);

if($this->locked){

$this->unlock();

}

if($this->Halt_On_Error=="no")

return;

$this->haltmsg($msg);

if($this->Halt_On_Error!="report")

die("Sessionhalted.");

}

functionhaltmsg($msg){

printf("</td></tr></table><b>Databaseerror:</b>%s<br>n",$msg);

printf("<b>MySQLError</b>:%s(%s)<br>n",

$this->Errno,

$this->Error);

}

//----------------------------------

//模块:自定义函数

//功能:部分实用的数据库处理方法

//作者:heiyeluren

//时间:2005-12-26

//----------------------------------

/**

*方法:execute($sql)

*功能:执行一条SQL语句,主要针对没有结果集返回的SQL

*参数:$sql需要执行的SQL语句,例如:execute("DELETEFROMtable1WHEREid='1'")

*返回:更新成功返回True,失败返回False

*/

functionexecute($sql)

{

if(empty($sql))

{

$this->error("Invalidparameter");

}

if(!$this->query($sql))

{

returnfalse;

}

returntrue;

}

/**

*方法:get_all($sql)

*功能:获取SQL执行的所有记录

*参数:$sql需要执行的SQL,例如:get_all("SELECT*FROMTable1")

*返回:返回包含所有查询结果的二维数组

*/

functionget_all($sql)

{

$this->query($sql);

$result_array=array();

while($this->next_record())

{

$result_array[]=$this->Record;

}

if(count($result_array)<=0)

{

return0;

}

return$result_array;

}

/**

*方法:get_one($sql)

*功能:获取SQL执行的一条记录

*参数:$sql需要执行的SQL,例如:get_one("SELECT*FROMTable1WHEREid='1'")

*返回:返回包含一条查询结果的一维数组

*/

functionget_one($sql)

{

$this->query($sql);

if(!$this->next_record())

{

return0;

}

return$this->Record;

}

/**

*方法:get_limit($sql,$limit)

*功能:获取SQL执行的指定数量的记录

*参数:

*$sql需要执行的SQL,例如:SELECT*FROMTable1

*$limit需要限制的记录数

*例如需要获取10条记录,get_limit("SELECT*FROMTable1",10);

*

*返回:返回包含所有查询结果的二维数组

*/

functionget_limit($sql,$limit)

{

$this->query($sql);

$result_array=array();

for($i=0;$i<$limit&&$this->next_record();$i++)

{

$result_array[]=$this->Record;

}

if(count($result_array)<=0)

{

return0;

}

return$result_array;

}

/**

*方法:limit_query($sql,$start=0,$offset=20,$order="")

*功能:为分页的获取SQL执行的指定数量的记录

*参数:

*$sql需要执行的SQL,例如:SELECT*FROMTable1

*$start记录的开始数,缺省为0

*$offset记录的偏移量,缺省为20

*$order排序方式,缺省为空,例如:ORDERBYidDESC

*例如需要获取从0到10的记录并且按照ID号倒排,get_limit("SELECT*FROMTable1",0,10,"ORDERBYidDESC");

*

*返回:返回包含所有查询结果的二维数组

*/

functionlimit_query($sql,$start=0,$offset=20,$order="")

{

$sql=$sql."$orderLIMIT$start,$offset";

$this->query($sql);

$result=array();

while($this->next_record())

{

$result[]=$this->Record;

}

if(count($result)<=0)

{

return0;

}

return$result;

}

/**

*方法:count($table,$field="*",$where="")

*功能:统计表中数据总数

*参数:

*$table需要统计的表名

*$field需要统计的字段,默认为*

*$where条件语句,缺省为空

*例如按照ID统计所有年龄小于20岁的用户,count("user_table","id","user_age<20")

*

*返回:返回统计结果的数字

*/

functioncount($table,$field="*",$where="")

{

$sql=(empty($where)?"SELECTCOUNT($field)FROM$table":"SELECTCOUNT($field)FROM$tableWHERE$where");

$result=$this->get_one($sql);

if(!is_array($result))

{

return0;

}

return$result[0];

}

/**

*方法:insert($table,$dataArray)

*功能:插入一条记录到表里

*参数:

*$table需要插入的表名

*$dataArray需要插入字段和值的数组,键为字段名,值为字段值,例如:array("user_name"=>"张三","user_age"=>"20岁");

*例如比如插入用户张三,年龄为20,insert("users",array("user_name"=>"张三","user_age"=>"20岁"))

*

*返回:插入记录成功返回True,失败返回False

*/

functioninsert($table,$dataArray)

{

if(!is_array($dataArray)||count($dataArray)<=0)

{

$this->error("Invalidparameter");

}

while(list($key,$val)=each($dataArray))

{

$field.="$key,";

$value.="'$val',";

}

$field=substr($field,0,-1);

$value=substr($value,0,-1);

$sql="INSERTINTO$table($field)VALUES($value)";

if(!$this->query($sql))

{

returnfalse;

}

returntrue;

}

/**

*方法:update($talbe,$dataArray,$where)

*功能:更新一条记录

*参数:

*$table需要更新的表名

*$dataArray需要更新字段和值的数组,键为字段名,值为字段值,例如:array("user_name"=>"张三","user_age"=>"20岁");

*$where条件语句

*例如比如更新姓名为张三的用户为李四,年龄为21

*update("users",array("user_name"=>"张三","user_age"=>"20岁"),"user_name='张三'")

*

*返回:更新成功返回True,失败返回False

*/

functionupdate($talbe,$dataArray,$where)

{

if(!is_array($dataArray)||count($dataArray)<=0)

{

$this->error("Invalidparameter");

}

while(list($key,$val)=each($dataArray))

{

$value.="$key='$val',";

}

$value=substr($value,0,-1);

$sql="UPDATE$talbeSET$valueWHERE$where";

if(!$this->query($sql))

{

returnfalse;

}

returntrue;

}

/**

*方法:delete($table,$where)

*功能:删除一条记录

*参数:

*$table需要删除记录的表名

*$where需要删除记录的条件语句

*例如比如要删除用户名为张三的用户,delete("users","user_name='张三'")

*

*返回:更新成功返回True,失败返回False

*/

functiondelete($table,$where)

{

if(empty($where))

{

$this->error("Invalidparameter");

}

$sql="DELETEFROM$tableWHERE$where";

if(!$this->query($sql))

{

returnfalse;

}

returntrue;

}

/**

*方法:error($msg="")

*功能:显示错误信息后中止脚本

*参数:$msg需要显示的错误信息

*返回:无返回

*/

functionerror($msg="")

{

echo"<strong>Error</strong>:$msgn<br>n";

exit();

}

/**

*方法:get_insert_id()

*功能:获取最后插入的ID

*参数:无参数

*返回:关闭成功返回ID,失败返回0

*/

functionget_insert_id()

{

returnmysql_insert_id($this->Link_ID);

}

/**

*方法:close()

*功能:关闭当前数据库连接

*参数:无参数

*返回:关闭成功返回true,失败返回false

*/

functionclose()

{

returnmysql_close($this->Link_ID);

}

}

?>

【加强版phplib的DB类】相关文章:

PHP使用flock实现文件加锁的方法

输出控制类

我常用的几个类

通过对服务器端特性的配置加强php的安全

3种平台下安装php4经验点滴

php简单操作mysql数据库的类

十天学会php之第四天

php4的彩蛋

深入浅出php socket编程

WIN98下Apache1.3.14+PHP4.0.4的安装

精品推荐
分类导航