喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
     
标题: [原创] 一个数据库操作架构的类  
 
fdwl
版主
Rank: 7Rank: 7Rank: 7



UID 95805
精华 0
积分 22
帖子 10
金钱 22 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2007-7-21
状态 离线
一个数据库操作架构的类

不知道和主题是否相符,讲究看把, 一直没有为村里做过什么贡献,以下是我积累经过很多次修改所积累下来的
 主要为开发能节省 70%以上的时间

<?php

class MySqlDatabase {

    private 
$conn;
    private 
$arrProcedureParams;
    
    
///建立数据库连接
    
function connect($selectdb true) {
        
// mysql 5.2 mysql_pconect(mysql_server, mysql_user, mysql_pwd, 1, 131072);

        
if( DB_PCONNECT )  
            
$this->conn = @mysql_pconnect(MYSQL_SERVER,MYSQL_USER,MYSQL_PWD);
        else 
            
$this->conn = @mysql_connect(MYSQL_SERVERMYSQL_USERMYSQL_PWD);
        
        if(!
$this->conn) {
            
$this->Loger->addQuery(''$this->errno(), $this->error());
            return 
false;
        }
        
        
$this->updateQuery('SET NAMES UTF8');
        
        if(
$selectdb) {
            if(!
mysql_select_db(MYSQL_DATANAME)) {
                
$this->Loger->addQuery(''$this->errno(), $this->error());
                return 
false;
            }
        }
        
        return 
true;
    }
    
    function 
errno() {
        return @
mysql_errno();
    }
    
    function 
error() {
        return @
mysql_error();
    }
    
    function 
QueryPageL(&$totalCount$tabName$PageIndex$PageSize 20$StrWhere$OrderField$OrderFieldDesc$StrField "*") {
        if(empty(
$tabName))
            return 
false;
        
        
$sql "SELECT COUNT(1) FROM $tabName";
        
        
$sWhere " WHERE 1=1 and";
        if (empty(
$StrWhere))
            
$sWhere "";
        else 
            
$sWhere .= $StrWhere;
            
        
$sql .= $sWhere;
        
        
$totalCount $this->QueryPageTotalCount($sql);
        
        if(!
is_int($totalCount)) return false;
        if(
$totalCount <= 0) return false;
        
        
$sOrder " ORDER BY ";
        if(empty(
$OrderField))
            
$sOrder "";
        else  {
            
$sOrder .= $OrderField;
            
$sOrder .= $OrderFieldDesc;
        }
        
$sql "SELECT $StrField FROM $tabName $sWhere $sOrder";
        
        return 
$this->QueryPage($sql$PageSize$PageIndex);
    }

    function 
QueryPage($sql$PageIndex 0$PageSize 20) {
        if(empty(
$sql))
            return 
false;
        
        
$sql $sql' LIMIT '$PageIndex*$PageSize', '$PageSize;
        
$result = @mysql_query($sql$this->conn);
        if(!
$result) {
            
$this->Loger->addQuery($sql$this->errno(), $this->error());
            return 
false;
        } else {
            
$this->Loger->addQuery($sql);
            return 
$result;
        }
    }
    
    function 
getObjectQueryPage($sql$object$PageIndex 0$PageSize 20) {
        
$result $this->QueryPage($sql$PageIndex$PageSize);
        if(!
$result)
            return 
false;
            
        
$objarr = array();
        while(
$myarr $this->fetchArray($result))
            
$objarr[] = $object->IPoplateIDataReader($myarr);
            
        return 
$objarr;
    }
    
    function 
getObjectQuery($sql$object$cout = -1) {
        
$result $this->Query($sql);
        if(!
$result)
            return 
false;
            
        if(
$cout != -1)
            return 
$object->IPoplateIDataReader($this->fetchArray($result));
            
        
$arrobj = array();
        while(
$myarr $this->fetchArray($result))
            
$arrobj[] = $object->IPoplateIDataReader($myarr);
            
        return 
$arrobj;
    }
    
    function 
QueryProcedure($m_ProcedureName) {
        
$sqlCall "call $m_ProcedureName(";
        
$i 0;
        foreach (
$this->arrProcedureParams as $_value) {
            if(
$_value["SqlType"] == "String")
                
$result $this->Query("set @".$_value['Name']."='".$_value['Value']."'");
            else
                
$result $this->Query("set @".$_value['Name']."=".$_value['Value']);
                
            
$sqlCall .= "@".$_value['Name'];
    
            if( (
count($this->arrProcedureParams)-1) != $i )
                
$sqlCall .= ",";
                
            
$i $i +;
        }
        
$sqlCall .= ")";
        
$objresult $this->Query($sqlCall);
        
        foreach (
$this->arrProcedureParams as $key => $_value) {
            if(
$_value["InputType"] != "out") continue;
            
            
$result $this->Query("select @".$_value["Name"]);
            
$result = @mysql_fetch_array($result);            
            
$this->arrProcedureParams[$key]["Value"] = $result[0];
        }
        
        return 
$objresult;
    }
    
    function 
getProcedureParams($cmdName) {
        return 
$this->arrProcedureParams[$cmdName]["Value"];
    }
    
    function 
AddProcedureParams($cmdName$cmdValue$inputType "in"$SqlType) {
        
$this->arrProcedureParams[$cmdName] = array('Name' => $cmdName
                                                    
'Value' =>$cmdValue
                                                    
'InputType' => $inputType,
                                                    
'SqlType' => $SqlType);
    }
    
    function 
clearParams() {
        
$this->arrProcedureParams = array();
    }
    
    
/**
     * @return int
     * @example SELECT COUNT(1) FROM fav_user 
     * */
    
function QueryPageTotalCount($sql) {
        if(empty(
$sql))
            return 
false;
        
        
$result = @mysql_query($sql$this->conn);
        if(!
$result) {
            
$this->Loger->addQuery($sql$this->errno(), $this->error());
            return 
false;
        } else {
            
$this->Loger->addQuery($sql);
            if(
$this->getRowsNum($result) == 0) {
                unset(
$result);
                return 
false;
            }
            
            
$arr $this->fetchArray($result);
            if(empty(
$arr['COUNT(1)'])) {
                unset(
$result);
                return 
false;
            }
            
            if(
is_int($arr['COUNT(1)'])) {
                unset(
$result);
                return 
false;
            }
            
            
$rev intval($arr['COUNT(1)']);
            unset(
$result);
            return 
$rev;
        }
    }
    
    
///执行一个Sql语句
    
function Query($sql) {
        if(empty(
$sql))
            return 
false;
        
        
$result = @mysql_query($sql$this->conn);
        if(!
$result) {
            return 
false;
        } else {
            if(!
$this->getRowsNum($result))
                return 
false;
                
            return 
$result;
        }
    }
    
/**
     * 执行一个 insert update delete 并返回 $sql 所影响的行数
     *
     * @param string 需要执行的 Sql 语句
     * @return 返回 $sql 语句所执行后,所影响的行数
     */
    
function updateQuery($sql) {
        if(empty(
$sql))
            return 
false;
        
        
$result = @mysql_query($sql$this->conn);
             
        
$count $this->getAffectedRows($this->conn);
        unset(
$result);
        return 
$count;
    }
    function 
fetchRow($result) {
        return @
mysql_fetch_row($result);
    }
    function 
fetchArray($result) {
        return @
mysql_fetch_assoc($result);
    }
    
    function 
LastInsertId() {
        return @
mysql_insert_id();
    }

    
    FUNCTION 
fetchArrayL($result) {
        return @
mysql_fetch_array($resultMYSQL_ASSOC);
    }
        
    function 
fetchFieldType($result) {
        return @
mysql_field_type($result);
    }
    function 
getRowsNum($result)  {
        return @
mysql_num_rows($result);
    }
    function 
getAffectedRows($result) {
        return @
mysql_affected_rows($result);
    }
    function 
Close() {
        @
mysql_close($this->conn);
    }
    function 
__destruct() {
        
$this->Close();
    }
}

abstract class 
Database {
    
    protected 
$db;
    function 
__construct($connected true) {
        if(
$connected)
            
$this->db DatabaseInstance();
    }
    
    abstract function 
IPoplateIDataReader($result);
}

abstract class 
PropDatabase {
    protected 
$db;
    protected 
$_attribute;
    protected 
$_attr null;
    private 
$_update_attr = array();
    function 
__construct($connected true) {
        if(
$connected)
            
$this->db DatabaseInstance();
    }
    
    
/**
     * Enter description here...
     *
     * @param unknown_type $dname
     */
    
public function AddUpdataIdent($dname) {
        
$this->_update_attr[] = $dname;
    }
    
    public function 
IPoplateIDataReader($result) {
        
$class get_class($this);
        
$b = new $class(false);
        
        foreach (
$result as $key => $value) {
            
$b->$key $value;
        }
        return 
$b;
    }
    
    function 
__set($name$value) {
        if(
property_exists($this$name))
            
$this->$name $value;
        else
            
$this->_attribute[$name] = $value;
    }
    
    function 
__get($name) {
        if( 
property_exists($this$name) )
            return 
$this->$name;
            
        if( @
array_key_exists($name$this->_attribute) )
            return 
$this->_attribute[$name];
        else
            
trigger_error("class ".get_class($this)." is not property $name");
    }
    
    public function 
__insert($tablename "") {
        
$tmp null;
        
        if(empty(
$tablename))
            
$tablename get_class($this);
            
        
$strsql "INSERT INTO $tablename(%s)VALUES(%s)";
        
$_field $_value "";
        if(
is_array($this->_attr)) {
            for (
$i=0;$i<count($this->_attr);$i++) {
                
$_field .= $this->_attr[$i];
                if(
$this->_attribute != null) {
                    if( 
array_key_exists($this->_attr[$i], $this->_attribute) )
                        
$_value .= $this->getValue($this->_attribute[$this->_attr[$i]]);
                    else {
                        
$_pre_val $this->_attr[$i];
                        
$_value .= $this->getValue($this->$_pre_val);
                    }
                } else {
                    
$_pre_val $this->_attr[$i];
                    
$_value .= $this->getValue($this->$_pre_val);
                }
                if(
$i != (count($this->_attr) - 1)) {
                    
$_field .= ',';
                    
$_value .= ',';
                }
            }
        } else {
            
$_field $_value "";
            
$i=0;
            foreach (
$this->_attribute as $Key => $_val) {
                
$_field .= $Key;
                
$_value .= $this->getValue($_val);
                if(
$i != (count($this->_attribute) - 1)) {
                    
$_field .= ',';
                    
$_value .= ',';
                }
                
$i++;
            }
        }
        
$strsql sprintf($strsql$_field$_value);
        
        
//echo $strsql;
        //var_dump($strsql);
        
$this->db->updateQuery($strsql);
        return 
$this->db->LastInsertId();
    }
    
    private function 
getValue($_tmp) {
        if(
is_bool($_tmp)) {
            
$_value $_tmp 0;
        }elseif(
is_string($_tmp)) {
            
$_value "'$_tmp'";
        }elseif (
is_array($_tmp)) {
            
$_value "'".serialize($_tmp)."'";
        }elseif (
is_object($_tmp)) {
            
$_value "'".serialize($_tmp)."'";
        }else {
            
$_value $_tmp;
        }

        return 
$_value;
    }
    
    
/*function __call($name, $arguments) {
        $u = get_class($this);
        trigger_error("class $u is not method $name");
    }*/
}

?>
用法:
以用户表为例子
表明: User
uid   int auto
UserName char(50)
Pwd char(128)
userinfo char(255)
regtime int(10)

<?php
class user extends PropDatabase {
     
//添加一个用户
     
public function AddUser() {
          
//表明 
          
return $this->__insert("user");
     }
   
/*返回最新注册的100个用户*/
    
public function getUserBynewreg($num) {
          
$sql "SELECT * FROM user order by regtime DESC";
         return 
$this->db->getObjectQuery($sql$this$num);
    }

    
/*
     返回一个附带分页的用户列表
   */
    
public function getUserByList($PageIndex$PageSize,& $total) {
          
$sql  "SELECT COUNT(1) FROM user";
          
$total $this->db->QueryPageTotalCount($sql);
          if(!
$total) return false;
          if(
$total ) return false;
         
$sql "SELECT * FROM user ";
          return 
$this->db->getObjectQueryPage($sql$this$PageIndex$PageSize);
   }

   public function 
getUserById($uid) {
         
$sql "SELECT * FROM user WHERE uid = $uid";
        return 
$this->db->getObjectQuery($sql$this1);
   }
  
/*  当需要处理没条语句的时候,会自动调用该方法*/
   
public function IPoplateIDataReader($result) {
         
$obj parent::IPoplateIDataReader($result);

        
$obj->userinfo unserialize($obj->userinfo);
        return 
$obj;
   }
}
?>
使用user类

<?php
$user 
= new user();
$user->username "fdwl";
$user->pwd = @md5("123456");
$user->userinfo serialize(array("北京""河南""上街""济南"));
$user->regtime time();
$result  $user->AddUser();
if(
$result === false)
   die(
"注册失败");

echo 
"新注册的用户成功";


$userlist $user->getUserById(1);
if(!
$userlist) die("返回列表失败");

foreach(
$userlist as $_valuser) {
 echo 
$_valuser->username;
 echo 
"<br />";
}
?>
不明白的在问把,不太会写教程,或者您有更好的方法,别忘记发给我一份 fdwl@msn.com

[ 本帖最后由 fdwl 于 2007-12-11 05:19 PM 编辑 ]
2007-12-11 05:16 PM#1
查看资料  Blog  发短消息  顶部
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 4935
帖子 1701
金钱 4925 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[推荐阅读] 1500元写程序一个.PHP类的
挺强,挺复杂............



在场外支持奥运.....
2007-12-11 09:16 PM#2
查看资料  访问主页  发短消息  QQ  顶部
 
psdshow
金牌会员
Rank: 6Rank: 6
论坛元老



UID 30908
精华 0
积分 1758
帖子 1364
金钱 1758 喜悦币
威望 0
人脉 0
阅读权限 70
注册 2004-9-6
来自 永州-廣州
状态 离线
[推荐阅读] 一个奇怪的乱码问题
挺强,看不明白



以下AD由PHPX赞助:
广州梦莎五金饰品厂 东莞恒隆五金饰品厂 承接php私活
2007-12-11 10:25 PM#3
查看资料  访问主页  Blog  发短消息  QQ  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.080918 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP