EDIT:
В этот раз я попытаюсь найти лучшее объяснение, это точный код из моего сценария (извините за все эти комментарии, они являются результатом ваших предложений и показаны на видео ниже).
#use warnings;
#use Data::Dumper;
open(my $tmp_file, ">>", "/tmp/some_bad.log") or die "Can not open log file: $!\n";
#if( $id_client != "")
@allowed_locations = ();
#print $tmp_file "Before the if: ". Data::Dumper->Dump([\@allowed_locations, $id_client]) . "";
if( $id_client )
{
# print $tmp_file "Start the if: ". Data::Dumper->Dump([\@allowed_locations, $id_client]) . "";
# my $q = "select distinct id_location from locations inner join address using (id_db5_address) inner join zona_rural_detaliat using (id_city) where id_client=$id_client";
# my $st = &sql_special_transaction($sql_local_host, $sql_local_database, $sql_local_root, $sql_local_root_password, $q);
# print $tmp_file "Before the while loop: ref(st)='". ref($st) . "\n";
# while((my $id)=$st->fetchrow())
# {
# print $tmp_file "Row the while loop: ". Data::Dumper->Dump([$id]) . "";
# my $id = 12121212;
# push(@allowed_locations, $id);
# }
# print $tmp_file "After the while loop: ref(st)='". ref($st) . "\n";
# my($a) = 1;
#} else {
# my($a) = 0;
}
#print $tmp_file "After the if: ". Data::Dumper->Dump([\@allowed_locations, $id_client]) . "";
close($tmp_file) or die "Can not close file: $!\n";
#&html_error(@allowed_locations);
Прежде всего, кто-то сказал, что я должен попытаться запустить его в командной строке, скрипт отлично работает в командной строке (без предупреждений , тогда он не был прокомментирован), , но когда загрузить через apache в браузер не удается , см. это видео , где я зафиксировал поведение скрипта, что я пытался показать в видео:
Я открыл 2 вкладки, первая не определяет переменную $ id_client, вторая определяет переменную $ id_client, которая читается из GET:? Id_client = 36124 => $ id_client = 36124; , оба они включают библиотеку в видео " locallib.pl "
- При запуске скрипта со всеми
Новый код прокомментировал страницу загружает
- когда uncoment строка, которая определяет
@ allow_locations = ();
Сбой сценария
- оставьте это определение и оставьте комментарий
блок if и определение
my $ a; в блоке if; Теперь скрипт работает нормально, когда $ id_client
определяется, но завершается неудачно, когда $ id_client
не определено
- Раскомментируйте блок else и
определение my $ a; в остальном
блок. Теперь скрипт работает нормально
с или без $ id_client
- теперь комментируйте все my $ a;
определения и прокомментируйте остальное
блок, скрипт завершается ошибкой
- но если я использую open () , чтобы открыть
файл перед IF, и
close () , чтобы закрыть его после, если он не потерпит неудачу, даже если блок IF
пусто и событие, если нет
еще блок
Я повторил все шаги при запуске скрипта в командной строке, и скрипт работал после каждого шага.
Я знаю, это звучит как что-то, что не может быть поведением сценария, но, пожалуйста, посмотрите видео (2 минуты), может быть, вы заметите что-то, что я делаю не так там.
Использование версии perl:
[root@db]# perl -v
This is perl, v5.8.6 built for i386-linux-thread-mult
Кто-то спросил, нет ли у меня тестового сервера, ответьте: НЕТ, у моей компании есть рабочий сервер, который имеет несколько целей, не только веб-интерфейс, и я не могу рисковать обновлением ядра или версии perl, и не могу рисковать установкой какого-либо отладчика, поскольку владельцы компании говорят: «Если он работает, оставьте его в покое», и для них решение с my ($ a); идеально, потому что оно работает, я спрашиваю здесь только для меня, чтобы узнать больше о Perl и понять, что происходит не так и что я могу сделать лучше в следующий раз.
Спасибо.
P.S. надеюсь, что этот новый подход восстановит некоторые из моих -1:)
EDIT:
Я успешно запустил ведение журнала ошибок и обнаружил это в журнале ошибок после каждого шага, который приводил к ошибке. Я получил следующие сообщения:
[Чт 15 июля 14:29:19 2010] [error] locallib.pl не вернул истинное значение в /var/www/html/rdsdb4/cgi-bin/clients/quicksearch.cgi строка 2.
[Чт 15 июля 14:29:19 2010] [ошибка] Преждевременное завершение заголовков скриптов: quicksearch.cgi
Я обнаружил, что этот код находится в конце основного кода в locallib.pl, после этого есть подопределения, и locallib.pl является библиотекой, а не программным файлом, поэтому это последний оператор должен возвращает true. , простой оператор 1; в конце библиотеки гарантирует, что (я поставил его после подопределений, чтобы гарантировать, что noobody пишет код в main после 1;) и проблема было исправлено.
Не знаю, почему в CLI с этим не было проблем ...
Может быть, сейчас я получу много отрицательных голосов (будьте нежны :)), но что я могу сделать ... и я надеюсь, что некоторые новички прочтут это и узнают что-то из моей ошибки.
Спасибо всем за помощь.