Abstract.class.php 3.72 KB
<?php
/**
 * PDO 抽象类
 *
 * @name Util_Dao_Db_Abstract
 * @version version (2009-3-16 下午01:27:05)
 * @package util/dao/db
 * @since 1.0
 */
// require_once 'util/Dao/Exception.php';
abstract class Util_Dao_Db_Abstract 
{
	/**
	 * 预处理对象
	 *
	 * @var Zend_Db::factory
	 */
	protected $stmt;

	/**
	 * pdo值类型
	 *
	 * @var Array
	 */
	private $pdo_type = array (
		'integer' => PDO::PARAM_INT,
		'int' => PDO::PARAM_INT,
		'boolean' => PDO::PARAM_BOOL,
		'bool' => PDO::PARAM_BOOL,
		'string' => PDO::PARAM_STR,
		'null' => PDO::PARAM_NULL,
		'object' => PDO::PARAM_LOB,
        'float' => PDO::PARAM_STR ,
        'double' => PDO::PARAM_STR
	);
	
	/**
	 * 命令正则
	 *
	 * @var Array
	 */
    private $regular = array(
    	'select'=>'/(?=select|call)/i',
    	'insert'=>'/(?=insert|into|call)/i',
    	'delete'=>'/(?=delete|call)/i',
    	'update'=>'/(?=update|call)/i',
    	'command'=>'/(?=select|insert|delete|update|call)/i',
        'where'=>'/where/i'
    );

	/**
	 * 验证sql合法性
	 *
	 * @param String $str
	 * @param String $com
	 * @return bool
	 */
	protected function check($str, $com) 
	{
		$regularStr = $this->regular[$com];
		$match = preg_match($regularStr, $str);
		// 是否执行命令, 检查命令语句是否有非法关键字
		if ($com === 'command')
		{
			if ($match > 0)
			{
				throw new Util_Dao_Exception(' Command  Can\'t contain select|insert|delete|update ');
			}
		}
		// 检查语句是否包含操作关键字
		elseif ($match < 1)
		{
			throw new Util_Dao_Exception($str . ' not\'s ' . $com .' statement');
		}
		// 如果是更新或删除操作, 则检查是否有where条件语句
		elseif ($com === 'update' || $com === 'delete') 
        {
            $regularStr = $this->regular['where'];
            $match = preg_match($regularStr, $str);
            if ($match < 1) 
            {
                throw new Util_Dao_Exception($com . ' Sql  not\'s contain \'where\' ');
            }
        }
	}

	/**
	 * 绑定值
	 */
	protected function bindValue($param, $value, $type) 
	{
		$this->stmt->bindValue($param, $value, $this->pdo_type[strtolower($type)]);
	}

	/**
	 * 绑定值集
	 *
	 * @param array $values
	 */
	protected function bindValues(array $values) 
	{
		foreach ($values as $key => $val) 
		{
			if (is_array($val) || is_object($val)) 
			{
				throw new Util_Dao_Exception('bindParams: Parameter values are array & objects should not');
			}
			if (is_int ($key)) # 从1开始
			{ 
				++ $key;
			}
			$this->bindValue($key, $val, gettype($val));
		}
	}

	/**
	 * 绑定参数
	 */
	protected function bindParam($param, $value, $type) 
	{
		$this->stmt->bindParam($param, $value, $this->pdo_type[strtolower($type)]);
	}

	/**
	 * 绑定参数集
	 */
	protected function bindParams(array $params) 
	{
		foreach ($params as $key => $val) 
		{
			if (is_array($val) || is_object($val)) 
			{
				throw new Util_Dao_Exception('bindParams: Parameter values are array & objects should not');
			}
			if (is_int($key)) # 从1开始
			{
				++ $key;
			}
			$this->bindParam($key, $val, gettype($val));
		}
	}
	
	/**
	 * 绑定参数
	 */
	protected function bindColumn() {}
	
	/**
	 * 关闭数据库连接
	 */
	public abstract function close();

	/**
	 * 取回结果集中所有字段的值,作为连续数组返回
	 *
	 */
	public abstract function fetchAll();

	/**
	 * 取回结果集中所有字段的值,作为关联数组返回  第一个字段作为码
	 *
	 */
	public abstract function fetchAssoc();

	/**
	 * 取回所有结果行的第一个字段名
	 *
	 */
	public abstract function fetchCol();

	/**
	 * 只取回第一个字段值
	 *
	 */
	public abstract function fetchOne();

	/**
	 * 取回一个相关数组,第一个字段值为码
	 *
	 */
	public abstract function fetchPairs();
	
}