Perl-SQLite3: основной вопрос - PullRequest
3 голосов
/ 18 ноября 2009

Я признаю, что прошло много времени с тех пор, как я использовал Perl, но это поставило меня в тупик.

Вот проблема:

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use DBI;

print "Content-type: text/html\n\n";
print "<html><head><title></title></head></body>";

my $login = "admin@xxxxx.com";
my $dbfile = "/var/www/shopsite-data/shopsite_db";
my $sql = qq`SELECT ss_OrderID FROM ss_ORDER WHERE ss_Email=?`;

my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", "", "") || die "Cannot connect: $DBI::errstr";

my $sth = $dbh->prepare($sql);
$sth->execute($login) or die $sth->errstr();
while (my @result = $sth->fetchrow_array()) {
  print "OrderID: $result[0]<br />";
}
$sth->finish;

print "</body>";
print "</html>";
$dbh->disconnect;

ничего не возвращает, но я получаю набор результатов при входе в систему с помощью sqlite3 по тому же запросу. Я также получаю набор результатов при изменении запроса с

my $sql = qq`SELECT ss_OrderID FROM ss_ORDER WHERE ss_Email=?`;

до

my $sql = qq`SELECT ss_OrderID FROM ss_ORDER`;

Ответы [ 2 ]

13 голосов
/ 18 ноября 2009

Очевидная проблема - это @ внутри двойных кавычек:

my $login = "admin@xxxxx.com";

вероятно выходит как

 $login = "admin.com"

и, если у вас были включены предупреждения, в файл журнала выводится предупреждение, поскольку Perl видит @xxxx как массив и пытается его интерполировать, а затем предупреждает, потому что оно пустое. То есть, если у вас нет массива с именем @xxxx. Если вы это сделаете, вы получите все значения в строке.

Если у вас есть адрес электронной почты, используйте одинарные кавычки для предотвращения интерполяции @xxxx в виде массива:

my $login = 'admin@xxxxx.com';

Или вы можете использовать

my $login = "admin\@xxxxx.com";

для предотвращения @ начала интерполяции. Могут быть и другие проблемы с вашим сценарием, но это наиболее очевидная проблема.

Как ни странно Я только что читал о недостатках интерполяции в Perl .

Еще одна вещь ...

Еще одна вещь: у вас уже есть fatalsToBrowser, но

use warnings;
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);

, вероятно, дал бы вам предупреждение в вашем браузере о неинициализированных значениях, поэтому, возможно, стоит включить warningsToBrowser, пока ваш скрипт не заработает (или если он перестанет работать) ( документация здесь * 1028) *), а два других всегда.

4 голосов
/ 18 ноября 2009

Я считаю, Кинопико уже определили проблему.

Я добавлю, что, если вы собираетесь использовать CGI.pm, вы не должны генерировать заголовки вручную. Вместо этого используйте CGI::header.

Также:

print "<html><head><title></title></head></body>";

Обратите внимание на закрывающий тег для body, когда вы намеревались использовать открывающий тег.

И последнее, но не в последнюю очередь, вы должны

use strict;
use warnings;

в ваших сценариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...