|
<?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 = $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) ? 0 : "(" . $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) ? 0 : "(" . $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
|