Как уже упоминали другие:
use strict;
use warnings;
Кроме того, каждый раз, когда вы делаете вызов DBI, вы должны делать это:
if ($sth->err()) {
die "ERROR: " . $sth->errstr() . "\n";
}
Даже после получения. Это поможет решить многие проблемы, которые могут у вас возникнуть.
Я немного упростил вашу программу:
use strict;
use warnings;
use DBI;
my $connect = DBI->connect("$connectString", "$user", "$id");
if (not $connect) {
die qq(connection error\n);
}
my $table = "session";
my $uniqueSessions = "SELECT DISTINCT SESSION
FROM $table";
print qq(\$uniqueSessions = "$uniqueSessions"\n);
my $queryUniques = $connect->prepare($uniqueSessions);
if ($queryUniques->err()) {
die "ERROR: " . $queryUniques->errstr() . "\n";
}
$queryUniques->execute();
if ($queryUniques->err()) {
die "ERROR: " . $queryUniques->errstr() . "\n";
}
my $session;
$queryUniques->bind_columns(\$session);
my $counter = 1;
my $sessionString;
while(my $hashref = $queryUniques->fetch()) {
print "Fetching Row\n";
if($counter == 1) {
$sessionString = "'" . $session . "'";
} else {
$sessionString = $sessionString . ", '" . $session . "'";
}
$counter++;
}
if ($queryUniques->err()) {
print "ERROR = " . $queryUniques->errstr . "\n";
}
print "$sessionString\n";
Я в основном взял второй запрос и кое-что исправил. Последняя строка выводит $sessionString
, который представляет собой список всех ваших сеансов, разделенных кавычками. Эта часть сработала.
Вторая часть, где вещи становятся странными. Вы берете $sessionString
и передаете его как оператор SQL. Если только я чего-то не вижу, $sessionString
- это просто список сеансов, а не оператор SQL сам по себе.
Как я уже говорил, проверяйте наличие ошибок при каждом вызове DBI и проверяйте, не ошиблись ли вы где-нибудь.
Вы также можете добавить такую строку:
print qq(DEBUG: SQL Query = '$sqlStatement'\n);
перед тем, как вы запустите $sth->prepare($sqlStatement)
и таким образом, вы сможете увидеть, каков ваш оператор SQL.
Проблема
Похоже, вы готовите второй запрос, прежде чем выясните, каким должен быть (?)
(я полагаю, это ваша группа $ sessionString).
Вам нужно заменить сеансы на (?)
ДО , когда вы выполняете DBI-> prepare ().
Примерно так ( не проверено ):
(my $sessionQuery = $query) =~ s/\(\?\)/$sessionString/;
my $querySth = $connect->prepare($sessionQuery);
$querySth->execute();
my @test = $queryPrep->fetchall_arrayref();
Помните, что qq()
синтаксис цитирования - ваш друг. Я часто этим пользуюсь:
print qq(DEBUG: \$foo = "$foo"\n);
А иногда я просто копирую и вставляю заявление, а затем цитирую его:
print qq(DEBUG: while (my $foo = foobar($bar)) };\n);
Удивительно, сколько ошибок я могу уловить таким образом. Затем я могу найти DEBUG:
в моей программе и удалить эти строки.
Не забывайте писать свои программы по очереди, посмотрите, сможете ли вы $sessionString
работать. Затем попробуйте посмотреть, можете ли вы заменить это на $query
, а затем попробуйте выполнить вычисленный запрос.
Perl - хороший и мощный язык, но синтаксис иногда может быть немного хитрым, особенно если вы не используете объектно-ориентированный Perl.