设为首页 收藏本站
查看: 452|回复: 0

[经验分享] PHP数据操作类

[复制链接]

尚未签到

发表于 2017-3-27 12:31:13 | 显示全部楼层 |阅读模式
<?php
/**
+----------------------------------------------------------
* Mysql操作类
+----------------------------------------------------------
* 文件名称  Db.class.php
+----------------------------------------------------------
* 文件描述  mysql操作类
+----------------------------------------------------------
*/
class Db{
//数据库连接标识
protected $link = null;
//当前操作的表
public $table = '';
//查询参数
protected $options = array();
//当前执行的SQL语句
protected $sql = '';
//用什么编码传递数据
protected $dbCharset = 'utf8';

//缓存路径
protected $cachePath = './cache/';
//缓存扩展名
protected $cacheFileExt = "php";
//缓存文件名
protected $cacheFileName;
//是否缓存
protected $cache = false;
//缓存更新时间秒数
protected $cacheLimitTime = 60;

//数据返回类型, 1代表数组, 2代表对象
protected $returnType = 1;

/*
* 根据当前动态文件生成缓存文件名
*/
function setCacheFileName($fileName) {
$cacheFileName = $this->cachePath . strtoupper(md5($fileName)).".".$this->cacheFileExt;
$this->cacheFileName=$cacheFileName;
}
/*
* 根据当前动态文件生成缓存文件名
*/
function getCacheFileName() {
return  $this->cacheFileName;
}
/**
* 连接数据库
*
* @access      public
* @param       array    $db  数据库配置
* @return      resource 数据库连接标识
*/
public function connect($db){
//根据配置使用不同函数连接数据库
$db['host'] = isset($db['port']) ? $db['host'].':'.$db['port']: $db['host'];
$db['char'] = isset($db['char']) ? $db['char']: $this->dbCharset;
$func = $db['pconnect'] ? 'mysql_pconnect' : 'mysql_connect';
$this->link = $func($db['host'], $db['user'], $db['pwd']);
mysql_select_db($db['database'], $this->link);
mysql_query("SET NAMES '{$db['char']}'");
$this->cachePath = isset($db['cachepath']) ? $db['cachepath']: $this->cachePath;
return $this->link;
}
/**
* 查询符合条件的一条记录
*
* @access      public
* @param       string    $where  查询条件
* @param       string    $field  查询字段
* @param       string    $table  表
* @return      mixed             符合条件的记录
*/
public function find($where = NULL, $field = '*', $table = ''){
return $this->findAll($where = NULL, $field = '*', $table = '', FALSE);
}
/**
* 查询符合条件的所有记录
*
* @access      public
* @param       string    $where  查询条件
* @param       string    $field  查询字段
* @param       string    $table  表
* @return      mixed             符合条件的记录
*/
public function findAll($where = NULL, $field = '*', $table = '', $all = TRUE){
$this->options['where'] = is_null($where) ? @$this->options['where']: $where;
$this->options['field'] = isset($this->options['field']) ? $this->options['field']: $field;
$this->options['table'] = $table == '' ? $this->table: $table;
$sql = "SELECT {$this->options['field']} FROM `{$this->options['table']}` ";
$sql .= isset($this->options['join']) ? ' LEFT JOIN '.$this->options['join']: '';
$sql .= isset($this->options['where']) ? ' WHERE '.$this->options['where']: '';
$sql .= isset($this->options['group']) ? ' GROUP BY '.$this->options['group']: '';
$sql .= isset($this->options['having']) ? ' HAVING '.$this->options['having']: '';
$sql .= isset($this->options['order']) ? ' ORDER BY '.$this->options['order']: '';
$sql .= isset($this->options['limit']) ? ' LIMIT '.$this->options['limit']: '';
$this->sql = $sql;
$row = NULL;
//如果开启了缓存, 那么重缓存中获取数据
if ($this->cache === TRUE){
$this->setCacheFileName($this->sql);
$row = $this->readCache();
}
//如果读取失败, 或则没有开启缓存
if (is_null($row)){
$result = $this->query();
$row = $all === TRUE ? $this->fetchAll($result): $this->fetch($result);
//如果开启了缓存, 那么就写入
if ($this->cache === TRUE){
$this->writeCache($row);
}
$this->options = array();
}
return $row;
}
/**
* 读取结果集中的所有记录到数组中
*
* @access public
* @param  resource  $result  结果集
* @return array
*/
public function fetchAll($result = NULL){
$rows = array();
while ($row = $this->fetch($result)){
$rows[] = $row;
}
return $rows;
}
/**
* 读取结果集中的一行记录到数组中
*
* @access public
* @param  resource  $result  结果集
* @param  int       $type    返回类型, 1为数组, 2为对象
* @return mixed              根据返回类型返回
*/
public function fetch($result = NULL, $type = NULL){
$result = is_null($result) ? $this->result: $result;
$type = is_null($type) ? $this->returnType: $type;
$func = $type === 1 ? 'mysql_fetch_assoc' : 'mysql_fetch_object';
return $func($result);
}
/**
* 执行SQL命令
*
* @access      public
* @param       string    $sql    SQL命令
* @param       resource  $link   数据库连接标识
* @return      mixed             数据库结果集
*/
public function query($sql = '', $link = NULL){
$sql = empty($sql) ? $this->sql: $sql;
$link = is_null($link) ? $this->link: $link;
$this->result = mysql_query($sql, $link);
if (is_resource($this->result)){
return $this->result;
}
//如果执行SQL出现错误, 那么抛出异常
exit('<strong>Mysql error:</strong>'.$this->getError());
}
/**
* 执行SQL命令
*
* @access      public
* @param       string    $sql    SQL命令
* @param       resource  $link   数据库连接标识
* @return      bool              是否执行成功
*/
public function execute($sql = '', $link = NULL){
$sql = empty($sql) ? $this->sql: $sql;
$link = is_null($link) ? $this->link: $link;
if (mysql_query($sql, $link)){
return TRUE;
}
return FALSE;
}
/**
* 插入记录
*
* @access public
* @param  array  $data  插入的记录, 格式:array('字段名'=>'值', '字段名'=>'值');
* @param  string $table 表名
* @return bool          当前记录id
*/
public function add($data, $table = NULL){
$table = is_null($table) ? $this->table: $table;
$sql = "INSERT INTO `{$table}`";
$fields = $values = array();
$field = $value = '';
//遍历记录, 格式化字段名称与值
foreach($data as $key => $val){
$fields[] = "`{$table}`.`{$key}`";
$values[] = is_numeric($val) ? $val : "'{$val}'";
}
$field = join(',', $fields);
$value = join(',', $values);
unset($fields, $values);
$sql .= "({$field}) VALUES({$value})";
$this->sql = $sql;
$this->execute();
return $this->insertId();
}
/**
* 删除记录
*
* @access public
* @param  string  $where  条件
* @param  string  $table  表名
* @return bool            影响行数
*/
public function delete($where = NULL, $table = NULL){
$table = is_null($table) ? $this->table: $table;
$where = is_null($where) ? @$this->options['where']: $where;
$sql = "DELETE FROM `{$table}` WHERE {$where}";
$this->sql = $sql;
$this->execute();
return $this->affectedRows();
}
/**
* 更新记录
*
* @access public
* @param  array   $data   更新的数据 格式:array('字段名' => 值);
* @param  string  $where  更新条件
* @param  string  $table  表名
* @return bool            影响多少条信息
*/
public function update($data, $where = NULL, $table = NULL){
$table = is_null($table) ? $this->table: $table;
$where = is_null($where) ? @$this->options['where']: $where;
$sql = "UPDATE `{$table}` SET ";
$values = array();
foreach($data as $key => $val){
$val = is_numeric($val) ? $val : "'{$val}'";
$values[] = "`{$table}`.`{$key}` = {$val}";
}
$value = join(',', $values);
$this->sql = $sql.$value." WHERE {$where}";
$this->execute();
return $this->affectedRows();
}
/**
* 读取缓存
*
* @access      public
* @return      mixed   如果读取成功返回缓存内容, 否则返回NULL
*/
protected function readCache(){
$file = $this->getCacheFileName();
if (file_exists($file)){
//缓存过期
if ((filemtime($file) + $this->cacheLimitTime) < time()){
@unlink($file);
return NULL;
}
if (1 === $this->returnType){
$row = include $file;
}
else{
$data = file_get_contents($file);
$row = unserialize($data);
}
return $row;
}
return NULL;
}
/**
* 写入缓存
*
* @access      public
* @param       mixed   $data   缓存内容
* @return      bool            是否写入成功
*/
public function writeCache($data){
$file = $this->getCacheFileName();
if ($this->makeDir(dirname($file))){
if (1 === $this->returnType){
$data = '<?php return '.var_export($data, TRUE).';?>';
}else{
$data = serialize($data);
}
}
return file_put_contents($file, $data);
}
/*
* 清除缓存文件
* string $fileName 指定文件名(含函数)或者all(全部)
* 返回:清除成功返回true,反之返回false
*/
function clearCache( $fileName = "all" ) {
if( $fileName != "all" ) {
if( file_exists( $fileName ) ) {
return @unlink( $fileName );
}else return false;
}
if ( is_dir( $this->cachePath ) ) {
if ( $dir = @opendir( $this->cachePath ) ) {
while ( $file = @readdir( $dir ) ) {
$check = is_dir( $file );
if ( !$check )
@unlink( $this->cachePath . $file );
}
@closedir( $dir );
return true;
}else{
return false;
}
}else{
return false;
}
}
/*
* 连续建目录
* string $dir 目录字符串
* int $mode   权限数字
* 返回:顺利创建或者全部已建返回true,其它方式返回false
*/
function makeDir( $dir, $mode = "0777" ) {
if( ! $dir ) return 0;
$dir = str_replace( "\\", "/", $dir );

$mdir = "";
foreach( explode( "/", $dir ) as $val ) {
$mdir .= $val."/";
if( $val == ".." || $val == "." || trim( $val ) == "" ) continue;

if( ! file_exists( $mdir ) ) {
if(!@mkdir( $mdir, $mode )){
return false;
}
}
}
return true;
}
//自动加载函数, 实现特殊操作
public function __call($func, $args)
{
if(in_array($func, array('field', 'join', 'where', 'order', 'group', 'limit', 'having')))
{
$this->options[$func] = array_shift($args);
return $this;
} elseif($func === 'table'){
$this->options['table'] = array_shift($args);
$this->table            = $this->options['table'];
return $this;
}
//如果函数不存在, 则抛出异常
exit('Call to undefined method Db::' . $func . '()');
}
//-------------------------------------------------------------------------------
//返回上一次操作所影响的行数
public function affectedRows($link = null){
$link = is_null($link) ? $this->link : $link;
return mysql_affected_rows($link);
}

//返回上一次操作记录的id
public function insertId($link = null){
$link = is_null($link) ? $this->link : $link;
return mysql_insert_id($link);
}

//清空结果集
public function free($result = null){
$result = is_null($result) ? $this->result : $result;
return mysql_free_result($result);
}

//返回错误信息
public function getError($link = NULL){
$link = is_null($link) ? $this->link : $link;
return mysql_error($link);
}

//返回错误编号
public function getErrno($link = NULL){
$link = is_null($link) ? $this->link : $link;
return mysql_errno($link);
}
}
?>
   调用方法:

<?php
include ('DB.php');   //引入类文件
$db = new Db();    //实例化mysql操作类

//数据库配置信息数组
$config['host']     = 'localhost';   //mysql主机
$config['user']     = 'root';        //用户
$config['pwd']      = '';            //密码
$config['port']     = '3306';        //端口
$config['database'] = 'message';     //数据库
$config['char']     = 'utf8';        //字符集
$config['pconnect'] = FALSE;         //是否使用持久性连接

$link = $db->connect($config);  //传入配置, 连接数据库, $link为连接标识
$rows = $db->table('test')->field('*')->order('id DESC')->limit(0, 10)->findAll();
//上面的操作, 相当于执行SQL命令: SELECT * FROM test ORDER BY id DESC LIMIT 0, 10;

print_r($db->getCacheFileName());
//$db->clearCache($db->getCacheFileName());
//$db->clearCache();
// 执行的效果和上面相同, 但是多了一个cache方法,也就缓存了这次查询 cache()有三个参数, cache(缓存名称, 有效时间, 缓存路径); 缓存名称默认是使用md5(SQL命令)为名称, 有效时间默认为1分钟, 缓存路径可以在连接数据库时进行配置

//下面来插入一条记录
$data = array(
'name'  => 'xiaokai',
'pass'  => '123456',
);

$db->add($data);
// 这样就插入了一条记录 注意这里$data的格式为 array('字段名称1' => '值1', '字段名称2' => '值2', .....);
//相当于执行SQL命令: INSERT INTO test(`name`, `pass`) VALUES('xiaokai', '123456');
//朋友们可能奇怪了, add 函数并没有传入表名称啊, 为什么会执行这样的SQL命令呢?
//其实在上面查询的时候就已经使用$db->table('test')方法了, 这里已经传入了表名称, 所以在操作就不需要指定表名称了.

//有插入就有删除, 下面来删除
$db->delete('id = 10');
//这样就删除了test表中 id为10的记录
//相当于执行SQL命令: DELETE FROM test WHERE id = 10;
//这里也是一样没有传入表名称

//下面构造数组, 然后更新一条记录
$data = array(
'name'  => '123456',
'pass'  => 'xiaokai',
);
$db->update($data, 'id = 10');
//这样就将id为10的记录给更新了
//相当于执行SQL命令: UPDATE test set name = '123456', pass = 'xiaokai' WHERE id = 10;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-356153-1-1.html 上篇帖子: php数组 多维数组 下篇帖子: php常用库函数(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表