分类:
2008-05-30 09:01:26
以下为引用的内容: SELECT col1,col2 FROM table_name WHERE col1=:1I |
以下为引用的内容: class DBQuery { /** *保存一个实现了DB接口对象的引用。 */ protected $db; /** *如果是一个存储过程,设为true。 */ protected $stored_procedure = false; /** *保存一个删除了所有字符串的query。 */ private $query; /** *用于在SQL中匹配引号。 */ private static $QUOTE_MATCH = "/(".*(?db = $db; } public function prepare($query) { $this->stored_procedure = true; } public function compile($args) {} public function execute($query) {} } |
以下为引用的内容: /** * 把query准备为一个存储过程。 * @param string $query Prepared query text * @return void */ public function prepare($query) { $this->stored_procedure = true; $this->quote_store = array(); //清除引号 $this->query = preg_replace(self::$QUOTE_MATCH, '$this->sql_quote_replace("1"?"1":'2')', $query); } private function sql_quote_replace($match) { $number = count($this->query_strings); $this->query_strings[] = $match; return "$||$$number"; } |
以下为引用的内容: /** * 返回编译的query,但并不执行它。 * @param mixed $args,... Query Parameters * @return string Compiled Query */ public function compile($params) { if (! $this->stored_procedure) { throw new Exception("存储过程未被初始化!"); } /* 替代参数 */ $params = func_get_args(); // 取得函数参数 $query = preg_replace("/(?query); return $this->add_strings($query); //把字符串放回query中 } /** * 重新插入被prepare()函数移除的字符串。 */ private function add_strings($string) { $numbers = array_keys($this->query_strings); $count = count($numbers); $searches = array(); for($x = 0; $x < $count; $x++) { $searches[$x] = "$||${$numbers[$x]}"; } return str_replace($searches, $this->query_strings, $string); } /** * 每次执行,存储过程中都有一个占位符被替换。 */ protected function compile_callback($params, $index, $type) { --$index; /* 抛出一个异常 */ if (! isset($params[$index])) { throw new Exception("存储过程未收到所需的参数数目!"); } /* 可以在此添加别的类型,如日期和时间。 */ switch ($type) { case 'S': return '"' . $this->db->escape_string($params[$index]) . '"'; break; case 'I': return (int) $params[$index]; break; case 'N': return (float) $params[$index]; default: throw new Exception("存储过程中指定的数据类型 '$type' 无法识别。"); } } |
函数execute
最后,还需要构建函数execute(),函数execute()编译query并且使用DB对象执行它,而DB对象在此是用于初始化DBQuery对象的。请注意在例4中,是怎样运用函数call_user_func_array()来得到编译后的query的,而这样做的原因是,函数execute()要直到运行时,才能确定传递给它的参数数目。
例4:execute()函数
以下为引用的内容: /** * * 执行当前query,并把占位符替换为所提供的参数。 * * @param mixed $queryParams,... Query parameter * @return resource A reference to the resource representing the executed query. */ public function execute($queryParams = '') { //例如:SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N $args = func_get_args(); if ($this->stored_procedure) { /* 调用函数compile以取得query */ $query = call_user_func_array(array($this, 'compile'), $args); } else { /* 如果存储过程未被初始化,就把它作为标准query执行。*/ $query = $queryParams; } $this->result = $this->db->query($query); return $this->result; } |
以下为引用的内容: require 'mysql_db.php5'; require_once 'query2.php5'; $db = new MySqlDb; $db->connect('host', 'username', 'pass'); $db->query('use content_management_system'); $query = new DBQuery($db); $query->prepare('SELECT fname,sname FROM users WHERE username=:1S AND pword=:2S AND expire_time<:3I'); if ($result = $query->execute("visualad", "apron", time())) { if ($db->num_rows($result) == 1) { echo('凭证正确。'); } else { echo('凭证不正确,会话已过期。'); } } else { echo('执行query时发生错误:' . $db->error()); } |