Sql 准备好的报表的Preg_替换解决方案

Sql 准备好的报表的Preg_替换解决方案,sql,preg-replace,Sql,Preg Replace,我有一个命令类,它抽象了几乎所有特定的数据库函数(我们有一个在Mssql 2005上运行的完全相同的应用程序(使用ODBC和本机Mssql库),MySQL和Oracle。但有时我们的prepare方法会出现一些问题,在执行该方法时,会将所有占位符替换为各自的值。但问题是,我使用的是以下方法: if(is_array($Parameter['Value'])) { $Statement = str_ireplace(':'.$Name, implode(', ', $this->Ad

我有一个命令类,它抽象了几乎所有特定的数据库函数(我们有一个在Mssql 2005上运行的完全相同的应用程序(使用ODBC和本机Mssql库),MySQL和Oracle。但有时我们的prepare方法会出现一些问题,在执行该方法时,会将所有占位符替换为各自的值。但问题是,我使用的是以下方法:

if(is_array($Parameter['Value']))
{
    $Statement = str_ireplace(':'.$Name, implode(', ', $this->Adapter->QuoteValue($Parameter['Value'])), $Statement);
}
else
{
    $Statement = str_ireplace(':'.$Name, $this->Adapter->QuoteValue($Parameter['Value']), $Statement);
}
当我们有两个或多个类似的参数名称时,就会出现问题,例如,session_browser和session_browse_version……第一个参数将部分替换最后一个参数

当然,我们学会了按照特定的顺序指定参数,但现在我有了一些“空闲”时间,我想做得更好,所以我正在考虑切换到preg_replace…而且我对正则表达式不太在行,谁能帮我用正则表达式替换字符串,比如:parameter_name`

致以最良好的祝愿,
Bruno B Magalhaes

您应该使用
\B
来匹配单词边界,这样您就不会意外地在较长的参数名称中匹配较短的参数名称

此外,如果将标量值强制为一个条目的数组,则不需要使用特殊情况的数组:

preg_replace("/:$Name\b/", 
    implode(",", $this->Adapter->QuoteValue( (array) $Parameter['Value'] )), 
    $Statement);
但是,请注意,当标识符或字符串文字包含类似于参数占位符的模式时,这可能导致误报匹配:

SELECT * FROM ":Name";

SELECT * FROM Table WHERE column = ':Name';
当带引号的标识符和字符串文字可以包含转义引号时,这会变得更加复杂

SELECT * FROM Table WHERE column = 'word\':Name';
在prepare期间,您可能需要重新考虑将变量插入SQL字符串,因为这样做会破坏prepared语句在安全性或性能方面的任何好处


我理解你为什么要这么做,因为不是所有的RDBMS后端都支持命名参数,而且SQL参数也不能用于
in()
谓词中的值列表。但是你创建了一个非常泄漏的抽象。

你让我损失了很长时间,但是有点研究和谷歌,你说得通:)