*
保
存
一
个
实
现
了
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)
{}
}
函
数
prepare
为使用例 1 中的模板,你要做的第一件事是构建好 prepare()函数,为确保无带引
号的字符被偶然解析为占位符,函数应该移除 query 内所有字符串,并把它们临时存储
在一个数组内。而字符串本身也会被占位符取代,其通常被识别为不应该在 SQL 语句中
出现的的字符串序列。在 query 的编译期间,过程占位符会首先被替换,接着把字符串
放回 query 中,这是通过 preg_replace()函数,和另一个用作 preg_replace()函数的
helper
回
调
函
数
完
成
的
。
例
2
:
prepare()
函
数
/**
*
把
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);