PdoQuery.class.php 5.6 KB
<?php
/**
 * 数据库操作方法
 *
 * example:
 * <pre>
 *
 * </pre>
 *
 * @name Util_Dao_Db_PdoQuery
 * @version 40 (2009-3-4 上午10:42:16)
 * @package Q.Dao.Mysql.Db
 * @author peter.zyliu liuziyang@zadooo.com
 * @since 1.0
 */
class Util_Dao_Db_PdoQuery extends Util_Dao_Db_Abstract
{
	
	/**
	 * Sql语句
	 *
	 * @var String
	 */
	private $sql;
	
	/**
	 * Pdo对象
	 *
	 * @var Zend_Db::factory
	 */
	private $pdo;
	
	/**
	 * 参数
	 *
	 * @var Array
	 */
	private $params;
	
	/**
	 * 初始化
	 *
	 * @param Zend_Db::factory $pdo
	 * @param String $sql
	 * @param Array $params
	 */
	public function __construct($pdo, $sql, $params)
	{
		$this->pdo = $pdo;
		$this->sql = trim($sql);
		$this->params = $params;
	}
	
	/**
	 * 请求执行
	 *
	 */
	public function execute($method = null)
	{
		$this->stmt = $this->pdo->prepare($this->sql);
		$this->bindParams($this->params);
		$exec = $this->stmt->execute();
		if (!empty($method))
		{
			return $exec;
		}
		return $this->stmt;
	}
	
	/**
	 * 取回结果集中所有字段的值,作为连续数组返回
	 *
	 * @return array
	 */
	public function fetchAll()
	{
		$this->check($this->sql, 'select');
		return $this->execute()->fetchAll();
	}
	
	/**
	 * 取回结果集中所有字段的值,作为关联数组返回
	 * 第一个字段作为码
	 *
	 * @return array
	 */
	public function fetchAssoc()
	{
		$this->check($this->sql, 'select');
		$data = array();
		$original = $this->execute()->fetchAll(PDO::FETCH_ASSOC);
		foreach ($original as $val)
		{
			$tmp = array_values($val);
			$data[$tmp[0]] = $val;
		}
		return $data;
	}
	
	/**
	 * 取回所有结果行的第一个字段名
	 *
	 *
	 * @return array
	 */
	public function fetchCol()
	{
		$this->check($this->sql, 'select');
		return $this->execute()->fetchAll(PDO::FETCH_COLUMN, 0);
	}
	/**
	 * 只取回第一个字段值
	 *
	 * @param Integer $columnNumber
	 * @return mixed
	 */
	public function fetchOne($columnNumber = 0)
	{
		$this->check($this->sql, 'select');
		return $this->execute()->fetchColumn($columnNumber);
	}
	/**
	 * 取回一个相关数组,第一个字段值为码
	 *
	 *
	 * @return array
	 */
	public function fetchPairs()
	{
		$this->check($this->sql, 'select');
		if (version_compare(PHP_VERSION, '5.2.6', '==') === true)
		{
			return $this->_fetchPairs();
		}
		return $this->execute()->fetchAll(PDO::FETCH_KEY_PAIR);
	}
	
	/**
	 * 只取回结果集的第一行
	 *
	 *
	 * @return array
	 */
	public function fetchRow()
	{
		$this->check($this->sql, 'select');
		return $this->execute()->fetch();
	}
	/**
	 * 返回第一行  数据使用对象表示
	 *
	 * @return array
	 */
	public function fetchObject()
	{
		$this->check($this->sql, 'select');
		return $this->execute()->fetchObject();
	}
	
	/**
	 * 取出所有数据并放入数组中,其中每条数据使用对象表示
	 *
	 * @return array
	 */
	public function fetchAllObject()
	{
		$this->check($this->sql, 'select');
		return $this->execute()->fetchAll(PDO::FETCH_OBJ);
	}
	
	/**
	 * Enter description here...
	 *
	 * @return unknown
	 */
	public function quoteInto()
	{
		return $this->pdo->quote($this->sql, $this->params);
	}
	
	/**
	 * 插入
	 *
	 * @return Util_Dao_Db_FinaleExec()
	 */
	public function insert()
	{
		$this->check($this->sql, __FUNCTION__);
		$retval = $this->execute(__FUNCTION__);
		return new Util_Dao_Db_FinaleExec($this->pdo, $this->stmt, $retval);
	}
	
	/**
	 * 更新
	 *
	 * @return Util_Dao_Db_FinaleExec()
	 */
	public function update()
	{
		$this->check($this->sql, __FUNCTION__);
		$retval = $this->execute(__FUNCTION__);
		return new Util_Dao_Db_FinaleExec($this->pdo, $this->stmt, $retval);
	}
	
	/**
	 * 删除
	 *
	 * @return Util_Dao_Db_FinaleExec()
	 */
	public function delete()
	{
		$this->check($this->sql, __FUNCTION__);
		$retval = $this->execute(__FUNCTION__);
		return new Util_Dao_Db_FinaleExec($this->pdo, $this->stmt, $retval);
	}
	/**
	 * 获取Sql
	 *
	 * @return String
	 */
	public function getSql()
	{
		$asSql = '';
		if (strstr($this->sql, ':'))
		{
			$matches_s = array();
			foreach ($this->params as $key => $val)
			{
				if (is_string($val))
				{
					$val = "'{$val}'";
				}
				$matches_s[':' . $key] = $val;
			}
			$asSql = strtr($this->sql, $matches_s);
		}
		else
		{
			$asSql = $this->sql;
			foreach ($this->params as $val)
			{
				$strPos = strpos($asSql, '?');
				if (is_string($val))
				{
					$val = "'{$val}'";
				}
				$asSql = substr_replace($asSql, $val, $strPos, 1);
			}
		}
		return $asSql;
	}
	
	/**
	 * 执行mysql系统命令
	 *
	 */
	public function command()
	{
		$this->check($this->sql, __FUNCTION__);
		$this->pdo->query($this->sql);
	}
	
	/**
	 * 关闭数据库
	 *
	 */
	public function close()
	{
		$this->stmt->closeCursor();
	}
	
	/**
	 * 数量列
	 *
	 * @return Integer
	 */
	public function columnCount()
	{
		return $this->execute()->columnCount();
	}
	
	/**
	 * Debug 输出
	 *
	 * @return Array
	 */
	public function debugDumpParams()
	{
		return $this->execute()->debugDumpParams();
	}
	
	/**
	 * 下一个结果集合
	 * 用于存储过程多个结果集
	 *
	 */
	public function nextRowset()
	{
		return $this->stmt->nextRowset();
	}
	
	/**
	 * 重组Pairs
	 *
	 * @return Array
	 */
	private function _fetchPairs()
	{
		$pairsData = array();
		$allData = $this->execute()->fetchAll();
		foreach ($allData as $v)
		{
			if (count($v) < 2)
			{
				throw new Util_Dao_Mysql_Exception('SQLSTATE[HY000]: General error: PDO::FETCH_KEY_PAIR fetch mode requires the result set to contain extactly 2 columns');
			}
			$indexKey = each($v);
			$indexVal = each($v);
			$pairsData[$indexKey['value']] = $indexVal['value'];
		}
		return $pairsData;
	}
	
	public function __destruct()
	{
	
	}
}