PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » PHP资源共享 » 给一个朋友的db类!(经过我扩展功能的)
本页主题: 给一个朋友的db类!(经过我扩展功能的) 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

自由的龙

该用户目前不在线
级别: 中级程序员
精华: 1
发帖: 1264
威望: 1267 点
金钱: 12660 PYMB
贡献值: 0 点
在线时间:0(小时)
注册时间:2006-04-16
最后登录:2006-06-27

给一个朋友的db类!(经过我扩展功能的)


db类:db_mysql.php


CODE:[Copy to clipboard]<?php

class mysql {

  var $Host;
  var $Database;
  var $User;
  var $Password;

  var $table;                             //数据表
  var $errMes     =array();                   //记录错误信息
  var $field     =array();                   //查询字段

  function mysql($host, $dbuser, $dbpass, $db)
  {
    $this->Host = $host; //主机
    $this->User = $dbuser; //用户
    $this->Password = $dbpass; //密码
    $this->Database = $db; //数据库名    
  }

  var $Auto_Free = 0; ## Set to 1 for automatic mysql_free_result()
  var $Debug = 0; ## Set to 1 for debugging messages.
  var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
  var $Seq_Table = "db_sequence";

  var $Record = array();
  var $Row;

  var $Errno = 0;
  var $Error = "";

  var $type = "mysql";
  var $revision = "1.2";

  var $Link_ID = 0;
  var $Query_ID = 0;

  function DB_Sql($query = "")
  {
    $this->query($query);
  }

  function link_id()
  {
    return $this->Link_ID;
  }

  function query_id()
  {
    return $this->Query_ID;
  }

  function connect($Database = "", $Host = "", $User = "", $Password = "")
  {

    if ("" == $Database)
        $Database = $this->Database;
    if ("" == $Host)
        $Host = $this->Host;
    if ("" == $User)
        $User = $this->User;
    if ("" == $Password)
        $Password = $this->Password;

    if (0 == $this->Link_ID) {
        $this->Link_ID = mysql_pconnect($Host, $User, $Password);
        if (!$this->Link_ID) {
          $this->halt("pconnect($Host, $User, $Password) failed.");
          return 0;
        }

        if (!@mysql_select_db($Database, $this->Link_ID)) {
          $this->halt("cannot use database " . $this->Database);
          return 0;
        }
    }

    return $this->Link_ID;
  }

  function free()
  {
    @mysql_free_result($this->Query_ID);
    $this->Query_ID = 0;
  }

  function query($Query_String)
  {

    if ($Query_String == "")

        return 0;

    if (!$this->connect()) {
        return 0;

    } ;
    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();
    if (!$this->Query_ID) {
        $this->halt("Invalid SQL: " . $Query_String);
    }
    return $this->Query_ID;
  }

  function result()
  {
    if (!$this->Query_ID) {
        $this->halt("result called with no query pending.");
        return 0;
    }

    $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;
  }

  function seek($pos = 0)
  {
    $status = @mysql_data_seek($this->Query_ID, $pos);
    if ($status)
        $this->Row = $pos;
    else {
        $this->halt("seek($pos) failed: result has " . $this->num_rows() . " rows");

        @mysql_data_seek($this->Query_ID, $this->num_rows());
        $this->Row = $this->num_rows;
        return 0;
    }

    return 1;
  }

  function lock($table, $mode = "write")
  {
    $this->connect();

    $query = "lock tables ";
    if (is_array($table)) {
        while (list($key, $value) = each($table)) {
          if ($key == "read" && $key != 0) {
            $query .= "$value read, ";
          } else {
            $query .= "$value $mode, ";
          }
        }
        $query = substr($query, 0, -2);
    } else {
        $query .= "$table $mode";
    }
    $res = @mysql_query($query, $this->Link_ID);
    if (!$res) {
        $this->halt("lock($table, $mode) failed.");
        return 0;
    }
    return $res;
  }

  function unlock()
  {
    $this->connect();

    $res = @mysql_query("unlock tables");
    if (!$res) {
        $this->halt("unlock() failed.");
        return 0;
    }
    return $res;
  }

  function affected_rows()
  {
    return @mysql_affected_rows($this->Link_ID);
  }

  function num_rows()
  {
    return @mysql_num_rows($this->Query_ID);
  }

  function num_fields()
  {
    return @mysql_num_fields($this->Query_ID);
  }

  function nf()
  {
    return $this->num_rows();
  }

  function np()
  {
    print $this->num_rows();
  }

  function f($Name)
  {
    return $this->Record[$Name];
  }

  function p($Name)
  {
    print $this->Record[$Name];
  }

  function nextid($seq_name)
  {
    $this->connect();

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

        $q = sprintf("select nextid from %s where seq_name = '%s'",
          $this->Seq_Table,
          $seq_name);
        $id = @mysql_query($q, $this->Link_ID);
        $res = @mysql_fetch_array($id);

        if (!is_array($res)) {
          $currentid = 0;
          $q = sprintf("insert into %s values('%s', %s)",
            $this->Seq_Table,
            $seq_name,
            $currentid);
          $id = @mysql_query($q, $this->Link_ID);
        } else {
          $currentid = $res["nextid"];
        }
        $nextid = $currentid + 1;
        $q = sprintf("update %s set nextid = '%s' where seq_name = '%s'",
          $this->Seq_Table,
          $nextid,
          $seq_name);
        $id = @mysql_query($q, $this->Link_ID);
        $this->unlock();
    } else {
        $this->halt("cannot lock " . $this->Seq_Table . " - has it been created?");
        return 0;
    }
    return $nextid;
  }

  function metadata($table = '', $full = false)
  {
    $count = 0;
    $id = 0;
    $res = array();
    if ($table) {
        $this->connect();
        $id = @mysql_list_fields($this->Database, $table);
        if (!$id)
          $this->halt("Metadata query failed.");
    } else {
        $id = $this->Query_ID;
        if (!$id)
          $this->halt("No query specified.");
    }

    $count = @mysql_num_fields($id);
    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;
        }
    }
    if ($table) @mysql_free_result($id);
    return $res;
  }

  function halt($msg)
  {
    $this->Error = @mysql_error($this->Link_ID);
    $this->Errno = @mysql_errno($this->Link_ID);
    if ($this->Halt_On_Error == "no")
        return;

    $this->haltmsg($msg);

    if ($this->Halt_On_Error != "report")
        die("Session halted.");
  }

  function haltmsg($msg)
  {
    printf("</td></tr></table><b>Database error:</b> %s<br>n", $msg);
    printf("<b>MySQL Error</b>: %s (%s)<br>n",
        $this->Errno,
        $this->Error);
  }

  function table_names()
  {
    $this->query("SHOW TABLES");
    $i = 0;
    while ($info = mysql_fetch_row($this->Query_ID)) {
        $return[$i]["table_name"] = $info[0];
        $return[$i]["tablespace_name"] = $this->Database;
        $return[$i]["database"] = $this->Database;
        $i++;
    }
    return $return;
  }

  function getResArray()
  {
    return @mysql_fetch_array($this->Query_ID);
  }

  function getResTotal(){
    return @mysql_num_rows($this->Query_ID);
  }
 
  /*****************无魂扩展部分***************/
 
  /*
    *方法   setTable
    *功能   设定查询表名
    *参数   $t     表名
    *返回   无
  */
  function setTable($t){
    $this->table=$f;
  }//end fun setTable


  /*
    *方法   getField
    *功能   取得要查询的记录
    *参数   $f         记录数组
    *返回   string
  */
  function getField($f=array()){
    $this->field=$f;
    if(empty($f)){
        $this->errMes[]="记录不为空";
        $this->mes();
    }
    foreach($f as $v){
        $field.=$v.",";
    }
    $field=substr($field,0,-1);
    return $field;
  }//end fun getField

  /*
    *方法   setFiled
    *功能   设定字段
    *参数   $f     字段
    *返回   无
  */
  function setField($f=array()){
    $this->field=$f;
  }//end fun setFiled

  /*
    *方法   getRes
    *功能   得到用户记录
    *参数   $f     字段
    *返回   无
  */
  function getRes($sql){
    $this->query($sql);
    while($this->result()){
        foreach($this->field as $v){
          $res[$v][]=$this->f($v);
        }
    }
    return $res;
  }//end fun getRes
 

  /*
    *方法   getAmount
    *功能   得到数量
    *参数   $t     表名
          $w     条件
    *返回   ini
  */
  function getAmount($t,$w=''){
    $sql="select count(*) as tot from $t ";
    if(!empty($w))$sql.=$w;
    //echo $sql;
    $this->query($sql);
    $this->result();
    $tot=$this->f("tot");
    return $tot;
  }//end fun getAmount

  /*
    *方法   mes
    *功能   显示错误信息
    *参数   无
    *返回   无
  */
  function mes(){
    if(count($this->errMes)!=0){
        foreach($this->errMes as $v){
          echo '<FONT SIZE="" COLOR="#FF0000">[无魂报告]:</FONT>'.$v."<br>";
        }
        echo BACK;
        exit;
    }else{
        //echo "^_^恭喜,操作成功!<br>";
    }
  }//end fun mes



  function closeDb()
  {
    @mysql_close($this->Link_ID);
  }
}//end class db_mysql.php

?>
然后配合我的Sql类进行得到sql语句..这里我就写了sel部分...


CODE:[Copy to clipboard]<?php
//****************Sql类*******************
//***************************************
//****                       ****
//****     作者:   无魂           ****
//****     日期:   2004-3-26       ****
//****     版本:   1.0           ****
//****     版权:   无魂           ****
//****                       ****
//***************************************
//***************************************
require_once("Base.class.php");
/*
  *类名   Sql
  *功能   Sql类
  *版本   1.0
  *日期   2004-3-26
  *作者   无魂
  *版权   无魂
  *说明   无
*/
class Sql extends Base{

  var $table;                           //表
  var $where         ='';                 //条件
  var $order         ='';                 //排序
  var $limit;                           //查询范围
 
  /*
    *方法   getSql
    *功能   取得Sql语句
    *参数   $field         字段值
    *返回   string
  */
  function getSel($field){
    if(empty($field)){
        $this->errMes[]="参数不能为空";
        parent::mes();
    }
    $sql="select ".$field." from ".$this->table." ".$this->where." ".$this->order." ".$this->limit;
    return $sql;
  }//end fun getSel

  /*
    *方法   getDel
    *功能   取得删除语句
    *参数   $field         字段值
    *返回   array
  */
  function getDel($field){
    if(empty($field)){
        $this->errMes[]="参数不能为空";
        parent::mes();
    }
    $sql="select ".$field." from ".$this->table." ".$this->where." ".$this->order;
    return $sql;
  }//end fun getDel


 
  /* ======>set部分<======= */

  /*
    *方法   setTable
    *功能   设定表
    *参数   $t         表名
    *返回   无
  */
  function setTable($t){
    $this->table=$t;
  }//end fun setTable

  /*
    *方法   setWhere
    *功能   设定条件
    *参数   $w         条件
    *返回   无
  */
  function setWhere($w){
    $this->where=$w;
  }//end fun setWhere

  /*
    *方法   setOrder
    *功能   设定排序
    *参数   $o         排序
    *返回   无
  */
  function setOrder($o){
    $this->order=$o;
  }//end fun setOrder

  /*
    *方法   setLimit
    *功能   设定排序
    *参数   $o         排序
    *返回   无
  */
  function setLimit($m,$f=0){
    $this->limit="limit $f,$m";
  }//end fun setLimit


}//end class Sql

?>
下面是Sql类用到的base类...进行错误报告和一下基本常用的功能的.....(可以不用base然后把 "class Sql extends Base{" 中的extends Base去掉..

base类:Base.class.php


CODE:[Copy to clipboard]<?php
//****************基础类*******************
//***************************************
//****                       ****
//****     作者:   无魂           ****
//****     日期:   2004-3-26       ****
//****     版本:   1.0           ****
//****     版权:   无魂           ****
//****                       ****
//***************************************
//***************************************

/*
  *类名   Base
  *功能   基础类
  *版本   1.0
  *日期   2004-3-26
  *作者   无魂
  *版权   无魂
  *说明   无
*/
class Base {
  var $errMes           =array();             //记录消息
 
  /*
    *方法   substrGb
    *功能   中文截取
    *参数   $str     要截取字符串
          $start     从什么地方开始
          $len     到什么地方
    *返回   string
  */
  function substrGb($str,$start,$len){
    for($i=0;$i<$start+$len;$i++){
        $tmpstr=(ord($str[$i])>=161 && ord($str[$i])<=247&& ord($str[$i+1])>=161 && ord($str[$i+1])<=254)?$str[$i].$str[++$i]:$tmpstr=$str[$i];
        if ($i>=$start&&$i<($start+$len))$tmp .=$tmpstr;
    }
    return $tmp;
  }//end fun substrGb

  /*
    *方法   getImg
    *功能   上传图片并返回图片名称
    *参数   $path     物理路径
    *返回   string
    *说明   需要upload.php类
  */
  function getImg($img,$path){
    if(!empty($img)){
        require_once("upload.class.php");
        foreach($img as $k=>$v){
          $u=new phpUpload($v['tmp_name'],$v['name'],$path."upload/images/zixun/");
          $u->rndFileName();
          $u->size("1000");
          $u->type("jpg,gif,jpeg,JPEG");
          $res=$u->up();
          if($res[0]){
            $len=strlen($path)-1;
            $imgName=$u->getUsefulRf($len);
            return $imgName;
          }
          else{
            $this->errMes[]= "图片".$v['name']."上传失败";
            $this->mes();
          }
        }
        unset($u);
    }
  }//end fun getImg

  function toHtml($str){
    $str=str_replace("<COLOR","<font color=",$str);
    $str=str_replace("</COLOR>","</font>",$str);
    $str=str_replace("<img>","<img src='",$str);
    $str=str_replace("</img>","'>",$str);

    $str=str_replace("<","<",$str);
    $str=str_replace(">",">",$str);
    return $str;
  }


  /*
    *方法   mes
    *功能   显示错误信息
    *参数   无
    *返回   无
  */
  function mes(){
    if(count($this->errMes)!=0){
        foreach($this->errMes as $v){
          echo '<FONT SIZE="" COLOR="#FF0000">[无魂报告]:</FONT>'.$v."<br>";
        }
        echo '<a href="javascript:history.go(-1)"><font   color="#FF0000">[返 回]</font> </a>';
        exit;
    }else{
        //echo "^_^恭喜,操作成功!<br>";
    }
  }//end fun mes

}

?>
********************************使用说明*****************************
例子:


CODE:[Copy to clipboard]<?php
require_once("db_mysql.php");//引入类
require_once("sql.class.php");

$db=new mysql($host,$u,$p,$datebase)//连接数据库

$sql=new Sql;//生成sql对象

//
//方法的参数部分的说明在类里有写..可以到那里去看...
//
$sql->setTable(TB_ZX);//设定要查询的表
$sql->setOrder("order by shijian desc");//查询顺序
$sql->setLimit(5);//查询访问
$sql->setWhere($w);//查询条件
$field=$db->getField(array("id","title","article"));//查询字段
$sel=$sql->getSel($field);//得到sql语句
$res=$db->getRes($sel);//得到结果以2维数组的形式存在.
//$res[id][0]代表第一个查到的id
//$res[title][1]代表第二个查到的title
//依次类对.....

/*************不使用sql类*****************/

//如果不使用sql类应该这样写
$sql="select * from table where .....";
$db->getField(array("id","title","article"));//查询字段
$res=$db->getRes($sql);//得到结果以2维数组的形式存在.
//就这么几句.是不是很简单..快试试吧


//下面是配合smarty模板的输出部分就不写了..不过为了让朋友们看看结果加上个输出.
foreach($res[title] as $v){
  echo $v."<br>";
}

//如果你们使用的时候把title换成你们相应的字段.

?>
?>
本来不想来献丑.可是一个刚学php的朋友总的得到查询结果的时候出错...特推荐他使用db类.简化书写查询代码.
顶端 Posted: 2006-04-20 09:30 | [楼 主]
PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 » PHP资源共享

时:01-09 10:35 Copyright © 2006 phpwhy.com 权
ICP05060669

曳息 -