我有以下进行 DBI 调用的 Perl 代码:
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 注释,所以我一时兴起将其删除。噗,成功了!
根据 MySQL docs on comments,
MySQL 服务器支持三种注释样式:从“#”字符到行尾。从“--”序列到行尾。在 MySQL 中,“--”(双破折号)注释 > 样式要求第二个破折号后跟至少一个空格或控制字符(例如空格、制表符、换行符等)。
既然注释--
后面跟着一个空格并且(大概)以行尾结束,为什么 MySQL 会卡住?DBI 是否在幕后使用换行符或空格做一些奇怪的事情?