2010-10-25 2 views
1

Я установил DBD::Pg версии 2.17.1, но все еще получаю ошибку при использовании коды нижеПочему я получаю «Не могу вызвать метод» fetchrow_array «без ссылки на пакет или объект»?

$res = $conn->prepare($query); 
$res = $res->execute(); 
@tuple = $res->fetchrow_array; 

ошибки:

Can't call method "fetchrow_array" without a package or object reference at test.pl line 69. 

Просьбы предложить.

+0

Дайте нам больше кода. Что это '$ res'? – eumiro

+0

Я добавил значения или $ res. пожалуйста, дайте мне знать, если вам требуется больше скриптов. – Space

+0

'use strict; использовать предупреждения, ' – Ether

ответ

7

$res не является объектным экземпляром DBI. Попробуйте запустить ref $res: он должен вернуть пустую строку.

Executes a previously prepared statement. In addition to UPDATE, DELETE, INSERT statements, for which it returns always the number of affected rows, the execute method can also be used for SELECT ... INTO table statements.

Ваш $res скорее всего, содержит число «изменяемых строк».

$sth = $conn->prepare($query); 
$nrows = $sth->execute(); 
@tuple = $sth->fetchrow_array; 
+0

Я старался в соответствии с вашим предложением, но не имел успеха. все еще получая ту же ошибку. – Space

+0

У меня была опечатка: '@tuple = $ res-> fetchrow_array;' должно быть '@tuple = $ sth-> fetchrow_array;' –

6

Вы не должны говорить

$res = $res->execute(); 

$ Рез до того, что заявление является дескриптором, что вам нужно будет использовать для вызова fetchrow_array после Execute удачен, но выше, заменив его с возвращаемое значение execute(), которое является числом затронутых строк, если оно выполнено успешно, или undef, если сбой выполнен. Вместо этого сохраните это возвращаемое значение в отдельной переменной, если хотите, и проверьте его на успех перед вызовом fetchrow_array.

+0

Я старался согласно вашему предложению, но не имел успеха. – Space

+4

@Space, тогда вы делаете это неправильно, потому что это ваша проблема. Опубликуйте свой пересмотренный код. – cjm