简体   繁体   中英

How to pass a php array to a postgres query with any condition

i wrote the following code:

<?php
    $listO = $_POST["letter"];

    //print_r($listO);
    //Array ( [0] => A [1] => B [2] => C)

    function to_pg_array($set) {
    settype($set, 'array'); // can be called with a scalar or array
    $result = array();
    foreach ($set as $t) {
        if (is_array($t)) {
            $result[] = to_pg_array($t);
        } else {
            $t = str_replace('"', '\\"', $t); // escape double quote
            if (! is_numeric($t)) // quote only non-numeric values
                $t = '"' . $t . '"';
            $result[] = $t;
        }
    }
    return '{' . implode(",", $result) . '}'; // format

    }

    $pg_array_listO = to_pg_array($listO);

    //print_r($pg_array_list_organisms);
    //{"A","B","C"}

    $conn = pg_connect("host=X dbname=Y user=Z");

    $result = pg_query_params($conn, 'SELECT count(cp.id)
    FROM cp, act, a, t
    WHERE t.tid = a.tid AND
    a.aid = act.aid AND
    act.m = cp.m AND
    t.n = $1 AND
    act.st = $2 AND
    t.o LIKE ANY(ARRAY[$3])', array($t1, $a2, $pg_array_listO));

    while($row = pg_fetch_row($result)) {echo $row[0];}

?>

However i can't figure out how to pass the array $pg_array_listO to the postgres query. The function to_pg_array converts the php array into postgres array but still don't work. How can i do this?

postgres array looks like '{list}' :

t=# select array['a','b','c'];
  array
---------
 {a,b,c}
(1 row)

so you need to get rid of double quotes, otherwise postgres understands literals as identities.

Eg with $pg_array_listO = str_replace('"', '\\\\"',to_pg_array($listO)) or smth smarter - sorry - I'm not good in php

additionally modify ANY(ARRAY[$3]) to ANY('$3'::text[]) , cos array[] or '{}'::text[] would be accepted

update based on

  //print_r($pg_array_list_organisms); //{"A","B","C"} 

I expect this to work:

$result = pg_query_params($conn, "SELECT count(cp.id)
FROM cp, act, a, t
WHERE t.tid = a.tid AND
a.aid = act.aid AND
act.m = cp.m AND
t.n = $1 AND
act.st = $2 AND
t.o LIKE ANY($3)", array($t1, $a2, str_replace('"', '',to_pg_array($listO))));

mind I changed quotes and SQL and str_replace for $3 variable

a working example of this approach:

t=# select 'a' like any('{a,b,c}'::text[]);
 ?column?
----------
 t
(1 row)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM