复制代码
代码如下:
<?php
/*
MYSQL
数据库访问封装类
MYSQL
数据访问方式,php4支持以mysql_开头的过程访问方式,php5开始支持以mysqli_开头的过程和mysqli面向对象
访问方式,本封装类以mysql_封装
数据访问的一般流程:
1,连接数据库
mysql_connect
or
mysql_pconnect
2,选择数据库
mysql_select_db
3,执行SQL查询
mysql_query
4,处理返回的数据
mysql_fetch_array
mysql_num_rows
mysql_fetch_assoc
mysql_fetch_row
etc
*/
class
db_mysql
{
var
$querynum
=
0
;
//当前页面进程查询数据库的次数
var
$dblink
;
//数据库连接资源
//链接数据库
function
connect($dbhost,$dbuser,$dbpw,$dbname='',$dbcharset='utf-8',$pconnect=0
,
$halt=true)
{
$func
=
empty($pconnect)
?
'mysql_connect'
:
'mysql_pconnect'
;
$this->dblink
=
@$func($dbhost,$dbuser,$dbpw)
;
if
($halt
&&
!$this->dblink)
{
$this->halt("无法链接数据库!");
}
//设置查询字符集
mysql_query("SET
character_set_connection={$dbcharset},character_set_results={$dbcharset},character_set_client=binary",$this->dblink)
;
//选择数据库
$dbname
&&
@mysql_select_db($dbname,$this->dblink)
;
}
//选择数据库
function
select_db($dbname)
{
return
mysql_select_db($dbname,$this->dblink);
}
//执行SQL查询
function
query($sql)
{
$this->querynum++
;
return
mysql_query($sql,$this->dblink)
;
}
//返回最近一次与连接句柄关联的INSERT,UPDATE
或DELETE
查询所影响的记录行数
function
affected_rows()
{
return
mysql_affected_rows($this->dblink)
;
}
//取得结果集中行的数目,只对select查询的结果集有效
function
num_rows($result)
{
return
mysql_num_rows($result)
;
}
//获得单格的查询结果
function
result($result,$row=0)
{
return
mysql_result($result,$row)
;
}
//取得上一步
INSERT
操作产生的
ID,只对表有AUTO_INCREMENT
ID的操作有效
function
insert_id()
{
return
($id
=
mysql_insert_id($this->dblink))
>=
0
?
$id
:
$this->result($this->query("SELECT
last_insert_id()"),
0);
}
//从结果集提取当前行,以数字为key表示的关联数组形式返回
function
fetch_row($result)
{
return
mysql_fetch_row($result)
;
}
//从结果集提取当前行,以字段名为key表示的关联数组形式返回
function
fetch_assoc($result)
{
return
mysql_fetch_assoc($result);
}
//从结果集提取当前行,以字段名和数字为key表示的关联数组形式返回
function
fetch_array($result)
{
return
mysql_fetch_array($result);
}
//关闭链接
function
close()
{
return
mysql_close($this->dblink)
;
}
//输出简单的错误html提示信息并终止程序
function
halt($msg)
{
$message
=
"<html>\n<head>\n"
;
$message
.=
"<meta
content='text/html;charset=gb2312'>\n"
;
$message
.=
"</head>\n"
;
$message
.=
"<body>\n"
;
$message
.=
"数据库出错:".htmlspecialchars($msg)."\n"
;
$message
.=
"</body>\n"
;
$message
.=
"</html>"
;
echo
$message
;
exit
;
}
}
?>
㈡ 面向对象程序设计中的数据封装指的是
对象内部数据结构的不可访问性 输入数据必须用保密密码输入,数据加密,这不是面向对象编程的特点;不可能在对象的内部数据结构上建立防火墙,所以它们不是面向对象编程中的数据隐藏。面向对象编程系统中的封装单元是对象,对象之间只能通过接缺腔口交换信息,对象中的数据不能从外部随意访问,导致对象内部的数据结构不可访问,数据隐藏在对象中。这就是面向对象编程中的数据隐藏所指的。Redis是一个键-值对数据库,每个键是一个字符串对象,值可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象五种中的一种。Redis使用sds(简单动态字符串)来表示最基本的字符串数据。这个结构记录了用于保存字符串的字节数组char buf[]、已用长度int len和未用长度int free。有点像java中的字符串对象。这个sds使用C字符串作为文字量,遵循C风格,以空字符' '作为字符串的结尾,这样就可以直接重用C字符串函数库的部分函数,但与C字符串相比,它有以下优点:直接保存字符串长度而不是像C一样遍历得到长度;通过预分配空间和释放惰性空间,减少了修改字符串引起的内存重分配。空间预分配的意思是:当需要扩展字符数组的容量时,如果分配的长度将小于1MB,则预分配搏笑与当前len长度相同的字节数,如果超过1MB,则分配1MB。惰性空间释放是指当sds字符串被缩短时,多余的字节数组不被伏银衫回收,而是通过增长free来记录,这样下次如果free本身足够了,就不需要申请内存了。当然,也有可以调整为主动释放的API。用二进制方法处理buf数组,保留二进制数据,这样就可以保存除文本数据以外的其他格式,比如图片、音视频、压缩文件等。