mysql db类_加强版phplib的DB类

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

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

就用在PHPLib DB类的基础上、参考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 = new DB_Sql();

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

[ 使用方法 ]

//获取所有记录

$sql = "SELECT * FROM table1";

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

//获取一条

$sql = "SELECT * FROM table1 WHERE id = '1'";

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

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

$sql = "SELECT * FROM table1";

$page_record = $db->limit_query($sql, $start=0, $offset=20, $order="ORDER BY id DESC");

//提取指定数目的记录

$sql = "SELECT * FROM table1";

$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("DELETE FROM table1 WHERE name = 'heiyeluren'");

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

/**

* 文件: database.inc.php

* 描述: 数据库操作类

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

*/

class DB_Sql

{

/* public: connection parameters */

var $Host     = "";

var $Database = "";

var $User     = "";

var $Password = "";

/* public: configuration parameters */

var $Auto_Free     = 1;     ## 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 $PConnect      = 0;     ## Set to 1 to use persistent database connections

var $Seq_Table     = "db_sequence";

/* public: result array and current row number */

var $Record   = array();

var $Row;

/* public: current error number and error text */

var $Errno    = 0;

var $Error    = "";

/* public: this is an api revision, not a CVS revision. */

var $type     = "mysql";

//var $revision = "1.2";

/* private: link and query handles */

var $Link_ID  = 0;

var $Query_ID = 0;

var $locked   = false;      ## set to true while we have a lock

/* public: constructor */

function DB_Sql() {

$this->query($query);

}

/* public: some trivial reporting */

function link_id() {

return $this->Link_ID;

}

function query_id() {

return $this->Query_ID;

}

/* public: connection management */

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

/* Handle defaults */

if ("" == $Database)

$Database = $this->Database;

if ("" == $Host)

$Host     = $this->Host;

if ("" == $User)

$User     = $this->User;

if ("" == $Password)

$Password = $this->Password;

/* establish connection, select database */

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.");

return 0;

}

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

$this->halt("cannot use database ".$Database);

return 0;

}

}

return $this->Link_ID;

}

/* public: discard the query result */

function free() {

@mysql_free_result($this->Query_ID);

$this->Query_ID = 0;

}

/* public: perform a query */

function query($Query_String) {

/* No empty queries, please, since PHP4 chokes on them. */

if ($Query_String == "")

/* The empty query string is passed on from the constructor,

* when calling the class without a query, e.g. in situations

* like these: '$db = new DB_Sql_Subclass;'

*/

return 0;

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

return 0; /* we already complained in connect() about that. */

};

# New query, discard previous result.

if ($this->Query_ID) {

$this->free();

}

if ($this->Debug)

printf("Debug: query = %s
\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("Invalid SQL: ".$Query_String);

}

# Will return nada if it fails. That's fine.

return $this->Query_ID;

}

/* public: walk result set */

function next_record() {

if (!$this->Query_ID) {

$this->halt("next_record 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;

}

/* public: position in result set */

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.");

/* half assed attempt to save the day,

* but do not consider this documented or even

* desireable behaviour.

*/

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

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

return 0;

}

return 1;

}

/* public: table locking */

function lock($table, $mode = "write") {

$query = "lock tables ";

if(is_array($table)) {

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

// text keys are "read", "read local", "write", "low priority write"

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.");

return false;

}

$this->locked = true;

return true;

}

function unlock() {

// set before unlock to avoid potential loop

$this->locked = false;

if(!$this->query("unlock tables")) {

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

return false;

}

return true;

}

/* public: evaluate the result (size, width) */

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);

}

/* public: shorthand notation */

function nf() {

return $this->num_rows();

}

function np() {

print $this->num_rows();

}

function f($Name) {

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

return $this->Record[$Name];

}

}

function p($Name) {

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

print $this->Record[$Name];

}

}

/* public: sequence numbers */

function nextid($seq_name) {

/* if no current lock, lock sequence table */

if(!$this->locked) {

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

$locked = true;

} else {

$this->halt("cannot lock ".$this->Seq_Table." - has it been created?");

return 0;

}

}

/* get sequence number and increment */

$q = sprintf("select nextid from %s where seq_name = '%s'",

$this->Seq_Table,

$seq_name);

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

$this->halt('query failed in nextid: '.$q);

return 0;

}

/* No current value, make one */

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

$currentid = 0;

$q = sprintf("insert into %s values('%s', %s)",

$this->Seq_Table,

$seq_name,

$currentid);

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

$this->halt('query failed in nextid: '.$q);

return 0;

}

} else {

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

}

$nextid = $currentid + 1;

$q = sprintf("update %s set nextid = '%s' where seq_name = '%s'",

$this->Seq_Table,

$nextid,

$seq_name);

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

$this->halt('query failed in nextid: '.$q);

return 0;

}

/* if nextid() locked the sequence table, unlock it */

if($locked) {

$this->unlock();

}

return $nextid;

}

/* public: return table metadata */

function metadata($table = "", $full = false) {

$count = 0;

$id    = 0;

$res   = array();

/*

* Due to compatibility problems with Table we changed the behavior

* of metadata();

* depending on $full, metadata returns the following values:

*

* - full is false (default):

* $result[]:

*   [0]["table"]  table name

*   [0]["name"]   field name

*   [0]["type"]   field type

*   [0]["len"]    field length

*   [0]["flags"]  field flags

*

* - full is true

* $result[]:

*   ["num_fields"] number of metadata records

*   [0]["table"]  table name

*   [0]["name"]   field name

*   [0]["type"]   field type

*   [0]["len"]    field length

*   [0]["flags"]  field flags

*   ["meta"][field name]  index of field named "field name"

*   This last one could be used if you have a field name, but no index.

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

*/

// if no $table specified, assume that we are working with a query

// result

if ($table) {

$this->connect();

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

if (!$id) {

$this->halt("Metadata query failed.");

return false;

}

} else {

$id = $this->Query_ID;

if (!$id) {

$this->halt("No query specified.");

return false;

}

}

$count = @mysql_num_fields($id);

// made this IF due to performance (one if is faster than $count if's)

if (!$full) {

for ($i=0; $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

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

}

}

// free the result only if we were called on a table

if ($table) {

@mysql_free_result($id);

}

return $res;

}

/* public: find available table names */

function table_names() {

$this->connect();

$h = @mysql_query("show tables", $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: error handling */

function halt($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("Session halted.");

}

function haltmsg($msg) {

printf("Database error: %s
\n", $msg);

printf("MySQL Error: %s (%s)
\n",

$this->Errno,

$this->Error);

}

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

// 模块: 自定义函数

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

// 作者: heiyeluren

// 时间: 2005-12-26

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

/**

* 方法: execute($sql)

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

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

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

*/

function execute($sql)

{

if (empty($sql))

{

$this->error("Invalid parameter");

}

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

{

return false;

}

return true;

}

/**

* 方法: get_all($sql)

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

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

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

*/

function get_all($sql)

{

$this->query($sql);

$result_array = array();

while($this->next_record())

{

$result_array[] = $this->Record;

}

if (count($result_array)<=0)

{

return 0;

}

return $result_array;

}

/**

* 方法: get_one($sql)

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

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

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

*/

function get_one($sql)

{

$this->query($sql);

if (!$this->next_record())

{

return 0;

}

return $this->Record;

}

/**

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

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

* 参数:

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

* $limit 需要限制的记录数

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

*

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

*/

function get_limit($sql, $limit)

{

$this->query($sql);

$result_array = array();

for ($i=0; $inext_record(); $i++)

{

$result_array[] = $this->Record;

}

if (count($result_array) <= 0)

{

return 0;

}

return $result_array;

}

/**

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

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

* 参数:

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

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

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

* $order 排序方式,缺省为空,例如:ORDER BY id DESC

* 例如  需要获取从0到10的记录并且按照ID号倒排, get_limit("SELECT * FROM Table1", 0, 10, "ORDER BY id DESC");

*

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

*/

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

{

$sql = $sql ." $order  LIMIT $start,$offset";

$this->query($sql);

$result = array();

while($this->next_record())

{

$result[] = $this->Record;

}

if (count($result) <=0 )

{

return 0;

}

return $result;

}

/**

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

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

* 参数:

* $table 需要统计的表名

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

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

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

*

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

*/

function count($table,$field="*", $where="")

{

$sql = (empty($where) ? "SELECT COUNT($field) FROM $table" : "SELECT COUNT($field) FROM $table WHERE $where");

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

if (!is_array($result))

{

return 0;

}

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

*/

function insert($table,$dataArray)

{

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

{

$this->error("Invalid parameter");

}

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

{

$field .= "$key,";

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

}

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

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

$sql = "INSERT INTO $table ($field) VALUES ($value)";

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

{

return false;

}

return true;

}

/**

* 方法: 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

*/

function update($talbe, $dataArray, $where)

{

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

{

$this->error("Invalid parameter");

}

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

{

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

}

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

$sql = "UPDATE $talbe SET $value WHERE $where";

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

{

return false;

}

return true;

}

/**

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

* 功能: 删除一条记录

* 参数:

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

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

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

*

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

*/

function delete($table, $where)

{

if (empty($where))

{

$this->error("Invalid parameter");

}

$sql = "DELETE FROM $table WHERE $where";

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

{

return false;

}

return true;

}

/**

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

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

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

* 返回: 无返回

*/

function error($msg="")

{

echo "Error: $msg\n
\n";

exit();

}

/**

* 方法:get_insert_id()

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

* 参数: 无参数

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

*/

function get_insert_id()

{

return mysql_insert_id($this->Link_ID);

}

/**

* 方法:close()

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

* 参数: 无参数

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

*/

function close()

{

return mysql_close($this->Link_ID);

}

}

?>

DB<?php header('Content-Type:text/html; charset=utf-8'); basename($_SERVER['PHP_SELF'])=='mysql.inc.php'&&header; ('Location:http://'.$_SERVER['HTTP_HOST']); //禁止直接访问本页 /** ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ※※※※※※※※ 【文件名】: mysql.inc.php 【作 用】: mysql数据库操作 【作 者】: Riyan 【版 本】: version 2.0 【修改日期】: 2010/02/11 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ※※※※※※※※ **/ class mysql{ private $host; // 数据库主机 private $user; // 数据库用户名 private $pass; // 数据库密码 private $data; // 数据库名 private $conn; // 数据库连接标识 private $sql; // sql语句 private $code; // 数据库编码,GBK,UTF8,GB2312 private $result; // 执行query命令的结果数据集 private $errLog=true; // 是否开启错误日志,默认开启 private $showErr=true; // 显示所有错误,具有安全隐患,默认开启 private $pageNo=1; // 当前页 private $pageAll=1; // 总页数 private $rsAll=0; // 总记录 private $pageSize=10; // 每页显示记录条数 /****************************************************************** -- 函数名:__construct($host,$user,$pass,$data,$code,$conn) -- 作 用:构造函数 -- 参 数:$host 数据库主机地址(必填) $user 数据库用户名(必填) $pass 数据库密码(必填) $data 数据库名(必填) $conn 数据库连接标识(必填) $code 数据库编码(必填) -- 返回值:无 -- 实 例:无 *******************************************************************/ public function __construct($host,$user,$pass,$data,$code='utf8', $conn='conn'){ $this->host=$host; $this->user=$user; $this->pass=$pass; $this->data=$data; $this->conn=$conn; $this->code=$code; $this->connect(); } public function __get($name){return $this->$name;} public function __set($name,$value){$this->$name=$value;} // 数据库连接 private function connect(){ if ($this->conn=='pconn') $this->conn=mysql_pconnect($this- >host,$this->user,$this->pass); // 永久链接 else $this->conn=mysql_connect($this->host,$this->user,$this- >pass); // 临时链接 if (!$this->conn) $this->show_error('无法连接服务器'); $this->select_db($this->data); $this->query('SET NAMES '.$this->code); $this->query("SET CHARACTER_SET_CLIENT='{$this->code}'"); $this->query("SET CHARACTER_SET_RESULTS='{$this->code}'"); } // 数据库选择 public function select_db($data){ $result=mysql_select_db($data,$this->conn); if (!$result) $this->show_error('无法连接数据库'.$data); return $result; } /****************************************************************** -- 函数名:get_info($num) -- 作 用:取得 MySQL 服务器信息 -- 参 数:$num 信息值(选填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function get_info($num){ switch ($num){ case 1: return mysql_get_server_info(); // 取得 MySQL 服务器信息 break; case 2: return mysql_get_host_info(); // 取得 MySQL 主机信息 break; case 3: return mysql_get_proto_info(); // 取得 MySQL 协议信息 break; default: return mysql_get_client_info(); // 取得 MySQL 客户端信息 } } /****************************************************************** -- 函数名:query($sql) -- 作 用:数据库执行语句,可执行查询添加修改删除等任何sql语句 -- 参 数:$sql sql语句(必填) -- 返回值:布尔 -- 实 例:无 *******************************************************************/ public function query($sql){ if (empty($sql)) $this->show_error('SQL语句为空'); $this->sql=preg_replace('/ {2,}/',' ',trim($sql)); $this->result=mysql_query($this->sql,$this->conn); if (!$this->result) $this->show_error('SQL语句有误',true); return $this->result; } /****************************************************************** -- 函数名:create_db($data) -- 作 用:创建添加新的数据库 -- 参 数:$data 数据库名称(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function create_database($data=''){$this->query("CREATE DATABASE {$data}");} // 查询服务器所有数据库 public function show_database(){ $this->query('SHOW DATABASES'); $db=array(); while ($row=$this->fetch_array()) $db[]=$row['Database']; return $db; } // 查询数据库下所有的表 public function show_tables($data=''){ if (!empty($data)) $db=' FROM '.$data; $this->query('SHOW TABLES'.$data); $tables=array(); while ($row=$this->fetch_row()) $tables[]=$row[0]; return $tables; } /****************************************************************** -- 函数名:copy_tables($tb1,$tb2,$where) -- 作 用:复制表 -- 参 数:$tb1 新表名(必填) $tb2 待复制表的表名(必填) $Condition 复制条件(选填) -- 返回值:布尔 -- 实 例:无 *******************************************************************/ public function copy_tables($tb1,$tb2,$Condition=''){$this->query ("SELECT * INTO `{$tb1}` FROM `{$tb2}` {$Condition}");} /****************************************************************** -- 函数名:Get($Table,$Fileds,$Condition,$Rows) -- 作 用:查询数据 -- 参 数:$Table 表名(必填) $Fileds 字段名,默认为所有(选填) $Condition 查询条件(选填) $Rows 待查询记录条数,为0表示不限制(选填) -- 返回值:布尔 -- 实 例:$DB->Get('mydb','user,password','order by id desc',10) *******************************************************************/ public function Get($Table,$Fileds='*',$Condition='',$Rows=0){ if (!$Fileds) $Fileds='*'; if ($Rows>0) $Condition.=" LIMIT 0,{$Rows}"; $sql="SELECT {$Fileds} FROM `{$Table}` {$Condition}"; return $this->query($sql); } // 只查询一条记录 public function GetRs($Table,$Fileds='*',$Condition=''){ if (!$Fileds) $Fileds='*'; $this->query("SELECT {$Fileds} FROM `{$Table}` {$Condition} LIMIT 0,1"); return $this->fetch_array(); } /****************************************************************** -- 函数名:Add($Table,$Data) -- 作 用:添加数据 -- 参 数:$Table 表名(必填) $Data 待添加数据,可以为数组(必填) -- 返回值:布尔 -- 实 例:$DB->Add('mydb',array ('user'=>'admin','password'=>'123456','age'=>'18') 数组型 $DB->Add('mydb','user=admin,password=123456,age=18') 字符 串型 *******************************************************************/ public function Add($Table,$Data){ if (!is_array($Data)){ $arr=explode(',',$Data); $Data=array(); foreach ($arr as $val){ list($key,$val)=explode('=',$val); if (!$val) $val=''; $Data[$key]=$val; } } $Fileds='`'.implode('`,`',array_keys($Data)).'`'; $Value="'".implode("','",array_values($Data))."'"; return $this->query("INSERT INTO `{$Table}` ({$Fileds}) VALUES ({$Value})"); } /****************************************************************** -- 函数名:Set($Table,$Data,$Condition,$unQuot) -- 作 用:更改数据 -- 参 数:$Table 表名(必填) $Data 待更改数据,可以为数组(必填) $Condition 更改条件(选填) $unQuot 不需要加引号的字段,用于字段的加减运算等情况,多个 字段用,分隔或者写入一个数组(选填) -- 返回值:布尔 -- 实 例:$DB->Set('mydb',array ('user'=>'admin','password'=>'123456','WHERE id=1') 数组型 $DB->Set('mydb',"user='admin',password='123456'",'WHERE id=1') 字符串型 *******************************************************************/ public function Set($Table,$Data,$Condition='',$unQuot=''){ if (is_array($Data)){ if (!is_array($unQuot)) $unQuot=explode(',',$unQuot); foreach ($Data as $key=>$val){ $arr[]=$key.'='.(in_array($key,$unQuot)?$val:"'$val'"); } $Value=implode(',',$arr); }else $Value=$Data; return $this->query("UPDATE `{$Table}` SET {$Value} {$Condition}"); } /****************************************************************** -- 函数名:Del($Table,$Condition) -- 作 用:删除数据 -- 参 数:$Table 表名(必填) $Condition 删除条件(选填) -- 返回值:布尔 -- 实 例:$DB->Del('mydb','id=1') *******************************************************************/ public function Del($Table,$Condition=''){return $this->query ("DELETE FROM `{$Table}`".($Condition?" WHERE {$Condition}":''));} // 取得结果数据 public function result($result=''){ if (empty($result)) $result=$this->result; if ($result==null) $this->show_error('未获取到查询结果',true); return mysql_result($result); } /****************************************************************** -- 函数名:fetch_array($Table,$Condition) -- 作 用:根据从结果集取得的行生成关联数组 -- 参 数:$result 结果集(选填) $type 数组型,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(选填) -- 返回值:布尔 -- 实 例:$DB->Del('mydb','id=1') *******************************************************************/ public function fetch_array($result='',$type=MYSQL_BOTH){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_array($result,$type); } // 获取关联数组,使用$row['字段名'] public function fetch_assoc($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_assoc($result); } // 获取数字索引数组,使用$row[0],$row[1],$row[2] public function fetch_row($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_row($result); } // 获取对象数组,使用$row->content public function fetch_obj($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_fetch_object($result); } // 取得上一步 INSERT 操作产生的 ID public function insert_id(){return mysql_insert_id();} // 指向确定的一条数据记录 public function data_seek($id){ if ($id>0) $id=$id-1; if (!mysql_data_seek($this->result,$id)) $this->show_error('指定 的数据为空'); return $this->result; } /****************************************************************** 函数名:num_fields($result) 作 用:查询字段数量 参 数:$Table 数据库表名(必填) 返回值:字符串 实 例:$DB->num_fields("mydb") *******************************************************************/ public function num_fields($result=''){ if (empty($result)) $result=$this->result; if (!$result) $this->show_error('未获取到查询结果',true); return mysql_num_fields($result); } // 根据select查询结果计算结果集条数 public function num_rows($result=''){ if (empty($result)) $result=$this->result; $rows=mysql_num_rows($result); if ($result==null){ $rows=0; $this->show_error('未获取到查询结果',true); } return $rows>0?$rows:0; } // 根据insert,update,delete执行结果取得影响行数 public function affected_rows(){return mysql_affected_rows();} // 获取地址栏参数 public function getQuery($unset=''){ //$unset表示不需要获取的参数, 多个参数请用,分隔(例如:getQuery('page,sort')) if (!empty($unset)){ $arr=explode(',',$unset); foreach ($arr as $val) unset($_GET[$val]); } foreach ($_GET as $key=>$val) $list[]=$key.'='.urlencode($val); return is_array($list)?implode('&',$list):''; } /****************************************************************** 函数名:getPage($Table,$Fileds,$Condition,$pageSize) 作 用:获取分页信息 参 数:$Table 表名(必填) $Fileds 字段名,默认所有字段(选填) $Condition 查询条件(选填) $pageSize 每页显示记录条数,默认10条(选填) 返回值:字符串 实 例:无 *******************************************************************/ public function getPage($Table,$Fileds='*',$Condition='', $pageSize=10){ if (intval($pageSize)>0){$this->pageSize=intval($pageSize);} if (isset($_GET['page']) && intval($_GET['page'])){$this- >pageNo=intval($_GET['page']);} if (empty($Fileds)){$Fileds='*';} $sql="SELECT * FROM `{$Table}` {$Condition}"; $this->query($sql); $this->rsAll=$this->num_rows(); if ($this->rsAll>0){ $this->pageAll=ceil($this->rsAll/$this->pageSize); if ($this->pageNopageNo=1;} if ($this->pageNo>$this->pageAll){$this->pageNo=$this- >pageAll;} $sql="SELECT {$Fileds} FROM `{$Table}` {$Condition}".$this- >limit(true); $this->query($sql); } return $this->rsAll; } // 构造分页limit语句,和getPage()函数搭配使用 public function limit($str=false){ $n=($this->pageNo-1)*$this->pageSize; return $str?' LIMIT '.$n.','.$this->pageSize:$n; } // 显示分页,必须和getPage()函数搭配使用 public function showPage($number=true){ $pageBar=''; if ($this->pageAll>1){ $pageBar.=''.chr(10); $url=$this->getQuery('page'); $url=empty($url)?'?page=':'?'.$url.'&page;='; if ($this->pageNo>1){ $pageBar.='首页'.chr (10); $pageBar.='pageNo-1).'">上页 '.chr(10); }else{ $pageBar.='首页'.chr (10); $pageBar.='上页'.chr (10); } if ($number){ $arr=array(); if ($this->pageAll<6){ for ($i=0;$ipageAll;$i++) $arr[]=$i+1; }else{ if ($this->pageNopageNopageAll&&$this- >pageNo>($this->pageAll-3)) for ($i=1;$ipageAll-5+$i; else for ($i=1;$ipageNo-3+$i; } foreach ($arr as $val){ if ($val==$this->pageNo) $pageBar.=''.$val.''.chr(10); else $pageBar.=''. $val.''.chr(10); } } if ($this->pageNopageAll){ $pageBar.='pageNo+1).'">下页 '.chr(10); $pageBar.='pageAll.'">尾页 '.chr(10); }else{ $pageBar.='下页'.chr (10); $pageBar.='尾页'.chr (10); } $pageBar.=''; $pageBar.="页次:{$this->pageNo}/{$this->pageAll} {$this- >pageSize}条/页 总记录:{$this->rsAll} 转到:"; $pageBar.="<input id=\"page\" value=\"{$this->pageNo}\" type=\"text\" onblur=\"goPage('{$url}',{$this->pageAll});\" />"; $pageBar.=''.chr(10); } echo $pageBar; } // 获得客户端真实的IP地址 public function getip(){ if ($_SERVER['HTTP_X_FORWARDED_FOR']) return $_SERVER ['HTTP_X_FORWARDED_FOR']; elseif ($_SERVER['HTTP_CLIENT_IP']) return $_SERVER ['HTTP_CLIENT_IP']; elseif ($_SERVER['REMOTE_ADDR']) return $_SERVER['REMOTE_ADDR']; elseif (getenv('HTTP_X_FORWARDED_FOR')) return getenv ('HTTP_X_FORWARDED_FOR'); elseif (getenv('HTTP_CLIENT_IP')) return getenv ('HTTP_CLIENT_IP'); elseif (getenv('REMOTE_ADDR')) return getenv('REMOTE_ADDR'); else return ''; } /****************************************************************** -- 函数名:show_error($message,$sql) -- 作 用:输出显示错误信息 -- 参 数:$msg 错误信息(必填) $sql 显示错误的SQL语句,在SQL语句错误时使用(选填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function show_error($msg='',$sql=false){ $err='['.mysql_errno().']'.mysql_error(); if ($sql) $sql='SQL语句:'.$this->sql; if ($this->errLog){ $dirs='error/'; //设置错误日志保存目录 $fileName=date('Y-m-d').'.log'; $filePath=$dirs.$fileName; if (!is_dir($dirs)){ $dirs=explode('/',$dirs); $temp=''; foreach($dirs as $dir){ $temp.=$dir.'/'; if (!is_dir($temp)){ mkdir($temp,0777) or die('__无法建立目录'. $temp.',自动取消记录错误信息'); } } $filePath=$temp.$fileName; } $text="错误事件:".$msg."\r\n错误原因:".$err."\r\n".($sql? $sql."\r\n":'')."客户端IP:".$this->getip()."\r\n记录时间:".date('Y-m-d H:i:s')."\r\n\r\n"; $log='错误日志:__'.(error_log($text,3,$filePath)?'此错误信 息已被自动记录到日志'.$fileName:'写入错误信息到日志失败'); } if ($this->showErr){ echo ' 错误信息提示 错误事件:'.$err.' 错误原因:'.$msg.' '.$sql.' '.$log.' '; exit(); } } /****************************************************************** -- 函数名:drop($table) -- 作 用:删除表(请慎用,无法恢复) -- 参 数:$table 要删除的表名,默认为所有(选填) -- 返回值:无 -- 实 例:$DB->drop('mydb') *******************************************************************/ public function drop($table){ if ($table){ $this->query("DROP TABLE IF EXISTS `{$table}`"); }else{ $rst=$this->query('SHOW TABLES'); while ($row=$this->fetch_array()){ $this->query("DROP TABLE IF EXISTS `{$row[0]}`"); } } } /****************************************************************** -- 函数名:makeSql($table) -- 作 用:从数据表读取信息并生成SQL语句 -- 参 数:$table 待读取的表名(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function makeSql($table){ $result=$this->query("SHOW CREATE TABLE `{$table}`"); $row=$this->fetch_row($result); $sqlStr=''; if ($row){ $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="-- Table structure for `{$table}`\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="DROP TABLE IF EXISTS `{$table}`;\r\n{$row[1]};\r \n"; $this->Get($table); $fields=$this->num_fields(); if ($this->num_rows()>0){ $sqlStr.="\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; $sqlStr.="-- Records of `{$table}`\r\n"; $sqlStr.="-- ---------------------------------------------------------------\r\n"; while ($row=$this->fetch_row()){ $comma=''; $sqlStr.="INSERT INTO `{$table}` VALUES ("; for($i=0;$isaveSql('../mydb.sql'); *******************************************************************/ public function saveSql($sqlPath='',$table=''){ if (empty($table)){ $result=$this->query('SHOW TABLES'); while ($arr=$this->fetch_row($result)){ $str=$this->makeSql($arr[0]); if (!empty($str)) $sql.=$str; } $text="/*************************************************************** \\r\\n"; $text.="-- Database: $this->data\r\n"; $text.="-- Date Created: ".date('Y-m-d H:i:s')."\r\n"; $text.="***************************************************************/ \r\n\r\n"; }else{ $text=''; $sql=$this->makeSql($table); } if (empty($sql)) return false; $text.=$sql; $dir=dirname($sqlPath); $file=basename($sqlPath); if (empty($file)) $file=date('YmdHis').'.sql'; $sqlPath=$dir.'/'.$file; if (!empty($dir)&&!is_dir($dir)){ $path=explode('/',$dir); $temp=''; foreach ($path as $dir){ $temp.=$dir.'/'; if (!is_dir($temp)){ if (!mkdir($temp,0777)) return false; } } $sqlPath=$temp.$file; } $link=fopen($sqlPath,'w+'); if (!is_writable($sqlPath)) return false; return fwrite($link,$text); fclose($link); } /****************************************************************** -- 函数名:loadSql($filePath) -- 作 用:从SQL文件导入信息到数据库 -- 参 数:$filePath SQL文件路径(必填) -- 返回值:字符串 -- 实 例:无 *******************************************************************/ public function loadSql($filePath){ $val=$this->readSql($filePath); if ($val==false) $this->show_error($filePath.'不存在'); elseif (empty($val)) $this->show_error($filePath.'中无有效数 据'); else{ $errList=''; foreach ($val as $sql){ $result=mysql_query($sql); if (!$result) $errList.='执行语句'.$sql.'失败'; } return $errList; } return false; } // 释放结果集 public function free(){mysql_free_result($this->result);} // 关闭数据库 public function close(){mysql_close($this->conn);} // 析构函数,自动关闭数据库,垃圾回收机制 public function __destruct(){ $this->free(); $this->close(); } } ?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值