Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Несколько вопросов по Perl


Автор: cosamia 6.6.2005, 05:15
Не подскажите, как в перле работать с веб сервисами?

И также еще несколько вопросов:

1) есть ли в перле обработка исключений ?
например на jsp я могу сделать так:
<%@ page errorPage="jsp1_error.jsp" %>
у C# : try-catch-finally
у других языков другие примочки.
а как на перле?

2) попытался обработать подключение к БД следующим образом:

$dbh=DBI->connect(...)||die "Can not connect";
Для проверки ввожу неправильный пароль и естественно подключения нет, но сообщение об этом не пишется. Почему?

3)вопрос по сессиям. в вышеуказаном примере используется mySQL для хранения сессий:
tie %session, 'Apache::Session::MySQL'

А если у меня база Oracle или MS SQL, достаточно ли будет написать:
tie %session, 'Apache::Session::Oracle'
tie %session, 'Apache::Session::MSSQL'
или для каждой базы это делается по разному?

Автор: chaos 6.6.2005, 06:37
ответ на 1 вопрос: для этого есть eval

Автор: cosamia 6.6.2005, 08:32
вопрос на ответ на 1й вопрос%
eval что?
пример кода можно?

Автор: korob2001 6.6.2005, 20:22
1.) Про eval читай тута: http://forum.vingrad.ru/index.php?showtopic=8681

2.) Потому что ошибка происходит не в Perl а в MySQL, для того, что бы получить эту ошибку, при подключении нужно Попробуй написать так:
Код

my $host = "localhost";
my $base = "mydb";
my $log = "твой логин";
my $pass = "твой пароль";
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass,
                           { PrintError => 0, RaiseError => 1 } ) or die "Error: $DBI::errstr\n";

# Здесь делай что-то с подключением

$dbh->disconnect();


3. Достаточно, если конечно у тебя установлены эти модули. А вообще этот вопрос можно было и не задавать, достаточно было попробовать. Если рабоать не будет, тогда устанавливай модули Apache::Session::Oracle и Apache::Session::MSSQL и будет тебе счастье.

Удачи.

Автор: cosamia 7.6.2005, 06:24
2) не работает так как ты редлагаешь:
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass,
{ PrintError => 0, RaiseError => 1 } ) or die "Error: $DBI::errstr\n";



в случае не правильного пароля не выводится никакой ошибки!

Я попробовал еще сделать так:

use CGI::Carp qw(fatalsToBrowser))
$dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass,
{ PrintError => 1, RaiseError => 0 } )

Но в этом случае выдается такое сообщение:
Software error: Can't call method "prepare" on an undefined value at /home... line ##
For help, please send mail to the webmaster (you@yourhost.com), giving this error message and the time and date of the error.


неужели никто из перл гуру никогда не проверяет коннект? или вы его всегда делаете на основе статического пароля-логина?
Уже 2 дня по форумам спрашиваю и никто не знает.



Добавлено @ 06:30
кстати если AutoCommit => 0 то это ON или OFF ?

Автор: korob2001 7.6.2005, 10:38
Пишу такой код, в котором не верно указан пароль:
Код

#!/usr/bin/perl -w
use strict;
use DBI;
use CGI::Carp qw( fatalsToBrowser );
my $host = "localhost";
my $base = "autocat";
my $log = "root";
my $pass = "dsd";
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass,
                           { PrintError => 1, RaiseError => 1 } ) or die "Error: $DBI::errstr\n";

# Здесь делай что-то с подключением

$dbh->disconnect();

Получаю такую ошибку прямо в браузер:
Цитата
Software error:
DBI connect('host=localhost;database=autocat','root',...) failed: Access denied for user: 'root@localhost' (Using password: YES) at E:\DOCUME~1\POSIX\LOCALS~1\Temp\dzprltmp.pl line 9

For help, please send mail to this site's webmaster, giving this error message and the time and date of the error.

За более подробной информацией обращайся к лог файлу.

Автор: cosamia 7.6.2005, 12:48
У меня так пишется код ошибки. И выводится строка подключения. Но я не хочу чтобы пользоатель все это видел. Как сделать чтобы он видел лишь некоторое мое сообщение?
То что я пишу после die "..." почему то не выводится. выводится только код ошибки и т.д.

Автор: Vaneska 7.6.2005, 15:49
Чтобы в браузер не выводилось сообщение, вместо die "Error: $DBI::errstr\n"
поставь функцию такого типа:

Код

sub Raport(){
  my ($data, $d, $file) = @_;
  local $/;
  
  $d ||= '';
  $file ||= 'default.rap'; # имя файла отчета
  
  if (open (RAPORT, ">>$file") ){
    print RAPORT 'time: '.localtime(time)." |> $data" . "\n";
    close RAPORT;
  }
  
  if ($d ne '') { die "Script error!"; }  
 
}

# изпользуй ее таким образом
my $dbh = DBI->connect("DBI:mysql:host=$host;database=$base", $log, $pass,    
                           { PrintError => 1, RaiseError => 1 } ) or &Raport("Error: $DBI::errstr", "yes");


Функция записывает в файл отчета ошибку и, если указан параметр $d, аварийно завершает программу с выводом строки "Script error!"

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