您的位置:首页 > 编程语言 > PHP开发

(PHP)CRUD类及分页类

2009-12-22 17:18 225 查看
之前写的crud类实在比较简单(http://blog.csdn.net/yycai/archive/2009/12/15/5012353.aspx),重新封装了一下:

<?php
/**
* 自动化数据表操作类
* @example
* <code>
* $db  = cls_crud::factory(array('table'=>'article'));
* $data = $db->get_block_list(array('category_id' => 3), 9);
*
* $data = $db->get_list(array('title', 'id', 'time'), array('category_id'=>$cid), 'time', 1, $_GET['page'], 2, 1);
* $page_html = $db->page->get_html("?action=list&cid={$cid}", 'ylmf-page');
*
* </code>
* @author 小蔡	<cyy0523xc@gmail.com>
* @version 1.2
*/
class cls_crud
{
private static $_instance = null;
/**
* 数据表名
* @var string
*/
private $table = '';
private $link;
private $query_id;

/**
* 分页对象
* @var array
*/
public $page = null;
/**
* 私有构造函数(单例模式)
* @param
*/
private function __construct()
{
}
/**
* 配置
* @param array $config		配置变量
*/
private function config($config)
{
if(!empty($config))
{
foreach($config as $cf => $val)
{
$this->$cf = $val;
}
}
}
/**
* 工厂函数
* @param array $config		配置变量(最基本要配置数据表名)
* @param array $database	数据库链接参数
*/
public static function factory($config, $database=array())
{
if (null === self::$_instance)
{
self::$_instance = new self();
self::$_instance->connect($database);
self::$_instance->page = new cls_page();
}
self::$_instance->config($config);
return self::$_instance;
}
/**
* 设置数据表(例如:在操作的过程中需要改变数据表,就可以使用此方法)
* @param string $table
*/
public function set_table($table)
{
$this->table = $table;
}
/**
* 连接数据库+选择数据库...
* @return void
*/
private function connect($database = array())
{
if(empty($database))
{
include __CONFIG__.'/inc_database.php';
}
try
{
$this->link = @mysql_connect($database['db_host'],$database['db_user'],$database['db_pass']);
if(!$this->link)
{
throw new cls_dbexception(mysql_error());
}
else
{
if($this->server_info() > '4.1')
{
$charset = str_replace('-', '',strtolower($database['db_charset']));
mysql_query("SET character_set_connection=".$charset.", character_set_results=".$charset.", character_set_client=binary",$this->link);
}
if($this->server_info() > '5.0')
{
mysql_query("SET sql_mode=''",$this->link);
}
if(!@mysql_select_db($database['db_name'],$this->link))
{
throw new cls_dbexception(mysql_error());
}
}
}
catch (cls_dbexception $e)
{
die($e->getError());
}
}
/**
* 返回数据库版本...
* @return string
*/
private function server_info()
{
return mysql_get_server_info();
}
/**
* 向数据库查询sql语句...
*
* @deprecated INSERT UPDATE DELETE
* @param  string $sql
* @return bool
*/
public function query($sql)
{
try
{
$this->query_id = @mysql_query($sql,$this->link);
if(!$this->query_id)
{
throw new cls_dbexception(mysql_error());
}
else
{
$GLOBALS['QUERY_NUM']++;
return $this->query_id;
}
}
catch (cls_dbexception $e)
{
die($e->getError());
}
}
/**
* 读取一条记录
* @param string $id		主键
* @param string $fields	获取字段
* @return array
*/
public function read($id, $fields='*')
{
$sql = "SELECT {$fields} FROM `{$this->table}` WHERE `id`='{$id}'";
$this->query($sql);
return $this->fetch_one();
}
/**
* 插入一条记录
* @param array $array	数组
* @return bool
*/
public function insert($array)
{
$fields = array();
$values = array();
foreach($array as $f => $v)
{
$fields[] = "`{$f}`";
$values[] = "'".mysql_real_escape_string($v)."'";
}
$fields = implode(',', $fields);
$values = implode(',', $values);
$sql = "INSERT INTO `{$this->table}`({$fields}) VALUES({$values})";
return $this->query($sql);
}
/**
* 更新一条记录
* @param int   $id		主键
* @param array $array	数据数组
*/
public function update($id, $array)
{
$values = array();
foreach($array as $f => $v)
{
$values[] = "`{$f}`='".mysql_real_escape_string($v)."'";
}
$values = implode(',', $values);
$sql = "UPDATE `{$this->table}` SET {$values} WHERE id='{$id}' LIMIT 1";
return $this->query($sql);
}
/**
* 删除一条记录
* @param int $id	主键
* @return bool
*/
public function delete($id)
{
$sql = "DELETE FROM `{$this->table}` WHERE id='{$id}' LIMIT 1";
return $this->query($sql);
}
/**
* 获取分页列表的数据
* @example
* <code>
* 参数:$wheres = array('id'=>23, 'NOT(`name` IS NULL)')
* ==>   `id`='23' AND NOT(`name` IS NULL)
* </code>
* @param string|array	$fields	需要读取的字段(注:如果是字符串,则需要对字段名加上“``”标识)
* @param array  $wheres	where条件数组,如果下标是数字,则直接加入条件,否则组合成:`{下标}`='{值}'这样的条件。最后用and链接
* @param string $order		排序字段
* @param int    $desc		是否是降序
* @param int    $offset	偏移量
* @param int    $limit		读取记录数
* @param int    $return_total	是否返回满足条件的记录总数,默认为0,需要显示分页时可以设置为1.(如果需要获取分页代码,此值必须为1)
* @return array
*/
public function get_list($fields="*", $wheres=array(), $order='', $desc=1, $page=1, $limit=20, $return_total=0)
{
//处理需要读取的字段
if(is_array($fields) && !empty($fields))
{
$fields = '`'.implode('`,`', $fields) . '`';
}
//处理where条件
if($wheres)
{
$where = array();
foreach($wheres as $f => $v)
{
if(is_numeric($f))
{
$where[] = $v;
}
else
{
$where[] = "`{$f}`='".mysql_real_escape_string($v)."'";
}
}
$where = implode(' AND ', $where);
}
else
{
$where = '1';
}
//处理orderby
$orderby = '';
if(!empty($order))
{
$orderby = "ORDER BY `{$order}` " . (1===$desc ? 'DESC' : 'ASC');
'id'!=$order && $orderby .= ", `id` DESC";
}
$this->page->set_page($page, $limit);
echo $sql = "SELECT {$fields} FROM `{$this->table}` WHERE {$where} {$orderby} LIMIT {$this->page->offset}, {$this->page->limit}";
//var_dump($this);
$this->query($sql);
$data = $this->fetch_all();
//var_dump($sql);
if($return_total)
{
//返回记录总数(分页)
$sql = "SELECT count(*) FROM `{$this->table}` WHERE {$where}";
$this->query($sql);
$total = $this->fetch_one();
$this->page->set_total(current($total));
}
return $data;
}
public function get_block_list($wheres, $limit, $fields="*", $order='id')
{
$data = $this->get_list($fields, $wheres, $order, 1, 0, $limit);
return $data;
}
/**
* 返回单条记录数据...
* @deprecated   MYSQL_ASSOC==1 MYSQL_NUM==2 MYSQL_BOTH==3
* @param  int   $result_type
* @return array
*/
public function fetch_one($result_type = 1)
{
return mysql_fetch_array($this->query_id,$result_type);
}
/**
* 返回多条记录数据..
* @deprecated    MYSQL_ASSOC==1 MYSQL_NUM==2 MYSQL_BOTH==3
* @param   int   $result_type
* @return  array
*/
public function fetch_all($result_type = 1)
{
while($row = mysql_fetch_array($this->query_id,$result_type))
{
$row_array[] = $row;
}
return $row_array;
}
}


<?php
/**
* 分页类(与crud类结合使用)
* @author 小蔡 <cyy0523xc@gmail.com>
* @version 1.1
*/
class cls_page
{
public $offset = 0;
public $limit = 20;
public $total = 0;
private $page = 1;
private $pagenum = 0;
private $style = 'pages';
/**
* 设置当前页码
* @param $page
*/
public function set_page($page = 1, $limit = 20)
{
//当前页数
$this->page = intval($page);
$this->limit = intval($limit);
if(!$this->page || $this->page < 1)
{
$this->page = 1;
}
$this->offset = $this->limit * ($this->page - 1);
}
/**
* 设置总记录数
* @param $total
*/
public function set_total($total)
{
$this->total = intval($total);
if(!$this->total || $this->total < 1)
{
$this->total = 0;
}
$this->pagenum = ceil($this->total / $this->limit);
}
/**
* 获取分页代码
* @param $url
* @return string
*/
public function get_html($url, $style='')
{
$source = '';
if($this->page > $this->pagenum)
{
$this->page = $this->pagenum;
}
if(!empty($style))
{
$this->style = $style;
}
if($this->pagenum > 1)
{
$source = "<div class='".$this->style."'><a href="{$url}&page=1" mce_href="{$url}&page=1" class='nextprev'>首页 </a>";
$next = $this->page + 1;
$pre = $this->page - 1;
if($this->page > 1)
{
$source .= "<a href="{$url}&page={$pre}" mce_href="{$url}&page={$pre}">上一页</a>";
}
$flag = 0;
for($i = $this->page - 5; $i <= $this->page - 1; $i++)
{
if($i > 0)
{
$source .= "<a href="{$url}&page=$i" mce_href="{$url}&page=$i" class='nextprev'> $i </a>";
}
}
$source .= "<span class='current'>".$this->page."</span>";
if($this->page < $this->pagenum)
{
for($i = $this->page + 1; $i <= $this->pagenum; $i++)
{
$source .= "<a href="{$url}&page=$i" mce_href="{$url}&page=$i"> $i </a>";
$flag++;
if($flag == 5)
{
break;
}
}
}
if($this->page < $this->pagenum)
{
$source .= "<a href="{$url}&page={$next}" mce_href="{$url}&page={$next}">下一页</a>";
}
$source .= "<a href="/" mce_href="/""{$url}&page=".$this->pagenum."/">尾页</a></div>";
}
return $source;
}
}
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: