咕咚
  咕咚首页 | 个人秀 | 公开圈子 | 抽奖
  php欢迎您
圈子首页 | 成员列表 | 圈子论坛 | 文件共享 | 圈子相册 | 成员相册 | 成员博客 | 站内邀请
讨论区导航: php (4)
贴子列表    发表新贴 标准视图 树式浏览
   圈子讨论区 → php → 主题内容

Zandy
发送私信
加为好友
标题:〖分享·php部落〗MySQL数据库操作的类,自己一直用的,好多年了!! 发表于 2006-04-28 18:05:37
楼主

<?php

/**
 * 用 cygwin 的 生成的,用了 RCS

 * $Id: class.MySQL.php,v 1.9 2006/04/13 02:48:57 Administrator Exp $
 * $Log: class.MySQL.php,v $
 * Revision 1.9  2006/04/13 02:48:57  Administrator
 * *** empty log message ***
 *
 * Revision 1.1.1.1  2006/04/13 02:17:41  Administrator
 * *** empty log message ***
 *
 * Revision 1.8  2006/04/13 02:15:20  Administrator
 * *** empty log message ***
 *
 * Revision 1.7  2006/04/13 01:58:10  Administrator
 * *** empty log message ***
 *
 * $Author: Administrator $
 * $Date: 2006/04/13 02:48:57 $
 * $Revision: 1.9 $
 *
 * Filename : class.Product.php
 * Author   : Dummy | Zandy
 * Email    : lianxiwoo@gmail.com | hotmail.com
 * Create   : 20040511_111111
 * LastMod  : 20050902_130000, 20051202_130000, 20060102_144000
 * Usage    : 

if (!function_exists('prr')){
    function prr($arr){
        echo '<pre>';
        print_r($arr);
        echo '</pre>';
    }
}

使用很简单,几乎跟php内置的一样使用,但是更方便更简单
还有很多好用的方法


$dsn = "MySQL://root:@localhost:3306/test/false";

$MySQL = MySQL::getInstance($dsn);
$sql = "select * from bb ";
$all = $MySQL->getAllWithKey($sql, 'name');
prr($all);

*/


class MySQL{
    
/**
    Author             : Dummy
    create time        : 20040511_111111
    last modified time : 20050902_130000, 20051202_130000, 20060102_144000
    */

    
var $Result NULL/* private */
    
var $LinkId NULL/* private */
    
var $Record NULL/* 包含一条记录的内容 */
    
var $Rows   0;    /* 用于跟踪while了结果集多少次 */

    
var $MustBeHalt true/* 有了错误立即停止 */
    
var $IsTest     true/* 是否是测试       */
    
var $RecordCase NULL/* 只在 nextRecord() 和 f()方法里出现 */

    
var $dbConfig = array();
    var 
$dsn '';
    var 
$p false// when p is true will use mysql_pconnect() function
    
var $debug false;

    function &
getInstance($dsn null$p false){
        
$ro null;
        if (isset(
$this)){
            
$ro $this;
        }else{
            
$currClass __CLASS__;
            
$ro = new $currClass ($dsn);

            if(
$dsn !== null && is_string($dsn)){
                
$dbConfig $ro->splitDSN($dsn);
                
$ro->dbConfig $dbConfig;
                
$ro->dsn $dsn;
            }elseif(
$dsn !== null && is_array($dsn)){
                
$ro->dbConfig $dsn;
                
$dbTpye  $dsn['dbTpye'];
                
$dbHost  $dsn['dbHost'];
                
$dbPort  $dsn['dbPort'];
                
$dbUser  $dsn['dbUser'];
                
$dbPswd  $dsn['dbPswd'];
                
$dbName  $dsn['dbName'];
                
$newLink $dsn['newLink'];
                
//$dsn = $dbTpye.'://'.$dbUser.':'.$dbPswd.'@'.$dbHost.':'.$dbPort.'/'.$dbName.'/'.$newLink;
                //$ro->dsn = $dsn;
                
$dsn = array(
                    
"dbTpye" => $dbTpye,
                    
"dbHost" => $dbHost,
                    
"dbPort" => $dbPort,
                    
"dbUser" => $dbUser,
                    
"dbPswd" => $dbPswd,
                    
"dbName" => $dbName,
                    
"newLink" => $newLink
                
);
            }else{
                if(empty(
$ro->dbConfig)){
                    die(
'请指定数据库连接参数!');
                    
//return false;
                
}
            }
            
//$ro->connect($p); // 20060211 只在执行 query 的时候连接数据库
            
$ro->$p;
        }
        return 
$ro;
    }

    function 
__construct($dsn null$p false){
        return 
MySQL::getInstance($dsn$p);
    }

    function 
MySQL($dsn null$p false){
        return 
MySQL::__construct($dsn$p);
    }

    function 
splitDSN($dsn){
        
//$dsn = "数据库类型名称://入口帐号:入口密码@数据库主机名:端口号/数据库名/是否总是打开新的连接";
        //$dsn = "MySQL://Dummy:123@localhost:3306/tetx/false";
        
$this->dsn $dsn;
        
$dsn preg_split("/[:\/@]/"$dsn);

        
$dbTpye  '';
        
$dbHost  '';
        
$dbPort  '';
        
$dbUser  '';
        
$dbPswd  '';
        
$dbName  '';
        
$newLink false;

        
$dbTpye  $dsn[0];
        
$dbHost  $dsn[5];
        
$dbPort  $dsn[6];
        
$dbUser  $dsn[3];
        
$dbPswd  $dsn[4];
        
$dbName  $dsn[7];
        
$newLink $dsn[8];

        
$r = array("dbTpye" => $dbTpye"dbHost" => $dbHost"dbPort" => $dbPort"dbUser" => $dbUser"dbPswd" => $dbPswd"dbName" => $dbName"newLink" => $newLink);

        
//return array($dbTpye, $dbHost, $dbPort, $dbUser, $dbPswd, $dbName, $newLink);
        
return $r;
    }

    function 
affectedRows(){ /* 取得前一次 MySQL 操作所影响的记录行数 */
        
return mysql_affected_rows($this->LinkId);
    }

    function 
changeUser($user$password){ /* 改变活动连接中登录的用户 */
        
return mysql_change_user($user$password$this->dbConfig['dbName'], $this->LinkId);
    }

    function 
clientEncoding(){ /* 返回字符集的名称 */
        
return mysql_client_encoding($this->LinkId);
    }

    function 
close(){ /* 关闭 MySQL 连接 */
        
$close mysql_close($this->LinkId);
        
$this->LinkId NULL;
        
$this->Result NULL;
        
$this->Record NULL;
        return 
$close;
    }

    function 
connect($p false){ /* 打开一个到 MySQL 服务器的连接 */
        
$dbHost $this->dbConfig['dbHost'];
        
$dbPort $this->dbConfig['dbPort'];
        
$dbUser $this->dbConfig['dbUser'];
        
$dbPswd $this->dbConfig['dbPswd'];
        
$dbName $this->dbConfig['dbName'];
        
$newLink $this->dbConfig['newLink'];

        
$connectFunctionName 'mysql_' . ($p 'p' '') . 'connect';

        
$conn $connectFunctionName($dbHost.($dbPort ":".$dbPort ''), $dbUser$dbPswd$newLink);
        if(!
is_resource($conn)){
            
$this->halt("连接数据库失败!<BR/>"1);
            return 
false;
        }
        if (
$dbName){
            
mysql_select_db($dbName);
        }
        
$a $this->getServerInfo();
        if (
$a && (preg_match("/ 5\./"$a) || preg_match("/ 4\.1\./"$a))){
            
mysql_query("SET NAMES UTF8;");
        }
        
$this->LinkId $conn;
        
$this->selectDB($dbName);
        return 
true;
    }

    function 
createDB($dbName){ /* 新建一个 MySQL 数据库 */
        
return mysql_create_db($dbName$this->LinkId) or die($this->halt("创建数据库 ".$dbName." 失败!"));
    }

    function 
dataSeek($rowNumber){ /* 移动内部结果的指针 */
        
return mysql_data_seek($this->Result$rowNumber);
    }

    function 
dbName($row$field NULL){ /* 取得结果数据 */
        
if(empty($field)){
            return 
mysql_db_name($this->Result$row);
        }
        return 
mysql_db_name($this->Result$row$field);
    }

    function 
dbQuery($dbName$queryString){ /* 发送一条 MySQL 查询 */
        
$this->Result mysql_db_query($dbName$queryString$this->LinkId);
        return 
$this->Result;
    }

    function 
dropDB($dbName){ /* 丢弃(删除)一个 MySQL 数据库 */
        
return mysql_drop_db($dbName$this->LinkId);
    }

    function 
errno(){ /* 返回上一个 MySQL 操作中的错误信息的数字编码 */
        
return $this->LinkId mysql_errno($this->LinkId) : mysql_errno();
    }

    function 
error(){ /* 返回上一个 MySQL 操作产生的文本错误信息 */
        
return $this->LinkId mysql_error($this->LinkId) : mysql_error();
    }

    function 
escapeString($unescapedString){ /* 转义一个字符串用于 mysql_query */
        
return mysql_escape_string($unescapedString);
    }

    function 
fetchArray($Rows 0$resultType MYSQL_BOTH){ /* 从结果集中取得一行作为关联数组(MYSQL_ASSOC),或数字数组(MYSQL_NUM),或二者兼有(MYSQL_BOTH) */
        
if(!is_resource($this->Result)){
            return 
false;
        }
        
$fetchArray mysql_fetch_array($this->Result$resultType);
        if(
$fetchArray && $Rows){$this->Rows++;}
        return 
$fetchArray;
    }

    function 
fetchAssoc($Rows 0){ /* 从结果集中取得一行作为关联数组 */
        
if(!is_resource($this->Result)){
            return 
false;
        }
        
$fetchAssoc mysql_fetch_assoc($this->Result);
        if(
$fetchAssoc && $Rows){$this->Rows++;}
        return 
$fetchAssoc;
    }

    function 
fetchField($fieldOffset NULL){ /* 从结果集中取得列信息并作为对象返回 */
        
if(empty($fieldOffset)){
            return 
mysql_fetch_field($this->Result$fieldOffset);
        }
        return 
mysql_fetch_field($this->Result);
    }

    function 
fetchLengths(){ /* 取得结果集中每个输出的长度 */
        
return mysql_fetch_lengths($this->Result);
    }

    function 
fetchObject($Rows 0){ /* 从结果集中取得一行作为对象 */
        
if(!is_resource($this->Result)){
            return 
false;
        }
        
$fetchObject mysql_fetch_object($this->Result);
        if(
$fetchObject && $Rows){$this->Rows++;}
        return 
$fetchObject;
    }

    function 
fetchRow($Rows 0){ /* 从结果集中取得一行作为枚举数组 */
        
if(!is_resource($this->Result)){
            return 
false;
        }
        
$fetchRow mysql_fetch_row($this->Result);
        if(
$fetchRow && $Rows){$this->Rows++;}
        return 
$fetchRow;
    }

    function 
fieldFlags($fieldOffset){ /* 从结果中取得和指定字段关联的标志 */
        
return mysql_field_flags($this->Result$fieldOffset);
    }

    function 
fieldLen($fieldOffset){ /* 返回指定字段的长度 */
        
return mysql_field_len($this->Result$fieldOffset);
    }

    function 
fieldName($fieldIndex){ /* 取得结果中指定字段的字段名 */
        
return mysql_field_name($this->Result$fieldIndex);
    }

    function 
fieldSeek($fieldOffset){ /* 将结果集中的指针设定为制定的字段偏移量 */
        
return mysql_field_seek($this->Result$fieldOffset);
    }

    function 
fieldTable($fieldOffset){ /* 取得指定字段所在的表名 */
        
return mysql_field_table($this->Result$fieldOffset);
    }

    function 
fieldType($fieldOffset){ /* 取得结果集中指定字段的类型 */
        
return mysql_field_type($this->Result$fieldOffset);
    }

    function 
freeResult(){ /* 释放结果内存 */
        
if (is_resource($this->Result)){// add at 20060102_144000
            
return mysql_free_result($this->Result);
        }
        return 
null;
    }

    function 
getClientInfo(){ /* 取得 MySQL 客户端信息 */
        
return $this->LinkId mysql_get_client_info($this->LinkId) : mysql_get_client_info();
    }

    function 
getHostInfo(){ /* 取得 MySQL 主机信息 */
        
return $this->LinkId mysql_get_host_info($this->LinkId) : mysql_get_host_info();
    }

    function 
getProtoInfo(){ /* 取得 MySQL 协议信息 */
        
return $this->LinkId mysql_get_proto_info($this->LinkId) : mysql_get_proto_info();
    }

    function 
getServerInfo(){ /* 取得 MySQL 服务器信息 */
        
return $this->LinkId mysql_get_server_info($this->LinkId) : mysql_get_server_info();
    }

    function 
info(){ /* 取得最近一条查询的信息 */
        
return $this->LinkId mysql_info($this->LinkId) : mysql_info();
    }

    function 
insertId(){ /* 取得上一步 INSERT 操作产生的 ID */
        
return $this->LinkId mysql_insert_id($this->LinkId) : mysql_insert_id();
        
//return mysql_insert_id($this->LinkId);
    
}

    function 
listDBs(){ /* 列出 MySQL 服务器中所有的数据库 */
        
return $this->LinkId mysql_list_dbs($this->LinkId) : mysql_list_dbs();
    }

    function 
listFields($dbName$tableName){ /* 列出 MySQL 结果中的字段 */
        
$this->Result mysql_list_fields($dbName$tableName$this->LinkId);
        return 
$this->Result;
    }

    function 
listProcesses(){ /* 列出 MySQL 进程 */
        
return $this->LinkId mysql_list_processes($this->LinkId) : mysql_list_processes();
    }

    function 
listTables($dbName ''){ /* 列出 MySQL 数据库中的表 */
        
$dbName = empty($dbName) ? $this->dbConfig['dbName'] : $dbName;
        return 
$this->LinkId mysql_list_tables($dbName$this->LinkId) : mysql_list_tables($dbName);
    }

    function 
numFields(){ /* 取得结果集中字段的数目 */
        
return mysql_num_fields($this->Result);
    }

    function 
numRows(){ /* 取得结果集中行的数目 */
        
return mysql_num_rows($this->Result);
    }

    function 
ping(){ /* Ping 一个服务器连接,如果没有连接则重新连接 */
        
return $this->LinkId mysql_ping($this->LinkId) : mysql_ping();
    }

    function 
query($queryString){ /* 发送一条 MySQL 查询 */
        
if(empty($queryString)){
            
$this->halt("SQL 语句为空!"1);
            return 
false;
        }
        if(!
is_resource($this->LinkId)){
            
$this->connect(false);
            if(!
is_resource($this->LinkId)){
                
$this->halt("请确保提供正确的数据库参数!"1);
                return 
false;
            }
        }
        
$this->Result mysql_query($queryString$this->LinkId);// or die(mysql_error());//print_r($this);
        
if ($this->debug){
            echo 
'<xmp>';
            
print_r($queryString);
            echo 
'</xmp>';
        }
        return 
$this->Result;
    }

    function 
realEscapeString($unescapedString){ /* 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 */
        
return mysql_real_escape_string($unescapedString$this->LinkId);
    }

    function 
result($row$field NULL){ /* 取得结果数据 */
        
if(empty($field)){
            return 
mysql_result($this->Result$row$field);
        }
        return 
mysql_result($this->Result$row);
    }

    function 
selectDB($dbName 'test'){ /* 选择 MySQL 数据库 */
        //return mysql_select_db(empty($dbName) ? $this->dbConfig['dbName'] : $dbName, $this->LinkId);
        
return $this->LinkId mysql_select_db(empty($dbName) ? $this->dbConfig['dbName'] : $dbName$this->LinkId) : mysql_select_db(empty($dbName) ? $this->dbConfig['dbName'] : $dbName);
    }

    function 
stat(){ /* 取得当前系统状态 */
        
return mysql_stat($this->LinkId);
    }

    function 
tablename($index){ /* 取得表名 */
        
return mysql_tablename($this->Result$index);
    }

    function 
threadId(){ /* 返回当前线程的 ID */
        
return mysql_thread_id($this->LinkId);
    }

    function 
unbufferedQuery($queryString){ /* 向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行 */
        
$this->Result mysql_unbuffered_query($queryString$this->LinkId);
        return 
$this->Result;
    }
/*-- 上面的方法名跟手册上 MySQL 的那些函数名是一对一的,除了“splitDSN”和“构造函数” --*/
/*-- 下面是扩展,也就是说下面的这些方法在手册上是找不到影子的                         --*/
    
function free(){ /* 释放结果内存,效果 freeResult 一样,只是这样简单些,少写几个字母,算是别名吧~ ^_^ */
        
return $this->freeResult();
    }

    function 
resetRows($Rows 0){
        
// 将 Rows 清 0
        
$this->Rows $Rows;
    }

    function 
setMustBeHalt($MustBeHalt false){
        
$this->MustBeHalt $MustBeHalt;
    }

    function 
getMustBeHalt(){
        return 
$this->MustBeHalt;
    }

    function 
getAll($sql$resultType MYSQL_ASSOC){
        
$r = array();
        
$this->query($sql$resultType);
        
$i 0;
        while(
$fa $this->fetchArray(0$resultType)){
            
$r[$i++] = $fa;
        }
        return empty(
$r) ? false $r;
    }

    function 
getAllWithKey($sql$fieldName$resultType MYSQL_ASSOC){
        
$r = array();
        
$this->query($sql$resultType);
        while(
$fa $this->fetchArray(0$resultType)){
            
$r[$fa[$fieldName]] = $fa;
        }
        return empty(
$r) ? false $r;
    }

    function 
getAllAfterQuery($fieldName ''$resultType MYSQL_ASSOC){
        
$r = array();
        
$i 0;
        while(
$fa $this->fetchArray(0$resultType)){
            
$i++;
            
$x = empty($fieldName) ? $i $fa[$fieldName];
            
$r[$x] = $fa;
        }
        return empty(
$r) ? false $r;
    }

    function 
getOne($sql$resultType MYSQL_ASSOC){
        
$r = array();
        
$q $this->query($sql$resultType);
        if (!
$q){
            return -
1;
        }
        while(
$fa $this->fetchArray(0$resultType)){
            
$r $fa;
            break;
        }
        return empty(
$r) ? false $r;
    }

    function 
insert($tableName$dataArray = array(), $replace false){
        if (empty(
$dataArray)){
            return -
1;
        }
        
$a $this->prepareSQL($dataArray', ');
        
$rp $replace 'replace' 'insert';
        
$sql $rp." into ".$tableName." set $a ";
        return 
$this->exec($sql);
        
/*
        $q = $this->query($sql);
        if (!$q){
            return -1;
        }
        return $this->affectedRows();
        */
    
}

    function 
update($tableName$dataArray = array(), $conditions ''){
        if (empty(
$dataArray)){
            return -
1;
        }
        
$a $this->prepareSQL($dataArray', ');
        
$b $this->prepareSQL($conditions'and');

        
$sql "update ".$tableName." set $a where 0 or " . (empty($b) ? "(" $b ")");
        return 
$this->exec($sql);
        
/*
        $q = $this->query($sql);
        if (!$q){
            return -1;
        }
        return $this->insertId();
        */
    
}

    function 
delete($tableName$conditions ''){
        
$a $this->prepareSQL($conditions'and');
        
$sql "delete from ".$tableName." where 0 or " . (empty($a) ? "(" $a ")");
        return 
$this->exec($sql);
        
/*
        $q = $this->query($sql);
        if (!$q){
            return -1;
        }
        return $this->affectedRows();
        */
        // 童话 ,光良唱
    
}

    
/**
     * @createtime : 20060124
    */
    
function prepareSQL($arr$join ','$escapeString false){
        if (
is_array($arr) && $arr){
            foreach (
$arr as $k => $v){
                if (
is_string($k) && $k){
                    if (
false === strpos($k'.') && false === strpos($k' ')){
                        
$k '`'.$k.'`';
                    }
                    if (
strtoupper($v) == 'NULL'){
                        
$r[] = "$k = NULL";
                    }elseif (
preg_match("/[A-Z_]+\s*\(\s*\)/"$v)) {
                        
$r[] = "$k = $v";
                    }elseif (
$escapeString) {
                        
//$r[] = "$k = '".addslashes($v)."'";
                        
$r[] = "$k = '".mysql_escape_string($v