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
最初は、これは文字列の途中にある 3 項条件に問題があると思いました (そのバグに何度も悩まされました) が、それは正しかったです。いくつかのデバッグ値をダンプすると、クエリと@bind配列が正しく構築されていることがわかります。
その後、クエリの最初のバインド変数の直後に SQL コメントがあることに気付き、気まぐれにそれを削除しました。ふふ、うまくいきました!
コメントに関するMySQLのドキュメントによると、
MySQL Server は、「#」文字から行末までの 3 つのコメント スタイルをサポートしています。「--」シーケンスから行末まで。MySQL では、「 -- 」 (二重ダッシュ) コメント > スタイルでは、2 番目のダッシュの後に少なくとも 1 つの空白または制御文字 (スペース、タブ、改行など) が続く必要があります。
コメントの--後にスペースがあり、(おそらく) 行末で終わっていたのに、なぜ MySQL はチョークしたのでしょうか? DBI は舞台裏で改行や空白を使って奇妙なことをしていますか?