Php PostgreSQL:将数组[]传递给pg_query_参数

Php PostgreSQL:将数组[]传递给pg_query_参数,php,arrays,postgresql,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); 参数是:[“数组[8,9,10,11,12,13,14,15,16,17,19,20,26,28]”] 如何将参数作为数组传递给pg\u que

我需要执行以下查询:

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);
参数是:
[“数组[8,9,10,11,12,13,14,15,16,17,19,20,26,28]”]
如何将参数作为数组传递给
pg\u query\u params()


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

请在手册中查找PostgreSQL的详细要求

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

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

有一个:

还有一个:


还考虑反斜杠的设置可能需要加倍,但是PHP的PG模块应该自动为您这样做。

< P>这是一个棘手但有效和安全的方法。

$link:postgresql连接资源

$sql:查询,例如:从用户中选择*,其中id=ANY(@ids)

$params:一个关联数组:$params=array(“ids”=>array(1,2,3,6))


可能会在这里派上用场。如果您必须手动使用数组构造函数语法,您不是更好吗?至少需要担心的引用级别更少。@muistooshort:数组构造函数是在服务器端执行的功能。因为上面是用于预备语句的,所以传递的参数需要是值,因此数组是lite拉尔,现在没有测试,几乎记不起这个老答案,但我想,这就是原因。
  //$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) . "}'";
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;
}