У меня есть следующий код 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 поддерживает три стиля комментариев: от символа «#» до конца строки. От последовательности «-» до конца строки. В MySQL стиль комментария> «-» (двойное тире) требует, чтобы за вторым тире следовал по крайней мере один пробел или управляющий символ (например, пробел, табуляция, новая строка и т. Д.).
Поскольку в комментарии был --
, за которым следует пробел и (предположительно) он заканчивался концом строки, почему MySQL захлебнулся? DBI делает что-то странное с символами новой строки или пробелами за кулисами?