class SinglePDO extends PDO
{
private static $_instance;
private $sql = '';
private $lastSql = '';
private $options = array();
function __construct($dsn, $username, $passwd){
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8';");
parent::__construct($dsn, $username, $passwd,$options);
}
/**
* @return SinglePDO
*/
public static function getInstance()
{
if(!(self::$_instance instanceof PDO)){
$dsn = 'mysql:dbname=resource_manage;host=localhost';
$username = 'root';
$passwd = '123456';
self::$_instance = new self($dsn, $username, $passwd);
}
return self::$_instance;
}
/**
* 执行一条sql语句。如 select * from user where id=?
* 如果该语句出错 ,则返回false;
* 如果是查询语句,则返回一个数组;
* 如果是增删改,则返回影响行数
* @param String $prepareSql
* @param array $parm
* @return boolean|number|multitype:
*/
public function doSql($prepareSql,$parm = array())
{
$pdo = self::getInstance();
$pdo->options['parm'] = $parm;
$pdo->sql = $prepareSql;
$pdo->cleanOption();
$sth = $pdo->prepare($prepareSql);
if($sth->execute($parm) === false)
return false;
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
if(empty($rows)){
return $sth->rowCount();
}
else {
return $rows;
}
}
/**
* 指定表名,多个表用逗号隔开,不用`号
* @param String $tbName
* @return SinglePDO
*/
public function table($tbName){
$tbArr = explode(',', $tbName);
$this->options['table'] = ' `'.join('`,`',$tbArr).'` ';
return $this;
}
/**
* 指定字段,多个字段用逗号隔开,不用`号
* @param String $field
* @return SinglePDO
*/
public function field($field){
$fieldArr = explode(',', $field);
$this->options['field'] = '`'.join('`,`',$fieldArr).'`';
return $this;
}
/**
* 指定条件。参数暂只支持字符串。
* @param String $where
* @return SinglePDO
*/
public function where($where,$parm = array()){
$this->options['where'] = ' WHERE '.$where.' ';
$this->options['parm'] = $parm;
return $this;
}
/**
* 单条数据查询
* @return 结果集或者空数组
*/
public function find(){
$this->options['curd'] = 'find';
$this->options['limit'] = ' LIMIT 1 ';
$this->_buildSql();
return $this->doSql($this->sql,$this->options['parm']);
}
/**
* 数据查询
* @return 结果集或者空数组
*/
public function select(){
$this->options['curd'] = 'select';
$this->_buildSql();
return $this->doSql($this->sql,$this->options['parm']);
}
/**
* 更新数据<br>
* 注意:一定要加上where条件。若要所有数据都update,则条件where(1)
* @param Array $data
* @return 影响行数或者false
*/
public function save($data){
$this->options['curd'] = 'save';
$this->options['data'] = $data;
$this->_buildSql();
return $this->doSql($this->sql,$this->options['parm']);
}
/**
* 插入单条数据
* @param Array $data
* @return 影响行数1或者false
*/
public function add($data){
$this->options['curd'] = 'add';
$this->options['data'] = $data;
$this->_buildSql();
return $this->doSql($this->sql,$this->options['parm']);
}
/**
* 插入多条数据
* @param Array $datas
* @return 影响行数或者false
*/
public function addAll($datas){
$this->options['curd'] = 'addAll';
$this->options['data'] = $datas;
$this->_buildSql();
return $this->doSql($this->sql,$this->options['parm']);
}
/**
* 删除数据
* 注意:一定要加上where条件。若要所有数据都update,则条件where(1)
* @return 影响行数或者false
*/
public function delete(){
$this->options['curd'] = 'delete';
$this->_buildSql();
return $this->doSql($this->sql,$this->options['parm']);
}
public function order($order){
$this->options['order'] = ' ORDER BY '.$order.' ';
return $this;
}
public function group($group){
$this->options['group'] = ' GROUP BY '.$group.' ';
return $this;
}
public function limit($limit){
$this->options['limit'] = ' LIMIT '.$limit.' ';
return $this;
}
/**
* 左连接表
*/
public function join($join){
$this->options['join'][] = ' LEFT JOIN '.$join.' ';
return $this;
}
/**
* 最后执行的sql
* @return string
*/
private function setLastSql()
{
$this->lastSql = '【'.$this->sql.'】';
$this->lastSql .= '【'.join(',', $this->options['parm']).'】';
}
public function getLastSql()
{
return $this->lastSql;
}
/**
* 返回模型的错误信息
* @return string
*/
public function getError()
{
$info = 'mysql error number is : '.$this->errorCode();
$info .= '<br>'.$this->errorInfo();
return $info;
}
//拼装sql语句
protected function _buildSql()
{
$table = $this->options['table'];
$field = $this->options['field']?$this->options['field']:'*';
$where = $this->options['where'];
switch ($this->options['curd'])
{
case 'find': //find()方法查询数据
case 'select': //select()方法查询数据
{
$join = $this->options['join']?join(' ',$this->options['join']):'';
$order = $this->options['order'];
$group = $this->options['group'];
$limit = $this->options['limit'];
$sql = 'SELECT '.$field.' FROM '.$table.$join.$where.$group.$order.$limit;
break;
}
case 'delete': //delete()方法删除数据
{
if($where)
$sql = 'DELETE FROM '.$table.$where;
else
throw new Exception('删除数据需要有where条件');
break;
}
case 'save': //save()方法更新数据
{
$data = $this->options['data'];
if($data && $where){
foreach($data as $key => $value){
$subsql[] = "`$key`='$value'";
}
$set = join(',',$subsql);
$sql = 'UPDATE '.$table.' SET '.$set.$where;
}
else
throw new Exception('更新数据需要有更新数据和where条件');
break;
}
case 'add': //add()方法插入单条数据
{
$data = $this->options['data'];
if($data){
$fieldArr = array();
$valueArr = array();
foreach($data as $key => $value){
$fieldArr[] = "`$key`";
$valueArr[] = "'$value'";
}
$field = '('.join(',',$fieldArr).')';
$val = '('.join(',',$valueArr).')';
$sql = 'INSERT INTO '.$table.$field.' VALUES '.$val;
}
break;
}
case 'addAll': //addAll()方法批量插入数据
{
$datas = $this->options['data'];
if($datas){
$num = 1;
foreach ($datas as $data){
$fieldArr = array();
$valueArr = array();
foreach($data as $key => $value){
$fieldArr[] = "`$key`";
$valueArr[] = "'$value'";
}
if($num == 1){
$field = '('.join(',',$fieldArr).')';
$num++;
}
$valueArr2[] = '('.join(',',$valueArr).')';
}
$val = join(',',$valueArr2);
$sql = 'INSERT INTO '.$table.$field.' VALUES '.$val;
}
break;
}
default:break;
}
$this->sql = $sql;
}
public function __clone(){
trigger_error('Clone is not allow!',E_USER_ERROR);
}
/**
* 清除操作
*/
private function cleanOption()
{
$this->setLastSql();
$this->sql = '';
$this->options = array();
}
}
这是自己写的,肯定没那些开源组织的人写的好
但毕竟是自己写的,我喜欢,哈。
下面是使用的例子:
$p = SinglePDO::getInstance();
//QUERY
$sql = "select * from user where user_id=?";
$rows = $p->doSql($sql,array(2));
echo '<pre>';
echo $p->getLastSql().'<br>';
var_dump($rows);
echo '</pre>';
//FIND
$rows = $p->table('user')->field('user_name')
->where('role_id=:role_id',array(':role_id'=>3))->find();
echo '<pre>';
echo $p->getLastSql().'<br>';
var_dump($rows);
echo '</pre>';
//UPDATE
$data = array('user_name'=>'ljbxx测测');
$rows = $p->table('user')->where('role_id>:role_id',array(':role_id'=>2))->save($data);
echo '<pre>';
echo $p->getLastSql().'<br>';
var_dump($rows);
echo '</pre>';
//DELETE
$rows = $p->table('user')->where('user_score=:user_score',array(':user_score'=>33))->delete();
echo '<pre>';
echo $p->getLastSql().'<br>';
var_dump($rows);
echo '</pre>';
//ADD
$data = array('user_name'=>'ljbxx测测','user_score'=>33);
$rows = $p->table('user')->where('user_score=:user_score',array(':user_score'=>33))->add($data);
echo '<pre>';
echo $p->getLastSql().'<br>';
var_dump($rows);
echo '</pre>';
//SELECT
$rows = $p->table('user')
->where('user_id>?',array(2))->select();
echo '<pre>';
echo $p->getLastSql().'<br>';
var_dump($rows);
echo '</pre>';