问号占位符

时间:2011-12-11 13:33:50

标签: php replace sqlbuilder

如何更换所有'?'变量?类似的东西:

   $name = 'test' ;
   $lname = 'lastTest';
   $id = 1 ;
   ->where ( 'customers.name = ? and customers.lastname = ? and customers.id = ?' , $name , $lname , $id ) ;

输出:

customers.name = 'test' and customers.lastname = 'lastTest' and customers.id = 1

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

我真的认为你应该使用像PDO这样的库,但是这里仍然是一个解决方案:

public function where($query)
{
    $args = func_get_args();
    array_shift($args);

    $query = preg_replace_callback('/\?/', function($match) use(&$args)
    {
        return array_shift($args); // wrap in quotes and sanitize
    }, $query);

    return $query;
}

答案 1 :(得分:1)

好吧,对于这样的原始替换,您可以使用标准的printf语法。

$name = "'test'";
$lname = "'lastTest'";
$id = 1;
$sql = sprintf('customers.name = %s and customers.lastname = %s and customers.id = %d' , 
                $name , $lname , $id ) ;

请注意,当您必须在查询中添加文字占位符时,printf语法支持占位符转义,以用于这种罕见但可能的情况。

但是,对于实际使用情况,我实现了类型占位符,允许您添加不同类型的数据 - 标识符,数组等

答案 2 :(得分:0)

// ModifiedQuery变量存储您的预期格式。

$query  = "customers.name = ? and customers.lastname = ? and customers.id = ?";
$params = array("?", "?", "?");
$actualParams   = array($name, $lname, $id);

$modifiedQuery = str_replace($params, $actualParams, $query);

答案 3 :(得分:0)

我不认为PDO是诚实的,但准备好的声明已经为你做了mysqli,这是一个选择吗?