我需要执行此查询:
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数组(因为它可能包含此数组中可能包含的字符串和字符串,以及")。
答案 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) . "}'";
还要考虑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;
}