Ошибка DBD::mysql::st fetchrow_array: выборка() без выполнения()

fetchrow_hashref работает нормально, но когда я использую fetchrow_array, возникает следующая ошибка.

#!/usr/bin/perl

use warnings;
use DBI;

$DB_name    = 'database';
$DB_user    = 'root';
$DB_pwd     = '';
my $dsn = 'dbi:mysql:avm:localhost:3306';

$dbh = DBI->connect($dsn,"$DB_user","$DB_pwd");

print "\nConnection error: $DBI::errstr\n\n";

$sth  = $dbh->prepare("SELECT * FROM tblmanufacturer");
$sth->execute();

while ( ($id,$name) = $sth->fetchrow_array() ) 
{
        print "$id\t\t $name \n";
}

$sth->finish();

$dbh->disconnect();

Ошибка DBD::mysql::st fetchrow_array: fetch() без выполнения() в


person bharanikumar Bs    schedule 29.09.2011    source источник


Ответы (4)


Проверьте возвращаемое значение execute() и/или print "$DBI::errstr\n\n" и убедитесь, что выполнить не удается.

print $sth->execute(),"\n";
person dlamotte    schedule 29.09.2011
comment
это 167, Для печати $sth-›execute(),\n; и Использование неинициализированного значения $DBI::errstr для печати $DBI::errstr\n\n - person bharanikumar Bs; 29.09.2011
comment
взгляните на ответ @mmrtnt, он выглядит более стоящим, чем мой. - person dlamotte; 04.10.2011

Я всегда использую «умереть» при ошибке как в «выполнить», так и в «подготовить».

$sql = $dbh->prepare( $query ) or die "Unable to prepare $query" . $dbh->errstr;
$sql->execute() or die "Unable to execute '$query'.  " . $sql->errstr;
person mmrtnt    schedule 29.09.2011

Другой способ — зафиксировать ошибки с помощью обработчика ошибок, сделать с ними все, что вам нужно (отправить в файл журнала, распечатать их, умереть или продолжить выполнение сценария).
Это устраняет необходимость " or die() " после каждого метода. . Документацию по методу HandleError можно найти здесь.

Для начала возьмем этот простой пример:

#!/usr/bin/perl

use strict;
use warnings;
use DBI;

my $DB_name    = 'database';
my $DB_user    = 'root';
my $DB_pwd     = '';
my $dsn = 'dbi:mysql:avm:localhost:3306';
my ($sth, $id, $name);

my $dbh = DBI->connect($dsn,$DB_user,$DB_pwd, { PrintError => 0, ShowErrorStatement => 1, HandleError => \&dbi_error_handler,} );

$sth  = $dbh->prepare("SELECT * FROM tblmanufacturer");
$sth->execute();

while ( ($id,$name) = $sth->fetchrow_array() ) 
{
        print "$id\t\t $name \n";
}

$sth->finish();
$dbh->disconnect();

sub dbi_error_handler
{
    my( $message, $handle, $first_value ) = @_;
    # print to your log file, call your own logger etc ... 
    # here it will die() to be similar to "or die()" method, but the line number is incorect
    die($message);
    # if you return false it will check/execute RaiseError and PrintError
    return 1;
}

P.S. Нет причин заключать ваши строковые переменные в кавычки здесь: ($dsn,"$DB_user","$DB_pwd");, не делайте этого, для получения дополнительной информации об этом прочитайте это.

person Radu Maris    schedule 30.03.2012

Я получил эту ошибку в apache fcgid из-за повторного использования $sth до того, как я закончил с этим. Я видел это только в журнале ошибок apache. Ввод или смерть... после операторов подготовки и выполнения ничего не помогло, и скрипт в любом случае работал нормально (при обычном использовании извлекалась только одна строка, но была возможность большего), поскольку он сделал то, что было ожидалось до возникновения ошибки. Ошибки только что появлялись в журнале Apache. Простое исправление, переименование $sth в $osth и проблема исчезла. Если вы видите эту ошибку и повторно используете дескрипторы операторов, попробуйте использовать уникальные дескрипторы операторов, чтобы увидеть, исчезнет ли проблема.

# rename to $ostmt
my $stmt="SELECT ...";
# rename to $osth
my $sth=$dbh->prepare($stmt) or die "Unable to prepare $stmt" . $dbh->errstr;
$sth->execute() or die "Unable to execute '$stmt'.  " . $sth->errstr;
while( my ( $f1, $f2 ... ) = $sth->fetchrow_array() ){
  # redeclare $stmt and $sth below using my $stmt, my $sth
  $stmt="SELECT ...";
  $sth=$dbh->prepare($stmt) or die "Unable to prepare $stmt" . $dbh->errstr;
  $sth->execute($f1) or die "Unable to execute '$stmt'.  " . $sth->errstr;
  my ( @stuff ) = $sth->fetchrow_array();
  # ...
  # do lots of stuff
  # ...
  # output fcgi content
} # error kicks in here

Это было значительно сложнее, чем пример выше, но ошибка была очень бесполезной, поэтому я оставляю этот ответ на случай, если он поможет кому-то еще.

person Don    schedule 06.04.2021