4

我需要做这个查询:

SELECT * FROM property_select(ARRAY[8,9,10,11,12,13,14,15,16,17,19,20,26,28])  

使用 PHP 函数pg_query_params($prepared, $params)

准备好的查询是:

SELECT * FROM property_select($1);

参数是:["ARRAY[8,9,10,11,12,13,14,15,16,17,19,20,26,28]"] 如何将参数传递给pg_query_params()数组?

无法使用'{8,9,10,11,12,13,14,15,16,17,19,20,26,28}'postgres 数组(因为它可能包含字符串,并且此数组中的字符串可能包含 , 和 ")。

4

2 回答 2

5

在手册中找到 PostgreSQL数组输入和输出语法的详细要求。

基本上,您需要用双引号将带有特殊字符的数组元素括起来""。您可以双引号所有元素,但您不必这样做。而且,我引用了手册(见上文):

要将双引号或反斜杠放在带引号的数组元素值中,请使用转义字符串语法并在其前面加上反斜杠。

用户在手册中有一段 PHP代码:

  //$t is array to be escaped. $u will be string literal.
  $tv=array();
  foreach($t as $key=>$val){
    $tv[$key]="\"" .
      str_replace("\"",'\\"', str_replace('\\','\\\\',$val)) . "\"
";
  }
  $u= implode(",",$tv) ;
  $u="'{" . pg_escape_string($u) . "}'";

在 SO 上也有一个相关的答案:

还要考虑 的设置standard_conforming_strings。反斜杠可能需要加倍,但 PHP 的 pg-modules 应该会自动为您完成。

于 2012-05-06T18:00:01.580 回答
0

这是一种棘手但有效且安全的方法。

$link: postgresql 连接资源

$sql:一个查询,例如:SELECT * FROM user WHERE id = ANY(@ids)

$params:关联数组:$params = array("ids" => array(1,2,3,6));

function pg_query_params_assoc($link, $sql, $params)
{   
    $index = 0;
    $assoc = [];
    $hash = [];
    foreach($params as $k => $v)
    {
        if(array_key_exists($k, $hash)) continue;
        if(false === strpos($sql, "@".$k)) continue;
        $hash[$k] = true;

        if(is_array($v))
        {
            $keys = [];
            foreach($v as $item)
            {
                $keys[] = $key = '$'.(++$index);
                $assoc[$key] = $item;
            }           
            $sql = str_replace("@".$k, "array[".implode(',', $keys)."]", $sql);
        }
        else
        {
            $assoc[$key = '$'.(++$index)] = $v;
            $sql = str_replace("@".$k, $key, $sql);         
        }       
    }

    $res = pg_query_params($link, $sql, $assoc);
    return $res;
}
于 2019-08-23T13:23:17.673 回答