корявость PDO
The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP.
Собственно интерес к PDO у меня проснулся из-за подготовки к ZCE, где довольно много вопросов на нем основывалось. Нет - я не то что бы совершенно с ним знаком небыл, но использовать в боевых условиях не приходилось, а вот тут как раз подвернулась возможность засунуть PDO в реальный проект, и сразу же нашлись недостатки…
Нет, возможно кому-то это и не покажется недостатками или может быть Вы уже привыкли к этим “осбенностям”, но у меня ушло некоторое время на поиск непонятного для меня бага где-то в области выборки из БД.
Доходило уже до того, что мне казалось что SQL запрос был неверным, но проверка напрямую через mysql опровергала это. Итак…
Первое и самое противное: PDO странно обрабатывает строки для IN запросов. То-есть, если мы пишем:
$sth = $this->dbh->prepare(
"SELECT * FROM persons pi
WHERE pi.person_id IN ( :ids )"
);
$sth->bindParam( ':ids', implode( ", ", $ids ) );
, то будте готовы, что вы не получите ожидаемый результат… да.
Второе: PDO->bindParam() в качестве второго аргумента принимает ссылку на переменную. Это чревато тем, что при попытке всучить туда константу, готовтесь увидеть нечто вроде: “Fatal error: Cannot pass parameter 2 by reference in /home/azazel/WWW/test/CLI/stext.php on line 46″
Вот так пока проходит знакомство с этим чудесным PHP Data Objects. Будет что новое - обязательно отпишусь
Tags: PDO, PHP, грабли, документация, ошибки, разработка
Также рекомендую к прочтению:
Август 31st, 2008 at 01:16
а что вы используете вместо ПДО для доступа к БД в боевых условиях?
Август 31st, 2008 at 09:15
я использую PDO, но через обертки. Например последнее время очень нравится работать с Doctrine.
Ноябрь 6th, 2008 at 23:43
Эм…Вы просто не ожидаете от него его мощщщи
bindValue Вам поможет
bindParam гараздо более мощное ср-во - мануал прямо так и указывает
ну а с IN - эм, массив туда засунуть не пробовали?