在PHP中实现一个简单的预处理查询
我正在尝试创建一个非常简单的数据库抽象,其中一部分使用准备好的查询 现在,我有一个函数获取一个查询字符串和一个值数组,如下所示:在PHP中实现一个简单的预处理查询,php,mysql,callback,prepared-statement,Php,Mysql,Callback,Prepared Statement,我正在尝试创建一个非常简单的数据库抽象,其中一部分使用准备好的查询 现在,我有一个函数获取一个查询字符串和一个值数组,如下所示: $query = "SELECT `first_name`, `last_name` FROM ::table_name WHERE `id` = :id" $values = array( 'table_name' = $this->table_name, 'id' = $user_id, ); SELECT `first_name`, `l
$query = "SELECT `first_name`, `last_name` FROM ::table_name WHERE `id` = :id"
$values = array(
'table_name' = $this->table_name,
'id' = $user_id,
);
SELECT `first_name`, `last_name` FROM `sometablename` WHERE `id` = '1234'
这将创建如下查询:
$query = "SELECT `first_name`, `last_name` FROM ::table_name WHERE `id` = :id"
$values = array(
'table_name' = $this->table_name,
'id' = $user_id,
);
SELECT `first_name`, `last_name` FROM `sometablename` WHERE `id` = '1234'
我的问题是:我使用
preg\u replace\u callback
从查询字符串中获取::标识符和:标识符,然后将其发送到一个清理函数。问题是,我还需要发送values数组,以便函数可以从regexp中获取匹配项,使用该键获取values数组中的项,转义该值,将其用右引号括起来,然后返回它
但我无法向回调传递任何额外信息。我可以使用一个私有的静态变量,但这是非常粗糙的
另一种方法是什么?不适合您的需要?您也可以查看pdo、zend_db和mdb2。好的是,它们有命名的参数和驱动程序,可以在许多存储引擎上正确地创建准备好的语句(或模拟准备好的语句)
例如,zend_db将执行一些基本的sql解析来处理边缘情况,例如,当查询中嵌入的正则表达式是带有冒号的字符类时…手册中各种注释建议的替代方法之一是使用带有“e”修饰符的
preg_replace()
,作为regexp的一部分:
preg_replace("/pattern/e","strtoupper('\\1')",$subject);
本质上,您是在指定要计算的代码。我认为有一个很好的例子,您可以创建函数,然后使用一个小字符串对其求值,从而可以传递额外的参数:
preg_replace('/pattern/e',"your_function(\$array,\$foo,\$bar,\$etc)",$str);
是的,我没有选择使用一个库,因为我想自己解决这个问题,考虑到这个项目的细微之处(它真的很小),我不这么认为,如果不清除我已经拥有的一切,这是完美的!我希望我在用一个大班来处理它之前读过这篇文章。。。我想我会把它改成这个更简单的版本。非常感谢。或者你可以用。我不喜欢把代码放在字符串中。@马克-卡森特别指出,
preg\u replace\u callback()
对他不起作用,因为你不能向回调函数传递额外的参数。使用带有“e”选项的preg\u replace()
是解决方法。还要注意的是,preg\u replace\u callback()
使用经过计算的代码,因此这只是情况的本质。