Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中实现一个简单的预处理查询_Php_Mysql_Callback_Prepared Statement - Fatal编程技术网

在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()
使用经过计算的代码,因此这只是情况的本质。