Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Web-программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 26.12.2007, 18:32   [включить плавающее окно]   #1
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
Perl DBI Errors "disconnect invalidates" & "fetchrow_hashref"

Есть Perl Скрипты. Есть БД MySQL.

Скрипты разные, но есть общие черты:
PHP код:
  my $data;
  
my $dbh DBI->connect(*, *, *) or die "Error: $DBI::errstr\n"
  
my $sql qq{SQL-запрос};
    
my $sth=$dbh->prepare($sql);
    
my $reply $sth->execute();
    while(
$data=$sth->fetchrow_hashref) {обработка}
    if (
$reply>=1){сообщение}else{сообщение}
$dbh->disconnect
Потом (в другой части в виде функции) опять происходит выполнение запроса, в т.ч. подключение и отключение, для вывода новостей, но на ту (новостную) часть сообщений вроде не поступало. (Вызывается она не всегда)

Так вот. Выдаётся ошибка (не регулярно):
PHP код:
[error] [client *] DBI::db=HASH(*)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnectingat *.cgi line *., referer: * 

Ещё есть ошибка
PHP код:
[error] [client *] DBD::mysql::st fetchrow_hashref failedfetch() without execute() at *.cgi line*., referer: * 
Она ссылается на этот отрезок кода:
PHP код:
my $data;
my $dbh DBI->connect(*, *, *) or die "Error: $DBI::errstr\n";
    
my $sql qq{UPDATE `*SET `*` = '*', `*` = '*' WHERE `*` = '*' LIMIT 1 ;};
    
my $sth $dbh->prepare($sql);
    
$sth->execute;
>    while(
$data=$sth->fetchrow_hashref)
    {
        if (* 
eq $data->{*} && * eq  $data->{*}){*=*;}
    }
$dbh->disconnect
PS: В И-нете искал, но то, что нашёл либо ничего не объясняет, либо я не понял.
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 26.12.2007, 20:36   [включить плавающее окно]   #2
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
телепаты в отпуске........ SQL запросы в студию....
звездочки заменить на данные при которых вываливается ошибка....
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 26.12.2007, 22:09   [включить плавающее окно]   #3
phasma
Мужской Team 3DNews
 
Аватар для phasma
 
Регистрация: 14.07.2007
Адрес: Мск
и еще ssh доступ с адресом сервера (;

З.Ы. а зачем отключаться от БД ?)
__________________
Я не тролль(с)
phasma вне форума  
Ответить с цитированием
Непрочитано 27.12.2007, 00:24   [включить плавающее окно]   #4
Гхост-цзы
Мужской Умудрённый
 
Аватар для Гхост-цзы
 
Регистрация: 04.06.2004
Цитата (phasma) »
и еще ssh доступ с адресом сервера (;
ага -- ещё пароль рута mysql

Цитата (pl_Vah) »
SQL запросы в студию....
можно точно сказать, что это select-ы

Цитата (RMV) »
[error] [client *] DBI::db=HASH(*)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at *.cgi line *., referer: ....
"DBI::db=HASH(*)->disconnect invalidates 1 active statement handle ...." -- скрипт не может определить дескриптор базы, от которой хочешь отсоединиться;
" DBD::mysql::st fetchrow_hashref failed: fetch() without () at ...." -- тут и вовсе всё сказано - попытка получить выборку селект-запроса без выполнения (execute) самого запроса;
косяк скорее всего не в тех фрагментах кода, часть которого скрытно приведена здесь, а
Цитата
Потом (в другой части в виде функции)....
__________________
Крылья знаний меня от людей отлучили,
Я увидел, что люди - подобие пыли.

Последний раз редактировалось Гхост-цзы; 27.12.2007 в 00:53.
Гхост-цзы вне форума  
Ответить с цитированием
Непрочитано 27.12.2007, 02:19   [включить плавающее окно]   #5
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
как пример могу сказать что проблема может быть в экранировании эскейп символов..... поэтому прошу полную картину для анализа.....
ЗЫ: давно я на перле не писал ничего для веба....... завтра ещё расковыряю DBD-mysql подробно....
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 27.12.2007, 13:30   [включить плавающее окно]   #6
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
Гхост-цзы
Цитата
можно точно сказать, что это select-ы
Точно. Они самые.

Гхост-цзы
Цитата
попытка получить выборку селект-запроса без выполнения (execute) самого запроса;
Спасибо. Только сейчас увидел. Действительно - косяк. Этого while вообще быть не должно.

Гхост-цзы
Цитата
косяк скорее всего не в тех фрагментах кода, часть которого скрытно приведена здесь, а
Вот тот фрагмент:
PHP код:
my $data;
my $dbh DBI->connect($*, $*, $*) or die "Error: $DBI::errstr\n";
    
my $sql qq{
SELECT `*`.`*` , `*`.`*`
FROM `*`
ORDER BY `*`.`*DESC
LIMIT 0 
7
    
};
    
my $sth $dbh->prepare($sql);
    
$sth->execute();
    while(
$data=$sth->fetchrow_hashref)
    {
        print 
qq[$data->{*}<br>$data->{*}<hr>];
    }
$dbh->disconnect

pl_Vah
Цитата
поэтому прошу полную картину для анализа.....
Что конкретно надо и как это узнать?
__________________
Hi, from RMV!

Последний раз редактировалось RMV; 27.12.2007 в 13:32.
RMV вне форума  
Ответить с цитированием
Непрочитано 27.12.2007, 20:25   [включить плавающее окно]   #7
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
1) $dbh->quote() использовать надо...
2) Берешь и выставляешь print $sql например....

и провалившийся запрос постишь сюда в том виде в котором он напечатался..... или там такие секретные данные что ты их на звездочки меняешь?
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 28.12.2007, 13:12   [включить плавающее окно]   #8
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
pl_Vah
Цитата
1) $dbh->quote() использовать надо...
2) Берешь и выставляешь print $sql например....
Я запрос и так сам проверяю. Запрос большой длинный, но наверняка правильный.
Мож. так подскажите в чём дело? Действительно считаете, что дело в запросе?
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 28.12.2007, 19:57   [включить плавающее окно]   #9
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
ну если ты пытаешься из после execute() вытянуть что-то из ничего - значит диагнозы могут быть такие:
- Кривой SQL который вылетает в ошибку или 0 рядов возвращяет
- Кривой драйвер mysql с кривыми настройками..... который бьется в конвульсиях а получить ответ не может.....
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 30.12.2007, 12:42   [включить плавающее окно]   #10
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
pl_Vah
Проблема в том, что ошибка проявляется в нескольких файлах.
Вот более подробный код одной из ошибок:
PHP код:
my $data;
my $dbh DBI->connect($*, $*, $*) or die "Error: $DBI::errstr\n";
    if (
length($*)>0) {
        
my $sql qq{UPDATE `t*SET `*` = '$*' WHERE `*` = '$*' LIMIT 1;};
        
my $sth=$dbh->prepare($sql);
        
$sth->execute();
    }
    
$sql qq{
SELECT `t*`.*
FROM `t*`
WHERE (`t*`.`*` = ?) AND (`t*`.`*` != '-1')
LIMIT 1;
    };
    
$sth $dbh->prepare($sql);
    
my $reply $sth->execute($*);
if (
$reply==1) {
    while(
$data=$sth->fetchrow_hashref) {
        
$data->{*} =~ s/*/*/g;
        print 
qq{$data->{*}};
        if ($* 
eq $* && $* eq $*){print qq{$data->{*}};}
        print 
qq{$data->{*}};
        if (
$data->{*} == '0')    {print qq{text 1};}else{print qq{text 2};}
        print 
qq{$data->{*}};    
    }
}else{
    print 
qq{Error text};
}
$dbh->disconnect
Но самое неприятное, что сообщения об ошибках носят периодический (т.е. не постоянный) характер.
PS: Ошибка не та, что "Error text"! Причём работа продолжается, просто в лог - идёт ошибка!
__________________
Hi, from RMV!

Последний раз редактировалось RMV; 30.12.2007 в 12:46.
RMV вне форума  
Ответить с цитированием
Непрочитано 05.01.2008, 12:43   [включить плавающее окно]   #11
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
Чего не хватает для ответа?
Уже вроде и код предоставил...
PS: Может после ошибки и приостанавливает работу с выходом - я сам не смог создать эту ситуацию, но логи - смотрю.
__________________
Hi, from RMV!

Последний раз редактировалось RMV; 06.01.2008 в 12:58.
RMV вне форума  
Ответить с цитированием
Непрочитано 07.01.2008, 00:14   [включить плавающее окно]   #12
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
для меня и этот кусок кода непонятен......

1) что такого секретного скрывается за звездочками?
2) show create table в студию
3) опять повторяюсь!!! - запросы в том виде в каком они используются в студию!!!
4) если некоторые запросы прокатывают а некоторые нет - проблема не в DBI а в запросах! которые ты продолжаешь скрывать....
5) Если ты хочешь чтобы тебе перебрали двигатель автомобиля в другом городе - ты как минимум этот автомобиль должен туда привезти.... ну или на худой конец этот двигатель.... а не привозить стартер и требовать чтобы тебе клапаны отрегулировали... это понятно?
6) Версию mysql ещё напиши точную...
7) Телепаты, которые умеют определять на расстоянии что за звездочками и читать твои мысли - в отпуске, так что еще раз перечитай первые шесть пунктов и предоставь информацию....

и восьмое - могу ещё предположить что надо делать не так $sth->execute($*); а так $sth->execute($dbh->quote($*));.... и возможно кои каких ошибок не станет.... хотя неуверен......... у тебя слишком много звездочек....

кстати......
звездная болезнь - это плохо...
звездная болезнь - это плохо...
звездная болезнь - это плохо...
звездная болезнь - это плохо...
звездная болезнь - это плохо...
вобщем
for($i=0; $i<100000; $i++){
print "звездная болезнь - это плохо...";
}
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 09.01.2008, 17:34   [включить плавающее окно]   #13
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
1) За звёздачками скрываются названия таблиц, полей и переменных
2) Зачем? Ну ладно. Частично:
Код:
CREATE TABLE `table1` (
`delete` tinyint(4) DEFAULT '0' NOT NULL,
`mykey` bigint(20) NOT NULL auto_increment,
`unames` varchar(20),
PRIMARY KEY (`mykey`),
KEY `delete` (`delete`),

CREATE TABLE `table2` (
`delete` tinyint(4) DEFAULT '0' NOT NULL,
`unames` varchar(20) NOT NULL,
PRIMARY KEY (`unames`),
KEY `delete` (`delete`)
3)
Код:
SELECT `table1`.*, `table2`.*
FROM `table1` JOIN `table2` USING (`unames`)
WHERE (`table1`.`mykey` = ?) AND (`table2`.`delete` != '-1') AND (`table1`.`delete` != '-1')
LIMIT 1;
8) Так вобще не работает
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 09.01.2008, 18:09   [включить плавающее окно]   #14
phasma
Мужской Team 3DNews
 
Аватар для phasma
 
Регистрация: 14.07.2007
Адрес: Мск
SELECT a.delete, a.mykey, a.unames, b.delete, b.unames FROM table1 AS a LEFT JOIN tables2 AS b ON a.unames = b.unames WHERE a.mykey != NULL, b.delete != -1, a.delete != -1 LIMIT 1 так низя ?

вообщем в таблице должны быть индексы, нельзя делать запросы SELECT * FROM напрямую .. и зачем LIMIT 1 ?
__________________
Я не тролль(с)
phasma вне форума  
Ответить с цитированием
Непрочитано 10.01.2008, 23:15   [включить плавающее окно]   #15
Гхост-цзы
Мужской Умудрённый
 
Аватар для Гхост-цзы
 
Регистрация: 04.06.2004
Цитата (RMV) »
Вот более подробный код одной из ошибок:
my $data;
my $dbh = DBI->connect($*, $*, $*) or die "Error: $DBI::errstr\n";
if (length($*)>0) {
my $sql = qq{UPDATE `t*` SET `*` = '$*' WHERE `*` = '$*' LIMIT 1;};
my $sth=$dbh->prepare();
$sth->execute();
эээ, джан, кто тебя учил реализовывать update-запрос через двух-этапный prepare-execute; так выполняются селекты, в крайнем случае -- какой-нибудь show; апдейты/делиты/инсёрты выполняются сразу dbh->do($sql)

Гхост-цзы добавил :

Цитата (RMV) »
SELECT `table1`.*, `table2`.*
FROM `table1` JOIN `table2` USING (`unames`)
WHERE (`table1`.`mykey` = ?) AND (`table2`.`delete` != '-1') AND (`table1`.`delete` != '-1')
LIMIT 1;
ещё вариант :
SELECT table1.* FROM table1 INNER JOIN table2 USING (`unames`)
WHERE (table1.mykey = ?) AND (table2.delete != '-1') AND (table1.delete != '-1') LIMIT 1
__________________
Крылья знаний меня от людей отлучили,
Я увидел, что люди - подобие пыли.
Гхост-цзы вне форума  
Ответить с цитированием
Непрочитано 11.01.2008, 14:55   [включить плавающее окно]   #16
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
Гхост-цзы ну вообще это допустимо.... на практике используется реденько-реденько..... когда шаблоны запросов изнгачально в отдельном файле подготавливаются и используются несколько раз одинаковый апдейт с разным ИД например.......... хотя это и криво - это не критично......
Меня вот звездочки убивают и фраза "Зачем? Ну ладно. Частично"..... А зачем вообще тогда писать?
Хочешь получить ответ что происходит в данной ситуации при данных условиях с данными переменными - будь любезен...... или в задаче по физике/математике вы где нибудь видели Расчитать расстояние от точки А до точки Б зная что скорость автомобиля была 60 км/час и ехал он 1 час ** минут..... Расчитайте....... ответом может быть только разброс от 60 до 120...... нормальный разброс для точной науки?

Частично - решай проблему сам..... Тыкай пальцами в небо...... Моделируй сам различные ситуации ну и так далее.....
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 12.01.2008, 14:18   [включить плавающее окно]   #17
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
pl_Vah
Да нет там, в опущенной части ничего важного т.е. какая разница, какие есть ещё поля(столбцы) в таблице, если в данном запросе я их не использую (и они не обязательны)? Зачем мне давать ненужную/лишнюю информацию, затрудняющую анализ?
В сообщении #1423187 звёздочки я не использовал.
Или текст в сообщении #1418980. Ну какая разница, от названия переменных или таблиц? Для анализа, насколько я знаю, - никакой! + то, что я сократил выводимый текст (просто текст!), который я просто убрал. Зачем он?
Если не хватает что-то конкретного - пиши.
PS:
Perl Version: 5.0
MySQL Version 4.0
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 13.01.2008, 02:46   [включить плавающее окно]   #18
pl_Vah
Мужской Опытный
 
Аватар для pl_Vah
 
Регистрация: 25.05.2004
Адрес: Moscow
Хорошо... Пишу отчет о моем анализе.... Если Вы по другому понять не можете...
запрос:
Код:
SELECT `table1` . * , `table2` . *
FROM `table1`
JOIN `table2`
USING ( `unames` )
WHERE (
`table1`.`mykey` =10
)
AND (
`table2`.`delete` != '-1'
)
AND (
`table1`.`delete` != '-1'
)
LIMIT 1 ;
Отрабатывает замечательно и без ошибок на таблицах:
Код:
--
-- Структура таблицы `table1`
--

CREATE TABLE IF NOT EXISTS `table1` (
  `delete` tinyint(4) NOT NULL default '0',
  `mykey` bigint(20) NOT NULL auto_increment,
  `unames` varchar(20) default NULL,
  PRIMARY KEY  (`mykey`),
  KEY `delete` (`delete`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Структура таблицы `table2`
--

CREATE TABLE IF NOT EXISTS `table2` (
  `delete` tinyint(4) NOT NULL default '0',
  `unames` varchar(20) NOT NULL,
  PRIMARY KEY  (`unames`),
  KEY `delete` (`delete`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
Так как DBI не глючит, что видно из других неглючащих запросов - проблема Ваша в запросах, которые вы скрываете...
Еще вопросы?

И как дополнение

запрос:
Код:
SELECT `table1`. * , `table2`. *
FROM `table1`
JOIN `table2`
USING ( `unames` )
WHERE (
`table1`.`mykey` = abc
)
AND (
`table2`.`delete` != '-1'
)
AND (
`table1`.`delete` != '-1'
)
LIMIT 1
отрабатывает с ошибкой sql сервера:
Код:
#1054 - Unknown column 'abc' in 'where clause'
запрос:
Код:
SELECT `table1`. * , `table2`. *
FROM `table1`
JOIN `table2`
USING ( `unames` )
WHERE (
`table1`.`mykey` = 'abc'
)
AND (
`table2`.`delete` != '-1'
)
AND (
`table1`.`delete` != '-1'
)
LIMIT 1
отрабатывает нормально:

pl_Vah добавил :

А почему он у Вас не работает - это я уже проанализировать из вышенаписанного немогу.... извините, не телепат...
pl_Vah вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 14.01.2008, 13:16   [включить плавающее окно]   #19
RMV
Мужской Общительный
Автор темы
 
Регистрация: 22.12.2003
Адрес: Н.Н.
pl_Vah Спасибо за анализ!
Гхост-цзы, phasma тоже спасибо.


Кажется, определил ситуацию, когда возникает эта ошибка. Буду ещё тестировать, но эта уже точно выявилась, хотя возможно есть др. причины или эта - частный случай др.

pl_Vah
Почему у меня НЕ работает
Код:
my $reply = $sth->execute($dbh->quote($mykey));
 и
my $reply = $sth->execute($dbh->quote($unames));
, а работает
Код:
my $reply = $sth->execute($mykey);
 и
my $reply = $sth->execute($unames);
$mykey - число
$unames - текст

понятия не имею, но возмлжно (имхо), что $sth->execute($переменная) автоматически подставляет кавычки.

Так вот, ошибка...
Она проявляется в двух разных файлах (программах типа *.cgi). Структура, порядок и схемы работы в них почти идентичны. Разница - в наборе выводимых полей (одна из двух таблиц, другая из одной) и в запрашваемом значении (в одном цифра, в другом варианте текст). (Здесь я в основном описывал первый вариант, т.к. в логах он встречался чаще).

Вот, что я выяснил: запись в лог идёт в том случае, если искомая запись в БД не найдена, т.е. похоже в этом случае $reply < 1 (точнее - 0E0) При этом пользователю выдаётся сообщение об отсутствие нужной записи (поскольку я отслеживаю переменную $reply в плане, что значение должно быть 1).

Составляя коментарий в сообщении #1418980 я несколько поторапился.
Исправления:
1. На тот момент мне действительно не удалось обнаружить ситуацию, когда выдавалась ошибка.
2. Сообщение Error text, в том случае, который я сумел воспроизвести, - выводится.
__________________
Hi, from RMV!
RMV вне форума  
Ответить с цитированием
Непрочитано 14.01.2008, 21:52   [включить плавающее окно]   #20
Гхост-цзы
Мужской Умудрённый
 
Аватар для Гхост-цзы
 
Регистрация: 04.06.2004
Цитата (RMV) »
Вот, что я выяснил: запись в лог идёт в том случае, если искомая запись в БД не найдена, т.е. похоже в этом случае $reply < 1 (точнее - 0E0) При этом пользователю выдаётся сообщение об отсутствие нужной записи (поскольку я отслеживаю переменную $reply в плане, что значение должно быть 1).
вариант "лекарства" от 0E0 -- сравнивай не $reply, а ($reply+=0)
__________________
Крылья знаний меня от людей отлучили,
Я увидел, что люди - подобие пыли.
Гхост-цзы вне форума  
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 01:37. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey