Комментарии MySQL приводят к неправильному подсчету параметров связывания с Perl DBI - PullRequest
1 голос
/ 08 января 2010

У меня есть следующий код 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 делает что-то странное с символами новой строки или пробелами за кулисами?

Ответы [ 3 ]

5 голосов
/ 09 января 2010

В вашем коде SQL или Perl нет ничего плохого.

Это может быть ошибка в DBI, DBD :: mysql или MySQL. Первым шагом в отладке этой проблемы было бы выяснить, какой бит виноват. Итак, начнем с устранения переменных.

Начните с удаления переменных связывания, жестко запишите некоторые значения и посмотрите, правильно ли выполняется процесс. Если нет, то, вероятно, это ошибка в DBD :: mysql или DBI. Сначала попробуйте обновить их оба и посмотрите, исправлена ​​ли проблема. Если это не сработает, сообщите об ошибке . Обратите внимание, что похожая ошибка анализа комментариев , поэтому вполне может быть DBD :: mysql. (Вы уверены, что это do not get list children, а не don't get list children?)

Затем исключите Perl из уравнения. Запустите запрос в оболочке mysql (используйте \ e, чтобы вызвать редактор). У него та же проблема? Если так, то MySQL виноват. Снова попробуйте обновить.

1 голос
/ 16 марта 2010

Одинарные кавычки внутри комментария Не знаю, что отвечает за эту ошибку. Измените «не заводите последнего ребенка» на «не заводите последнего ребенка», и ваша проблема исчезнет.

1 голос
/ 09 января 2010

Я видел подобные вещи в других местах. Скорее всего, произошло то, что где-то на разных уровнях (Шверн прав, что вам придется копать, чтобы посмотреть, какой именно) какой-то фрагмент кода преобразует символы новой строки в пробелы по причине, которая в то время должна была казаться обоснованной, поэтому ваш комментарий занимает всю оставшуюся часть запроса.

Совет, который я даю людям, не используйте однострочные комментарии в SQL, если только не используется командная строка или другой выделенный клиент. Слишком много слоев и возможность скрытых ошибок.

...