PostgreSQL:将ARRAY []传递给pg_query_params

时间:2012-05-06 14:56:38

标签: php arrays postgresql

我需要执行此查询:

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数组(因为它可能包含此数组中可能包含的字符串和字符串,以及")。

2 个答案:

答案 0 :(得分:5)

在手册中找到PostgreSQL Array Input and Output Syntax的详细要求。

基本上,您需要在双引号""中包含带有特殊字符的数组元素。您可以对所有元素进行双引号,但您不必这样做。并且,我引用手册(见上文):

  

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

有一个piece of PHP code posted by a user in the manual

  //$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) . "}'";

还有related answer here on SO

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

答案 1 :(得分: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;
}