DBD :: mysql :: st fetchrow_array не удалось: fetch () без execute () - PullRequest
7 голосов
/ 29 сентября 2011

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 () без execute () в

Ответы [ 3 ]

4 голосов
/ 29 сентября 2011

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

$sql = $dbh->prepare( $query ) or die "Unable to prepare $query" . $dbh->errstr;
$sql->execute() or die "Unable to execute '$query'.  " . $sql->errstr;
3 голосов
/ 29 сентября 2011

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

print $sth->execute(),"\n";
2 голосов
/ 30 марта 2012

Другой способ - захватывать ошибки с помощью обработчика ошибок, делать с ними все, что вам нужно (отправить его в файл журнала, распечатать, умереть или продолжить выполнение скрипта).
Это исключает необходимость " 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");, не делайте этого, для получения дополнительной информации читайте this .

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