Я получаю странную ошибку в своем коде, которая, кажется, происходит только тогда, когда я пытаюсь выполнить запрос с заполнителями и идентификатором цитаты. Я написал следующую подпрограмму, чтобы проверить, если запись существует, и она будет возвращать ключ, если он существует, или null
, если он не делает:Невозможно определить заполнители в perl DBI
sub check_exists {
my $table=$_[0]; #table
my $col=$_[1];
my $check=$_[2]; #query for item
#check if value exists
my $sql=sprintf(qq(SELECT COUNT(1) FROM %s WHERE ?=?),
$dbh->quote_identifier($table));
my $sth = $dbh->prepare($sql);
$sth->execute($col,$check);
my $result=$sth->fetch()->[0];
$sth->finish();
#if value exists find the row and return the primary key
if ($result){
my $sql = sprintf(qq(SELECT %s FROM %s WHERE ?=?),
$dbh->quote_identifier=$col,
$dbh->quote_identifier=$table);
my $sth2=$dbh->prepare($sql);
$sth2->execute($col,$check);
return ($sth2->fetch()->[0]); #return key
}
else {
return 0; #else value does not exist and return null
}
}
Я даже пробовал:
my $result=$dbh->selectrow_array(sprintf(qq(SELECT COUNT(1) FROM %s WHERE ?=?),$dbh->quote_identifier($table)),undef, $col, $check);
К сожалению, это всегда всегда возвращает ноль. Если я не использую заполнители, это работает.
my $test=$dbh->selectrow_array(qq(SELECT COUNT(1) FROM ORF1 WHERE idORF1=?),undef,$orf1_crc32)
Может кто-нибудь объяснить, что я сделал неправильно?
[Как правило, вы не можете использовать заполнители для имен столбцов.] (Https://metacpan.org/pod/DBI#Placeholders-and-Bind-Values) – ThisSuitIsBlackNot
Как отмечено выше, вы не можете использовать заполнители для столбца имена или имена таблиц. Вы можете использовать только заполнители для значений. –
Я думал, вы можете использовать quote_identifier для таблиц и столбцов. – nchuang