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;
}