Perl DBI MySQL

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

Perl DBI MySQL

Сообщение IMB »

Доброго дня!
Начал изучать Perl и необходимо получать данные из базы MySQL, использую perl 5.10.00 и mysql 5.0.51a, все установлено из репозиториев.

Код: Выделить всё

my @drivers = DBI->available_drivers;
print " Доступны следующие драйверы :\n" . join("\n",@drivers);

Дает следующий вывод: Доступны следующие драйверы : DBM ExampleP File Gofer Proxy Sponge mysql.
Из чего я заключаю, что драйвер для MySQL доступен.

Код по получению данных:

Код: Выделить всё

use DBI;
my $dbtype = 'mysql';
my $dbhost = 'localhost';
my $dbname = 'data';
my $dbuser = 'user';
my $dbpasswd = 'passwd';

my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd,) or die('Error connecting to database');
my $sth = $dbh->prepare("SELECT id FROM zakaz WHERE number = '$n' AND YEAR(in_date) = '$y' AND MONTH(in_date) = '$m'");
$sth->execute();
while (my @row = $sth->fetchrow_array) { print qw/$row[0]/;}
$sth->finish();
$dbh->disconect;

Результат нулевой, на экран ничего не выводится. Страно еще то, что при выключенном сервере MySQL я не получаю ожидаемой ошибки коннекта.
При добавлении в код print $dbh, $sth при выключенном сервере ничего не выводится, при включенном - DBI::db=HASH(0x9661838)DBI::st=HASH(0x9661a68).

В чем проблема?
Спасибо.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Perl DBI MySQL

Сообщение diesel »

my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd,) or die('Error connecting to database');
можно записать как
my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd,{RaiseError => 1}) ;

или как-то вот так все вместе:

Код: Выделить всё

sub dbinit {

    my $dbname="имя базы";
    my $dbhost="хост";
    my $dbport="порт";
    my $dbsocket="";
    my $dbuser="юзер";
    my $dbpass="пароль";

    my $dsn = "DBI:mysql:$dbname";
    $dsn .= ";host=$dbhost" if $dbhost;
    $dsn .= ";port=$dbport" if $dbport;
    $dsn .= ";mysql_socket=$dbsocket" if $dbsocket;
    $dsn .= ";mysql_read_default_group=client";

    my $dbh = DBI->connect($dsn, $dbuser, $dbpass,{ RaiseError => 1, PrintError => 0 });
        return $dbh;
}
my $dbh = &dbinit;
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl DBI MySQL

Сообщение IMB »

Без изменений, пробовал с RaiseError.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Perl DBI MySQL

Сообщение diesel »

Вот ваш код, немного измененный, чтобы его можно было запускать:

Код: Выделить всё

diesel@debian:~$ cat test.pl
#!/usr/bin/perl
use strict;
use warnings;

use DBI;
my $dbtype = 'mysql';
my $dbhost = 'localhost';
my $dbname = 'mysql';
my $dbuser = 'root';
my $dbpasswd = '';

my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd,) or die('Error connecting to database');
my $sth = $dbh->prepare("select User from user;");
$sth->execute();
while (my @row = $sth->fetchrow_array) { print "$row[0] \n";}
$sth->finish();
$dbh->disconnect;


Код: Выделить всё

diesel@debian:~$ ./test.pl
diesel
root
debian-sys-maint
joomla1897423
phpbb
proftpd
root
tt_rss
upa
diesel@debian:~$ sudo /etc/init.d/mysql stop
Stopping MySQL database server: mysqld.
diesel@debian:~$ ./test.pl
DBI connect('mysql','root',...) failed: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) at ./test.pl line 12
Error connecting to database at ./test.pl line 12.
diesel@debian:~$ sudo /etc/init.d/mysql start
Starting MySQL database server: mysqld.
Checking for corrupt, not cleanly closed and upgrade needing tables..
diesel@debian:~$ ./test.pl
diesel
root
debian-sys-maint
joomla1897423
phpbb
proftpd
root
tt_rss
upa


вроде работает.

ЗЫ: чтобы видеть только:

Код: Выделить всё

diesel@debian:~$ ./test.pl
Error connecting to database at ./test.pl line 12.


Код: Выделить всё

my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd,{RaiseError=>0, PrintError=>0}) or die('Error connecting to database');
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl DBI MySQL

Сообщение IMB »

Да, есть такое дело. При запуске в консоли тоже выводит DBI connect('remont','sqlremont',...) failed: Can't connect ...
Но возникает вопрос - почему не выводится сообщение заданное через die()?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Perl DBI MySQL

Сообщение diesel »

IMB писал(а):
16.08.2009 15:41
Да, есть такое дело. При запуске в консоли тоже выводит DBI connect('remont','sqlremont',...) failed: Can't connect ...
Но возникает вопрос - почему не выводится сообщение заданное через die()?

потому что оно умирает раньше, чтобы умирало вовремя надо выключить RaiseError, а чтобы не печатало ничего лишнего PrintError - см. конец моего прошлого поста, а так же описания этих аттрибутов в perldoc DBI.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl DBI MySQL

Сообщение IMB »

Спасибо, буду разбираться.
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Perl DBI MySQL

Сообщение pcodr »

А вот так можно узнать точное сообщение ошибки:

Код: Выделить всё

my $dbh = DBI->connect("DBI:$dbtype:$dbname", $dbuser, $dbpasswd) or die($DBI::errstr);
remote system type is unix
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl DBI MySQL

Сообщение IMB »

Спасибо, с этим я вроде разоборался. Неудобство вызывает то, что вывод die(), в отличие от php или у меня не тот радиус кривизны рук, не выводится в web. В error.log я его вижу, а на страницу не выводится. Но это я решил через проверку переменной и print().
Правда не исключаю, что вся проблема в моих знаниях Perl, это мой первый опыт писать на нем и надо привыкнуть к разнице с php ;)
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Perl DBI MySQL

Сообщение pcodr »

Для вывода ошибок в браузер если вы запускаете скрипты как CGI (с mod_perl не работал, поэтому как там не знаю) достаточно следующего:

Код: Выделить всё

use CGI::Carp qw(fatalsToBrowser);
remote system type is unix
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Perl DBI MySQL

Сообщение IMB »

Спасибо, это я тоже видел и пробовал. Но в этом случае выдается "ненужная" информация. Можно поиграться еще с set_message, но мне показался более универсальным и управляемым вариант с print().
Спасибо сказали: