[Moscow.pm] bind_value
Peter Vereshagin
peter на vereshagin.org
Чт Май 19 07:15:30 PDT 2011
You'll never silence the voice of the voiceless, moscow-pm!
2011/05/18 10:29:28 -0700 moscow-pm-request на pm.org => To moscow-pm на pm.org :
> Столкнулся с дурацкой проблемой и не могу найти в документации решение.
> Мне нужно выполнить запрос с условием "field in ( ? )".
> $sth->bind_value( 1, $args ) подставляет значение $args в плейсхолдер
> заключенным в кавычки, что не правильно - MySQL из-за этого среди одного
> значения, а не среди множества.
DBI POD:
===
Also, placeholders can only represent single scalar values. For
example, the following statement won't work as expected for more than
one value:
"SELECT name, age FROM people WHERE name IN (?)" # wrong
"SELECT name, age FROM people WHERE name IN (?,?)" # two names
===
> Как можно выкрутиться, кроме как передав строку $args в запрос при его
> подготовке? В частности можно ли как-то заставить bind_value подставлять
> значение без кавычек, as is?
DBI внутри всё равно составляет sql-строку на отправку сам, биндюжа переменных
к sql-кляузе через quote() & co.
Исключение --- server-prepared statements, mysql их умеет с 5.1+
Было бы действительно интересно если бы с ними работало наподобие:
$sth -> bind_param( 1 => [ qw/abcd efgh/, ], { TYPE => SQL_ARRAY, } );
но сначала надо чтобы c api это умело?
а пока можно предложить подготавливать несколько кляуз для каждого
определённого кол-ва вопросов. Всё равно ж а) клиентские подготовления не
отнимают ресурсы сервера б) на больших кол-вах in() неэффективен, так что
растягиваемость ему не сильно и нужна.
73! Peter pgp: A0E26627 (4A42 6841 2871 5EA7 52AB 12F8 0CE1 4AAC A0E2 6627)
--
http://vereshagin.org
Подробная информация о списке рассылки Moscow-pm