Почему мой запрос Perl DBI не возвращает никаких результатов в сценарии CGI?

Я использую DBI в первый раз (и не так давно начал Perl [2 недели]), и я не могу получить никаких результатов из базы данных. Вот что у меня есть:

if( defined( $get{findAllPages} ) && defined( $post{ki} ) ){

   my ($database, $hostname, $port, $password, $user );

   $database = "#########";
   $hostname = "localhost";
   $password = "#########";
   $user = "###########";
   my $KI = $post{ki};

   # connect to the database
   my $dsn = "DBI:mysql:database=$database;host=$hostname;";
   my $dbh = DBI->connect($dsn, $user, $password);
   my $sth = $dbh->prepare("SELECT * FROM accounts WHERE KI = '" . $dbh->quote($KI) . "' ") or die "Could not select from table";
   $sth->execute();
   if( $sth->rows != 0 ) {
      my $ref = $sth->fetchrow_hashref();
      my $domain = $ref->{website};
      my $DB_username = $ref->{db_name};
      my $DB_password = $ref->{db_pass};
      $sth->finish();
      $dbh->disconnect();

      print "domian: " . $domain . "<br />\n";

      chomp(my $url = trim($domain));

В его нынешнем виде он проверяет правильность KI, а затем проверяет количество строк, которое работает. Бит, который я не могу приступить к работе, возвращает значения из массива;

my $ref = $sth->fetchrow_hashref();
my $domain = $ref->{website};
my $DB_username = $ref->{db_name};
my $DB_password = $ref->{db_pass};

Если кто-нибудь может сообщить мне, где я ошибаюсь, это будет очень признательно.


person Phil Jackson    schedule 05.02.2010    source источник


Ответы (2)


Попробуйте использовать обработку ошибок DBI, чтобы увидеть, что не так. См. Программирование Perl DBI, глава 4 (Обработка ошибок) или "Обработка ошибок DBI::mysql" на Perlmonks для справки.

person ghostdog74    schedule 05.02.2010
comment
Спасибо, не могли бы вы сказать мне, работает ли or die в онлайн-файлах cgi, поскольку я никогда не могу заставить его выводиться в браузер. - person Phil Jackson; 05.02.2010
comment
fetch() без execute().. так что я догадываюсь... my $dsn = DBI:mysql:database=$database;host=$hostname;; мой $dbh = DBI-›connect($dsn, $user, $password); my $sth = $dbh-›prepare(SELECT * FROM account WHERE KI = ' . $dbh-›quote($KI) . ' ) or die Не удалось выбрать из таблицы; $sth-›выполнить(); if( $sth-›rows != 0 ) { my $ref = $sth-›fetchrow_hashref(); $ref-›выполнить(); напечатать $DBI::errstr; мой $domain = $ref-›{веб-сайт}; мое $DB_username = $ref-›{db_name}; мой $DB_password = $ref-›{db_pass}; $sth-›finish(); $dbh-›отключить(); должен сделать это - person Phil Jackson; 05.02.2010
comment
если вы используете cgi, одним из способов является использование CGI::Carp. см. perldoc.perl.org /компьютерная графика/. кстати, размещайте свой код в своем вопросе, а не в комментариях, потому что форматирование плохое. - person ghostdog74; 05.02.2010
comment
grrr ... он отлично работает, когда я запускаю cmd на своем локальном компьютере, но когда я использую через браузер, он говорит мне сделать что-то одно, а затем, когда я возвращаюсь на свой локальный компьютер, это изменение вызывает ошибку ... - person Phil Jackson; 05.02.2010
comment
Что браузер говорит вам делать? - person brian d foy; 05.02.2010

Что я часто делаю, когда не вижу, что происходит:

использовать Data::Dumper;

мой $ref = $sth->fetch();

распечатать Дампер $ref;

и вы увидите макет структуры данных. Иногда дело в некорректной индексации массива или хеша.

person libdave    schedule 14.02.2010