PostgreSQL + PHP: «выбрать * на вкладке, где col в (?)» - PullRequest
0 голосов
/ 04 января 2011

следующий короткий тестовый скрипт

<?php

define('DBHOST', '/tmp');
define('DBNAME', 'XXX');
define('DBUSER', 'XXX');
define('DBPASS', 'XXX');

$ids = array('OK251562715876', 'OK178469380239');

try {
        $db = new PDO('pgsql:host=' . DBHOST . '; dbname=' . DBNAME, DBUSER, DBPASS, $options);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $sth = $db->prepare('select * from pref_money where id in ( ? )');
        $sth->execute($ids);
        while ($row = $sth->fetch(PDO::FETCH_ASSOC))
                print_r($row);

} catch (Exception $e) {
        exit('Database problem: ' . $e->getMessage());
}
?>

завершается с ошибкой:

Database problem: SQLSTATE[42P18]: 
Indeterminate datatype: 7 
ERROR:  could not determine data type of parameter $2

Если я удаляю 2-й элемент массива, он работает нормально.

Есть ли способ заставить привязку работать для массива с несколькими элементами?

Я знаю, что могу подготовить полную строку оператора SQL, используя join () и т. Д., Опуская знак вопроса, но затемМне нужны дополнительные усилия, чтобы предотвратить внедрение SQL в мой веб-скрипт ...

Использование PostgreSQL 8.4.6 с PHP 5.1.6 под CentOS 5.5

Ответы [ 3 ]

2 голосов
/ 04 января 2011

PDOStatement::execute() ожидает один аргумент, который является массивом параметров.Каждый элемент этого массива обрабатывается как параметр запроса.Поэтому прямо сейчас PDO «думает», что вы передаете два параметра, в то время как ваш запрос содержит только один.

Решение: передать массив только с одним элементом (параметром), который является массивом: ...->execute(array($ids));

1 голос
/ 04 января 2011

Было бы удобно, если бы связанные параметры работали таким образом, но, увы, нет.Вы должны сделать что-то вроде:

$sth = $db->prepare('select * from pref_money where id in (?, ?)');
$sth->execute($ids[0], $ids[1]);

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

1 голос
/ 04 января 2011

Создайте запрос с нужным количеством вопросительных знаков, чтобы соответствовать длине массива, а затем передайте содержимое массива в качестве значений в execute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...