[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PDO+подготовленные выражения
Traveller
Существует запрос вида:
SELECT * FROM `TableA` JOIN `TableB` ON TableA.id=TableB.id WHERE id=:id1 and id=:id2
Который передается в метод занимающийся обработкой и выполнением запроса.
Запрос может быть и другой (Тоесть инсерт, делейт и тп), а так же в нем могут меняться условия по которым делать выборку или что-либо (например тут это :id1,:id2. Но вполне возможно, что будут значения :name1, :id2, $value1 ...)
Тоесть мне нужен универсальный метод который будет обрабатывать запросы
$this->pdoWork->process($query,(array)$params);
В него я передаю сам текст запроса и ассоциативный масив параметров на замену вида: $params=array(':id1'=>'1',':id2'=>'2');
Обработчик:

public function process($query,$params=' ')
{

if($params!==' ' && is_array($params))
{
$sth = $this->db->prepare($query);
foreach ($params as $key=>$val)
{
$sth->bindParam($key,$val);
$sth->execute();
}
print_r($row = $sth->fetchAll(PDO::FETCH_ASSOC));
}
}




Выдает ошибку
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/task15/lib/PdoWork.php on line 61

Помогите пожалуйста разобраться, как работать с этим в цикле. Нашел много информации, когда заранее известно сколько и какие параметры надо заменять, но в моем случае надо использовать цикл



Спустя 8 минут, 8 секунд (6.10.2012 - 14:22) killer8080 написал(а):
Traveller
execute вынеси из цикла

Спустя 2 минуты, 27 секунд (6.10.2012 - 14:25) Traveller написал(а):
Цитата (killer8080 @ 6.10.2012 - 11:22)
Traveller
execute вынеси из цикла

Тогда $rows - пустой массив

Спустя 4 минуты, 13 секунд (6.10.2012 - 14:29) Traveller написал(а):
Все, спасибо, получилось. Я ошибся в sql Запросе

Спустя 16 секунд (6.10.2012 - 14:29) killer8080 написал(а):
Traveller
сначала делаются все бинды, и только потом execute, а ты его в цикл запихнул, потому и ошибку выдает.

Спустя 2 минуты, 7 секунд (6.10.2012 - 14:31) killer8080 написал(а):
Traveller
кстати, зачем тебе вообще бинд? Когда ты можешь свой массив сразу передать в execute?

Спустя 16 минут, 7 секунд (6.10.2012 - 14:47) Traveller написал(а):
killer8080
просто согласно всем манам по этому делу, везде сначала бинды делались

Спустя 1 минута, 51 секунда (6.10.2012 - 14:49) killer8080 написал(а):
Цитата (Traveller @ 6.10.2012 - 14:47)
просто согласно всем манам по этому делу, везде сначала бинды делались

Спустя 5 минут, 16 секунд (6.10.2012 - 14:55) Traveller написал(а):
killer8080
Пустой массив $row, если сделать как в примере
а если с биндами то все ок

Спустя 4 минуты, 31 секунда (6.10.2012 - 14:59) killer8080 написал(а):
Цитата (Traveller @ 6.10.2012 - 14:55)
Пустой массив $row, если сделать как в примере
а если с биндами то все ок

не может быть, покажи как делал.

Спустя 4 минуты, 39 секунд (6.10.2012 - 15:04) Traveller написал(а):

if($params!==' ' && is_array($params))
{
$sth = $this->db->prepare($query);
$sth->execute($params);
return $row = $sth->fetchAll(PDO::FETCH_ASSOC);
}

Спустя 7 минут, 32 секунды (6.10.2012 - 15:11) killer8080 написал(а):
Хм, ну вроде должно работать unsure.gif
Может с запросом было что то не так? Или с массивом?

Спустя 2 минуты, 25 секунд (6.10.2012 - 15:14) Traveller написал(а):
Хз, с биндами все пашет, единственное что, он возвращает $row как массив в массиве . Тоесть [0] элементу соответствует массив со значениями из таблицы

Спустя 12 минут, 33 секунды (6.10.2012 - 15:26) killer8080 написал(а):
Цитата (Traveller @ 6.10.2012 - 15:14)
единственное что, он возвращает $row как массив в массиве . Тоесть [0] элементу соответствует массив со значениями из таблицы

каждый элемент массива - это ряд, возвращенный запросом. В твоем случае запрос вернул один ряд, потому и элемент один.

Спустя 14 минут, 57 секунд (6.10.2012 - 15:41) Traveller написал(а):
killer8080
Странное дело, если выполнять запрос в MySql
SELECT *
FROM `TableA`
JOIN `TableB` ON TableA.id = TableB.id
WHERE TableA.id =2

то выводит:
id name id name
2 Monkey 2 Pirate
а то же самое через PDO fetch() возвращает только
array(2) { ["id"]=> string(1) "2" ["name"]=> string(6) "Pirate" }

Спустя 21 минута (6.10.2012 - 16:02) killer8080 написал(а):
Traveller
ни чего странного, в массиве не может быть двух элементов с одинаковым ключом.
Либо используй индексный массив в результате PDO::FETCH_NUM, либо используй алиасы к полям в запросе.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.