简单地使用PDO

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>';


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值