2012-06-28 5 views
2

У меня есть PERL скрипт как следующий

my $tb = 'rajeev';
$query = 'select * from table where name = ?'
$sth = $dbh->prepare($query);
$sth->execute($tb);

использование заполнителем в Perl DBI

ли $ Т.Б. заменен Раджив или «Раджив» при выполнении запроса? средство делает executs запроса в
select * from table where name = rajeev
или
select * from table where name = 'rajeev'

+0

Попробуйте и посмотрите. Один сравнивает столбец 'name' с * с именем' rajeev' *, а другой - с строковым литералом ''rajeev'' *. Да, в качестве комментариев @bohica ниже, утверждение удобно не буквально интерполировать - см. [Docs для 'mysql_server_prepare'] (http://search.cpan.org/dist/DBD-mysql/lib/DBD/mysql.pm) - но вы сможете определить, какие семантики действуют ... – pilcrow

ответ

5

DBI обрабатывает все ускользающей для вас. В случае строки это будет 'rajeev'. Вызов select * from table where name = rajeev даст вам ошибку.

Если вы предоставляете номер, он не будет добавлять кавычки, потому что они не нужны.

См. DBI Doc. В нем также говорится:

Метод quote() не следует использовать с «Placeholders and Bind Values».

Использование заполнителей иногда берет на себя котирование для вас, в зависимости от того, какой DBD вы используете. В вашем случае DBD::mysql вызовов $dbh->quote() как указано в док:

Альтернативный подход

$dbh->do("INSERT INTO foo VALUES (?, ?)", undef, $number, $name); 

в этом случае метод цитата выполняется автоматически.

Если у вас есть доступ к query log, вы можете проверить, на что похожи запросы. Если у вас есть запросы, которые занимают много времени, вы также можете открыть консоль mysql и сказать SHOW FULL PROCESSLIST;, чтобы просмотреть список запущенных запросов. Это также будет содержать полные инструкции SQL для вас. В Windows вы можете использовать HeidiSQL, чтобы сделать это.

+5

Лично я был бы осторожен, чтобы не смешивать слово «цитирование» в любом описании того, как заполняются заполнители. Многие DBD ничего не цитируют, они передают SQL с заполнителями нетронутыми, а параметры передаются отдельно, когда выполняется вызов, поэтому нет цитирования как такового. – bohica

+1

FWIW, '... где name = rajeev' не будет ошибкой, если' rajeev' - это имя столбца. – pilcrow

+0

@pilcrow: это правильно, но это не то, что здесь предназначено, а не поведение, которое ожидает OP. – simbabque