天空是蓝色的
做好软件为中国 #gcc -c helloworld.c -o helloworld.o //编译目标文件 #gcc helloworld.o -o helloworld //编译成可执行exe #helloworld //运行exe
BlogJava
首页
新随笔
聚合
管理
数据加载中……
[转载]重新封装的PHPLib DB类
http://dev.csdn.net/article/81/81559.shtm
[
连接数据库
]
//包含数据库处理类文件
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)
;
//统计记录数,统计所有类型为学生的
$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'
"
)
;
[
类库代码
]
<?php
/**
* 文件: database.inc.php
* 描述: 数据库操作类
* 作者: heiyeluren
* 创建:
2005
-
12
-
25
* 修改:
2005
-
12
-
26
* 说明: 本库使用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<br>\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<$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
;
}
}
// 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(
"
</td></tr></table><b>Database error:</b> %s<br>\n
"
,
$msg)
;
printf(
"
<b>MySQL Error</b>: %s (%s)<br>\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
;
$i<$limit&&$this->next_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