2014-10-17 153 views
1

我试图实现一个非常简单的PDO bindValue()函数。 (只作教育用途)PHP - 替换完全匹配preg_replace

因此,首先在 “前端” 的代码,我有一个SQL查询是这样的:

INSERT INTO logs VALUES (:referer, :id_cookie, :id_cookie_com); 

而且我的代码看起来像这样:

$stmt->bindValue(':referer', 'test'); 
$stmt->bindValue(':id_cookie', 'test2'); 
$stmt->bindValue(':id_cookie_com', 'test3'); 

我正在分解我的查询,并获取以数组中以“:”开头的所有参数,这很好。

Array 
(
    [0] => :referer 
    [1] => :id_cookie 
    [2] => :id_cookie_com 
) 

但是,当我尝试替换查询中的参数,我面临一个小问题。

如果我这样做:

public function bindParam($parameter, $variable, $type = null) 
    { 
     $this->sql = preg_replace('/'.$parameter.'/', $variable, $this->sql); 
    } 

我得到这个结果:

INSERT INTO logs VALUES (test, test2, test3_com) 

我不能设法去除_com在查询结束。我知道为什么它在这里,这是因为我的preg_replace,匹配我的数组中的id_cookie,而且我必须以id_cookie开头的变量。

我该如何设法使preg_replace()替换整个单词?

+0

无法复制:https://eval.in/207173 – 2014-10-17 13:32:36

+0

在你的榜样,我想你复制它: 'INSERT INTO日志VALUES(:引用者,TEST2,test2_com );' – Kikndanutz 2014-10-17 13:54:38

+0

哈哈哈,谢谢@Kikndanutz!完全错过了 – 2014-10-17 13:58:59

回答

2

使用单词边界:

$this->sql = preg_replace("/$parameter\b/", $variable, $this->sql); 
//        here __^^ 
+0

我试过像这样: '$ this-> sql = preg_replace(“/ \ b $ parameter \ b /”,$ variable,$ this-> sql);' 或者像这样: '$ this - > sql = preg_replace('/ b'。$ parameter。'\ b /“,$ variable,$ this-> sql);' 但是它取代了什么...... :( – Kikndanutz 2014-10-17 13:37:36

+0

只要保持最后的边界看到我的编辑。 – Toto 2014-10-17 14:12:14

+0

Yay!工作很好,谢谢! – Kikndanutz 2014-10-17 14:30:03