[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