2013-03-27 4 views
-1

Как передать случайное число параметров в запрос? В приведенных ниже блоках кода показано, что было предпринято. На всех ошибках отображается bool (false). Для тестирования для представления идентификаторов используются три целых числа.Переменная переходов Количество параметров для Postgresql

Запрос из пункта 1 был выполнен вручную в pgAdminIII и был успешным. Запрос из пунктов 2 и 4 был эхо и сравнен. Они выглядят близко, как и предполагалось, но параметры не являются обязательными.

SELECT column FROM table WHERE id = ANY('{1,2,3}'::int[]); 
SELECT column FROM table WHERE id = ANY('{?,?,?}'::int[]) 

1) Это работает. Желание является то, что какой-либо пункт будет 1-N номера:

$sql = "SELECT column FROM table WHERE id = ANY('{1,2,3}'::int[])"; 

$sth = $dbh->prepare($sql); 
$sth->execute(); 

$result = $sth->fetch(PDO::FETCH_NUM); 

echo var_dump($result); 

$dbh = null; 

2) это терпит неудачу:

$values = array(1,2,3); 
$placeHolders = implode(',', array_fill(0, count($values), '?')); 

$sql = sprintf("SELECT column FROM table WHERE id = ANY('{%s}'::int[])", $placeHolders); 

$sth = $dbh->prepare($sql); 
$sth->execute($values); 
$result = $sth->fetch(); 

echo var_dump($result); 

$dbh = null; 

3) это терпит неудачу:

$values = array(':qwer' => 1, ':asdf' => 2, ':zxcv' => 3); 

$sql = "SELECT colum FROM table WHERE id = ANY(\'{ :qwer , :asdf , :zxcv }\'::int[])"; //Below error caused if single quote not escaped. 

$sth = $dbh->prepare($sql); 
$sth->execute($values); // Invalid parameter number: :qwer if single quotes not escaped. 
$result = $sth->fetch(); 

echo var_dump($result); 

$dbh = null; 

4) Это терпит неудачу (явно привязывая параметры):

$values = array(1,2,3); 
$placeHolders = implode(',', array_fill(0, count($values), '?')); 

$sql = sprintf("SELECT query FROM nc_reports WHERE id = ANY('{%s}'::int[])", $placeHolders); 

$sth = $dbh->prepare($sql); 

$i = 1; 
foreach($values as $val) 
{ 
    //$sth->bindParam($i, $val, PDO::PARAM_INT); 
    $sth->bindValue($i, $val, PDO::PARAM_INT); 
    $i++; 
} 
$sth->execute(); 
$result = $sth->fetch(); 

echo var_dump($result); 

$dbh = null; 
+1

Это может быть полезно http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an -in-condition – FoolishSeth

+0

Мне любопытно, вы когда-нибудь пытались повторить результат своей программы? Программа, которая создает запрос, я имею в виду. Разве это не отличается от рукописного? если да - в чем разница? –

+0

@FoolishSeth: Спасибо, что подняли головы. Я изменил свой запрос от ANY до IN, и он работает. – Dave

ответ

1

Попробуйте сгенерировать запрос самостоятельно:

$values = array(1,2,3); 
// Generate the query 
$params = substr(str_repeat("?,", sizeof($values)), 0, -1); 

$sql = "SELECT query FROM nc_reports WHERE id IN ($params)"; 

$sth = $dbh->prepare($sql); 

for ($i = 0; $i < sizeof($values); $i++) 
{ 
    $sth->bindValue($i+1, $values[$i], PDO::PARAM_INT); 
} 
$sth->execute(); 
// Iterate over the results 
while (($result = $sth->fetch()) !== FALSE) { 
    echo var_dump($result); 
} 
$dbh = null; 
+0

Благодарим вас за пример. Я попытался использовать предложение IN вчера вечером, прежде чем продемонстрировать свое нижестоящее решение. Предложение ANY возвращает 0 результатов, предложение IN возвращает один результат (первый встреченный). Единственный путь, который я нашел, чтобы получить все результаты, - это мое решение в настоящее время без голосования. Мне нужно будет RTFM на pgAdmin сегодня вечером и выяснить, как получить доступ к журналу, чтобы узнать, какие значения попадают на сервер.Спасибо, что посмотрели на эту проблему. – Dave

+0

@Dave, это потому, что вам нужно перебирать результаты. Я отредактировал свой ответ, чтобы показать, как (цикл). – MatheusOl

+0

Отлично! Большое спасибо. – Dave

-2

@Fo olishSeth: Спасибо, что указал на ответ. Я не мог понять, что ws обсуждается сначала из-за форматирования кода. Я смог заставить его работать, но не используя ЛЮБОЙ (нет результата) или IN (только первый результат).

Выполнение и выборка были перемещены в цикл, и каждый элемент из массива $ values ​​запрашивается отдельно и добавляется в массив $ results.

$values = array(1,2,3); 

$sql = "SELECT column FROM table WHERE id = ?"; 

$sth = $dbh->prepare($sql); 

$result = array(); 

foreach($values as $key => $val) 
{ 
    $sth->bindValue(1, $val, PDO::PARAM_INT); 
    $sth->execute(); 
    $result[$key] = $sth->fetch(PDO::FETCH_NUM); 
} 

echo var_dump($result); 

Вышеприведенные три строки по желанию. У меня не было возможности проверить это на большие $ values ​​[], но для небольшого количества записей это должно сработать.

+0

это, по-видимому, ** не ** решение –

+0

это действительно плохое решение, потому что вы собираетесь отправить много запросов в базу данных, в то время как вы можете отправить только один (как в моем ответе). – MatheusOl

+0

@MatheusOl: ваше решение возвращает только первую обнаруженную запись, а не все записи для идентификаторов в массиве $ values. – Dave

Смежные вопросы