PERL: missing DB parameter to Connect

bitmuncher

Senior-Nerd
Die Meldung aus dem Thread-Titel nervt mich gerade etwas. Also... ich habe eine Funktion:

Code:
sub db_connect 
{
        my $db_conn = DBIx::DWIW->Connect(DB => $db_name,
                                      User => $db_user,
                                      Pass => $db_pass,
                                      Host => $db_host);
	return $db_conn;
}

Die Parameter $db_name, $db_user etc. kommen aus einer Datei 'config.pl', die mittels

Code:
require "config.pl";

eingebunden ist. Darin sind sie wie folgt definiert:

Code:
our $db_server = 'localhost';
our $db_user = 'meinuser';
our $db_pass = 'meinpass';
our $db_name = 'meinedb';

Trotzdem erhalte ich immer die Meldung "missing DB parameter to Connect". Lasse ich mir mittels - print "DB: ".$db_name."\n"; - mal die DB ausgeben, scheint die Variable tatsächlich leer zu sein. Was mache ich also falsch? Komischerweise funktioniert dieses Konstrukt in einem ähnlichen Tool problemlos.
 
Hm sind die Vars den in der Sub noch gültig?

Includereihenfogle?
 
@mime: Das spielt bei localhost glücklicherweise keine Rolle, da dann per Default eh eine Verbindung über die Socket-Datei aufgebaut wird, wenn kein DB-Server angegeben wird. Aber danke für den Hinweis. :)

@csde_rats: Soweit ich das verstehe, sind sie ja global in der ganzen Datei inkludiert, sollten also auch in der sub noch gültig sein.
 
Wenn die Methode zum einlesen der Daten nicht so relevant ist,
könntest Du ja mal folgendes testen.

test.pl
Code:
#!/usr/bin/perl -T
use strict;
use warnings;

require '/var/www/cgi-bin/test/test.cfg'; # Absoluten Pfad zur .cfg Datei anpassen
my %conf = database();

my $db_name = $conf{'db_server'};
my $db_user = $conf{'db_user'};
my $db_pass = $conf{'db_pass'};
my $db_host = $conf{'db_name'};

## Und weiter gehts mit dem Programm ...
test.cfg
Code:
sub database {
my %conf;
   
# Database_data
$conf{'db_server'} = 'localhost';
$conf{'db_user'} = 'meinuser';
$conf{'db_pass'} = 'meinpass';
$conf{'db_name'} = 'meinedb';

return %conf;
}

1;
LG, -umbrella
 
Der Weg scheint eine gute Idee. Habe jetzt in der config.pl einfach die folgende Funktion:

Code:
sub db_data
{
    my %dbconf = ();
    $dbconf{'db_server'} = 'localhost';
    $dbconf{'db_user'} = 'user';
    $dbconf{'db_pass'} = 'pass';
    $dbconf{'db_name'} = 'vtg';
    return %dbconf;
}

Und kann damit die DB-Verbindung wie folgt aufbauen:

Code:
sub db_connect 
{
    my %dbconf = &db_data();
    my $db_conn = DBIx::DWIW->Connect(DB => $dbconf{'db_name'},
                                      User => $dbconf{'db_user'},
                                      Pass => $dbconf{'db_pass'},
                                      Host => $dbconf{'db_server'});
    return $db_conn;
}

Vielen Dank. :)
 
@mime: Das spielt bei localhost glücklicherweise keine Rolle, da dann per Default eh eine Verbindung über die Socket-Datei aufgebaut wird, wenn kein DB-Server angegeben wird.
Es ging mir nicht um den Hostnamen. Es ging mir um den Namen der Variablen in der der Hostname stehen soll.

Du hast in config.pl:

Code:
our[B] $db_server[/B] = 'localhost';
Benutzt dann aber:

Code:
my $db_conn = DBIx::DWIW->Connect(
DB => $db_name,
User => $db_user,
Pass => $db_pass,
Host =>[B] $db_host[/B]);
Jetzt darfst du dich über ein herzliches "missing DB parameter to Connect" nicht wirklich wundern, denn $db_host ist nirgendwo definiert.

<EDIT>

Ok, Doku und Posting aufmerksam lesen hilft. Du hast recht. Wenn HOST undef ist wird automatisch eine Socket Verbindung hergestellt. Die Fehlermeldung sagt tatsächlich auch eindeutig, dass der Parameter "DB" nicht gesetzt ist.
Kann man unter http://kobesearch.cpan.org/htdocs/DBIx-DWIW/DBIx/DWIW.pm.html auch gut sehen.

Hätte also eigentlich klappen sollen...

</EDIT>

Das wäre nicht passiert, wenn du "use strict;" benutzen würdest. Das ist sowieso dringend angeraten.

Für Konfigurationen bietet sich z.B. http://search.cpan.org/~sherzodr/Config-Simple-4.59/Simple.pm an.

db.cfg
Code:
[DB]
db_host    = "localhost"
db_user    = "username"
db_pass    = "password"
db_database= "database"
Code:
#!/usr/bin/env perl

use strict;
use warnings;

use Config::Simple;

my $cfg = new Config::Simple('db.cfg');

my $db_host     = $cfg->param('DB.db_host');
my $db_user     = $cfg->param('DB.db_user');
my $db_pass     = $cfg->param('DB.db_pass');
my $database    = $cfg->param('DB.db_database')

sub db_connect 
{
     my $db_conn = DBIx::DWIW->Connect(DB => $database,
                                      User => $db_user,
                                      Pass => $db_pass ,
                                      Host => $db_host);
    return $db_conn;
}
Micha
 
Zuletzt bearbeitet:
Zurück
Oben