У меня есть следующий код Perl, который делает вызов DBI:
my $artsql = q{ *** SNIP A BUNCH OF SQL ***
where a.article_id != ?
and at.type_name != 'List Element' -- don't get list children
and aw.flowstate = 'Published'
and a.visible_as_article = 1 }
. ( $filter ? q{and ch.channel_id = ?
and cat.category_id = ? }
: '' )
. q{order by a.publish_date desc
limit 5};
my @bind = ( $article );
push @bind, ( $channel_id, $category_id ) if $filter;
my $articles = $dbh->selectall_arrayref( $artsql, { Slice => { } }, @bind );
Когда $filter
включен, этот код умирает с ошибкой:
DBD::mysql::db selectall_arrayref failed: called with 3 bind variables when 1 are needed
Сначала я подумал, что это проблема с троичным условным выражением в середине строки (я был укушен этой ошибкой несколько раз), но это было правильно. Вывод некоторых отладочных значений показывает, что запрос и массив @bind
были построены правильно.
Затем я заметил, что запрос содержит комментарий SQL сразу после переменной first , поэтому я удалил ее. Пух, это сработало!
Согласно MySQL документы по комментариям ,
MySQL Server поддерживает три стиля комментариев:
От символа «#» до конца строки.
От последовательности «-» до конца строки. В MySQL стиль комментария «-» (двойной тире) требует, чтобы за вторым тире следовал хотя бы один пробел или элемент управления
символ (например, пробел, табуляция, новая строка и т. д.).
Поскольку за комментарием --
следовал пробел и (предположительно) он заканчивался концом строки, почему MySQL задохнулся? DBI делает что-то странное с символами новой строки или пробелами за кулисами?