Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > DBM- файлы. Почему не работают?


Автор: rcdimon 9.9.2004, 15:50
Здравствуйте. Я пишу что то типа сайта знакомств. И хочу статистику по сайту и анкетам хранить в DBM- файлах. Но почему то, когда я связываю хеш с файлом интерпретатор завершается виндой с ошибкой и предложением рассказать об этом microsoft. Почем? Ведь раньше у меня все работало! Я взял старый пример и он уже не заработал. Я пользуюсь локальным сервером denver

Автор: chaos 10.9.2004, 09:33
а файл большой??

Автор: korob2001 10.9.2004, 12:42
Как ты связываешь хеш с DBM файлом? Покажи часть кода.

Автор: rcdimon 11.9.2004, 08:28
Файл пустой. Его даже нет. Но ведь он должен создать его сам, по крайней мере он так делает в нормальном перле, а на сервере нет.

Вот кодец.
Код

#!/usr/bin/perl
use CGI qw(:all);

print header;


dbmopen(%a, "l/text",0644)|| die "ERROR!!!";

$s = param('login');

print $a{$s};

Автор: Secandr 11.9.2004, 10:54
А права на создание файла в каталоге есть?

Автор: korob2001 11.9.2004, 13:46
А каталог l/ существует?
Пробуй всю эту бодягу сохранить в файл ( имя придумай сам ). Изапусти его на своём сервере. Затем введи несколько разных имён и фамилий. После жми на ссылку "Показать данные".
Результат выполнения программы напиши сюда.

Вот код:
Код

#!/usr/bin/perl -w
use strict;
use CGI;
use CGI::Carp qw( fatalsToBrowser );
my $cgi = new CGI;
my $file = 'data_base';

# Подпрограмма выводит форму
sub showForm {
   my $mess = shift || $cgi->font( { -color => "#aa0000" },
                                   "Ваши данные успешно добавлены" );
   print $cgi->start_html( -title => 'Test' ),
         $cgi->h2("Заполнение формы"),
         $cgi->br(),
         $cgi->b( $mess ),
         $cgi->br(),
         $cgi->start_form(),
         $cgi->b("Ваше имя: "),
         $cgi->textfield( -size => 15,
                          -name => 'name' ),
         $cgi->br(),
         $cgi->b("Фамилия: "),
         $cgi->textfield( -size => 15,
                          -name => 'family' ),
         $cgi->br(),
         $cgi->submit( -name => 'send',
                       -value => 'Send' ),
         $cgi->end_form(),
         $cgi->hr(),
         $cgi->a( { -href => "$ENV{ SCRIPT_NAME }?send=Show" },
                  "Показать данные" ),
         $cgi->end_html();
}

# Подпрограмма записывает данные в DBM файл
sub addToDBM {
   my $name = shift;
   my $family = shift;
   my %base = ();
   my $file = $file || 'data_base';
   my $time = time;
   dbmopen( %base, $file, 0644 ) or die $!;
   while ( 1 ) {
           if ( exists $base{ $time } ) {
                ++$time;
                next;
           } else {
                $base{ $time } = "$name|$family";
                last;
           }
   }
   dbmclose( %base );
}

# Подпрограмма вывод данные из DBM файла
sub showData {
   my %base = ();
   my $file = $file || 'data_base';
   print $cgi->start_html(),
         $cgi->h2("Данные из DBM файла: "),
         $cgi->br();

   dbmopen( %base, $file, 0644 ) or die $!;
    while ( my( $key, $val ) = each( %base ) ) {
            my( $name, $family ) = split(/\|/, $val);
            print $cgi->b("Имя: "),
                  $cgi->i( $name ),
                  $cgi->br(),
                  $cgi->b("Фамилия: "),
                  $cgi->i( $family ),
                  $cgi->br(),
                  $cgi->b("Добавлено: "),
                  $cgi->i( scalar( localtime( $key ) ) ),
                  $cgi->hr();
   }
   dbmclose( %base );
   print $cgi->a( { -href => "$ENV{ SCRIPT_NAME }" },
                             "Вернуться к форме" ),
         $cgi->end_html();
}

# Выводим заголовок
print $cgi->header( -charset => 'Windows-1251' );

# Проверяем параметры
if ( $cgi->param('send') eq 'Send' ) {
    addToDBM( $cgi->param('name'), $cgi->param('family') );
    showForm();
} elsif ( $cgi->param('send') eq 'Show' ) {
    showData();
} else {
    showForm("Заполните следующие поля и нажмите кнопку Send");
}


Удачи

Автор: rcdimon 11.9.2004, 16:25
Ой, все это так сложно. Я лучше сделаю текстовый файл и буду вводить его построчно а потом делить на отдельные параметры или данные. smile.gif ??? Как вы считаете?

Автор: Secandr 11.9.2004, 16:49
rcdimon
смотря какая задача

Автор: korob2001 11.9.2004, 16:53
Я не хотел вас напугать. Это из-за модуля CGI программа кажется такой запутанной, но это только так кажется на первый взгляд.

Цитата

Я лучше сделаю текстовый файл и буду вводить его построчно а потом делить на отдельные параметры или данные.

Дело твоё, но с DBM файлами работать намного удобнее чем с текстовыми. Если этого никогда не попробовать, то так никогда и не научишся их использовать.

У тебя работает пример приведённый ранее?

Автор: ElectricalStorm 13.9.2004, 14:06
вот так попробуйте
Код


use DB_File;             # load database module

tie %HASH, "DB_File", $FILENAME                # open database to be accessed
   or die "Can't open $FILENAME:$!\n";        # through %HASH

$V = $HASH{$KEY};                              # retrieve from database
$HASH{$KEY} = $VALUE;                          # put value into database

if (exists $HASH{$KEY}) {                      # check whether in database
   # ...
}
delete $HASH{$KEY};                            # delete from database
untie %HASH;                                   # close the database


Автор: rcdimon 14.9.2004, 15:41
Я скачал обновление для своего локального сервера Denver и хеши заработали! Но зато стал мне генерировать страницы, в хоторый браузер устанавливает вьетнамскую кодеровку! И само собой, пока не поставишь на советскую все будет в весьма не читабельном виде smile.gif Что же теперь делать с кодировкой? Я пвтался сделать так, что бы он печатал строку

Код

<META http-equiv=Content-Type content="text/html; charset=windows-1251">


Но эта строка ни на что не повлияла!

Что же делать? Я использую модуль CGI и использую

print header;

Может что то в нем не так?

Автор: korob2001 14.9.2004, 17:24
Цитата

Что же делать? Я использую модуль CGI и использую

print header;

Может что то в нем не так?

Попробуй так:
Код

print header( -charset => 'Windows-1251' );

Удачи.

Автор: Guest 17.9.2004, 13:38
спасибо попробую, когда попробую напишу как получилось. я сейчас просто не за тем компом

Автор: ElectricalStorm 20.9.2004, 21:27
rcdimon я конечно очень уважаю Д.Котерова за его труд... но бросьте вы этот Денвер кроме вреда от него нету ничего ... делайте все сами настраивайте копайтесь, разбирайтесь - это ИМХО полезнее для настоящей работы ....

Автор: GoodBoy 21.9.2004, 11:43
Апачь - рулит!!!! Зачем париться с тем, чего в вебе у провайдеров все-равно не найдешь???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)