Leser: 26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
sub add_to_db { my ($record, $dbh) = @_; my ($foo, $bar, $baz) = @$record; my $sth = $dbh->prepare( qq| INSERT INTO DBtable ( foo, bar, baz ) VALUES (?,?,?) |) or die $dbh->errstr(); $sth->execute( $foo, $bar, $baz ) or die $dbh->errstr(); $sth->finish; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
sub mysql_connect { my %attr = ( PrintError => 0, RaiseError => 0, ); my $dbh = DBI->connect( qq|DBI:mysql:mysql_compression=1: $db_string: $db_server: $db_port|, $db_user, $db_password, \%attr ) or die "Error<br />$DBI::errstr<br />"; $dbh; }
2010-04-22T15:31:19 biancaWie sieht der Aufruf für die sub mysql_connect aus?
2010-04-22T15:34:36 pqwoher kommt denn $db_string, $db_server etc.?
2010-04-22T15:34:36 pqund dass man den dsn mit newlines dazwischen schreiben kann, wusste ich auch noch nicht. evtl. ist das der fehler?
2010-04-22T15:48:39 EscapeMach ich immer so - und es funktioniert ja auch.
$sth = $dbh->prepare(...)
liefert keinen Fehler - also sollte $dbh gültig sein
2010-04-22T15:53:48 pq2010-04-22T15:48:39 EscapeMach ich immer so - und es funktioniert ja auch.
$sth = $dbh->prepare(...)
liefert keinen Fehler - also sollte $dbh gültig sein
gut, wenn du meinst.
2010-04-22T15:55:53 EscapeTolle Antwort :-(
2010-04-22T15:48:39 EscapeMach ich immer so - und es funktioniert ja auch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#! /usr/bin/perl use strict; use warnings; use DBI; my %dbargs = ( PrintError => 0, ); # mit Umbruch und Leerzeichen my $dsn1 = qq|DBI:mysql: database=pl_test: host=localhost: port=3306|; # mit nur 1 Leerzeichen (my $dsn2 = $dsn1 ) =~ s/\n[\t ]*/ /mg; # ohne Umbruch oder Leerzeichen (my $dsn3 = $dsn1 ) =~ s/\n[\t ]*//mg; # teste alle Varianten for my $dsn ( $dsn1, $dsn2, $dsn3 ) { print "--8<--\n$dsn\n--8<--\n"; if ( my $dbh = DBI->connect( $dsn, 'user', '', \%dbargs ) ) { if ( $dbh->do( q'SELECT * FROM foo' ) ) { print "do executed.\n"; } else { warn "do failed: ", $dbh->errstr, "\n"; } $dbh->disconnect; } else { warn "connect failed: ", DBI->errstr, "\n"; next; } } __END__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
:!perl /tmp/t.pl
--8<--
DBI:mysql:
database=pl_test:
host=localhost:
port=3306
--8<--
do failed: No database selected
--8<--
DBI:mysql: database=pl_test: host=localhost: port=3306
--8<--
do failed: No database selected
--8<--
DBI:mysql:database=pl_test:host=localhost:port=3306
--8<--
do executed.
$dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
1
2
3
4
perl -MDBI -wle 'my $dbh = DBI->connect("DBI:SQLite:\ndbname=data.db",'','') or die "aua"; $dbh->do("SELECT * FROM db_entries");'
DBI connect('
dbname=data.db','',...) failed: unable to open database file at -e line 1
aua at -e line 1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub mysql_connect {
my %attr = (
PrintError => 0,
RaiseError => 0,
);
my $dbh = DBI->connect(
qq|DBI:mysql:mysql_compression=1
:$db_name
:$db_server
:$db_port|,
$db_user,
$db_password,
\%attr
) or die "Error<br />DBI->errstr<br />";
$dbh;
}
2010-04-23T12:23:52 pqna hauptsache du kannst deine newlines weiter verwenden, gell.
2010-04-23T12:23:52 pqbei mir schlägt der connect übrigens so fehl, ich vermute, die anweisung host=... wird ignoriert.
2010-04-23T12:23:52 pqenthält $db_server bei dir was anderes als den default?
2010-04-23T12:23:52 pqwenn ich das hier schreibe:
"dbi:mysql:mysql_compression=1\n:database=foo\n:host=127.0.0.1:port=3307"
kriege ich als fehlermeldung:
"Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'"
2010-04-23T12:23:52 pqkomisch, gell, dass der da von einem socket redet, wo ich doch host und port angegeben habe...
2010-04-23T12:23:52 pqkönnte mir vorstellen, dass deine newlines in die hose gehen, sobald du nen anderen dbhost verwenden musst.
2010-04-23T12:23:52 pqaber jetzt auf die newlines zu verzichten wäre ja ein nicht akzebtables eingeständnis ;-)
1
2
3
4
5
my $db_name = 'the_database';
my $db_server = 'localhost';
my $db_port = '3306';
my $db_user = 'justMe';
my $db_password = '123456';
2010-04-23T13:44:10 EscapeWenn Du in der DNS den Doppelpunkt verwendest, dann müssen die Anweisungen
database=
host=
port=
wegfallen.
Quote2010-04-23T12:23:52 pqwenn ich das hier schreibe:
"dbi:mysql:mysql_compression=1\n:database=foo\n:host=127.0.0.1:port=3307"
kriege ich als fehlermeldung:
"Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'"
Ist auch nicht anders zu erwarten - gelle ...
QuoteDas ist nicht komisch sondern logisch - jedenfalls bei Deinem Connection-String
QuoteNa na ...
jetzt einzugestehen dass es auch mit newlines geht, wäre wohl für Dich nicht akzeptabel - oder? ;-)
2010-04-23T13:54:46 pq2010-04-23T13:44:10 EscapeWenn Du in der DNS den Doppelpunkt verwendest, dann müssen die Anweisungen
database=
host=
port=
wegfallen.
hihi. jetzt widersprichst du dir selbst.
du verwendest newlines, aber dein ursprüngliches post beinhaltete die frage, warum keine datenbank selektiert wurde,. na wie soll denn eine datenbank selektiert werden, wenn "die Anweisungen database, ... wegfallen müssen"?
versteh ich nicht.
2010-04-23T12:23:52 pqfreu dich dann, wenn du das script in ein paar monaten mal woanders deployst und plötzlich einen anderen host verwenden musst und dann erstmal auf fehlersuche gehen musst.
2010-04-23T14:06:56 EscapeWenn der Doppelpunkt verwendet wird, dann schreibt man nicht (z.B)
databese=$db_name
host=$db_host
sondern lediglich
:$db_name
:$db_host
Jetzt verstanden?
2010-04-23T14:06:56 EscapeUnsinn!
$db_host = '127.0.0.1' funktioniert auch einwandfrei (schrieb ich bereits)
2010-04-23T14:26:28 pqvorschlag: schreib dochmal statt 127.0.0.1 "kaiser.von.china" rein. wenn das auch noch so einwandfrei geht, würde ich mir gedanken machen =)
2010-04-23T16:33:06 pqwarum nicht kaiser.von.china?
sicher, dass du auf der richtigen datenbank landest?
2010-04-23T16:33:06 pq(hast du DBI_TRACE gesetzt, wie vorgeschlagen?)
1
2
3
4
5
6
$ perl -wle'
use DBI;
my $dbh = DBI->connect(
"dbi:mysql:mysql_compression=1\n:database=battie_test\n:host=kaiser.von.china:port=3306",
"foo", "foo");'
$
1
2
3
4
5
6
$ perl -wle'
use DBI;
my $dbh = DBI->connect(
"dbi:mysql:mysql_compression=1\n:battie_test\n:kaiser.von.china:port=3306",
"foo", "foo");'
$
1
2
3
4
5
6
7
8
$ perl -wle'
use DBI;
my $dbh = DBI->connect(
"dbi:mysql:mysql_compression=1:battie_test:kaiser.von.china:port=3306",
"foo", "foo");'
DBI connect('mysql_compression=1:battie_test:kaiser.von.china:port=3306','foo',...)
failed: Unknown MySQL server host 'kaiser.von.china' (1) at -e line 3
$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ perl /tmp/db.pl
--8<--
DBI:mysql:database=pl_test:host=kaiser.von.china:port=3307
--8<--
connect failed: Unknown MySQL server host 'kaiser.von.china' (1)
--8<--
DBI:mysql:mysql_compression=1
:pl_test
:kaiser.von.china
:3307
--8<--
do executed.
1
2
3
4
5
6
7
8
19:00:53 :~$ netstat -ant|grep 330
tcp 0 0 1.1.1.100:3307 0.0.0.0:* LISTEN
tcp 0 0 1.1.1.100:48208 1.1.1.100:3307 VERBUNDEN
tcp 0 0 1.1.1.100:3307 1.1.1.100:48208 VERBUNDEN
19:00:59 :~$ netstat -ant|grep 330
tcp 0 0 1.1.1.100:3307 0.0.0.0:* LISTEN
tcp 0 0 1.1.1.100:3307 1.1.1.100:48208 TIME_WAIT
19:01:02 :~$
Guest Escape2010-04-23T16:33:06 pqwarum nicht kaiser.von.china?
sicher, dass du auf der richtigen datenbank landest?
ja - absolut sicher
1
2
3
4
5
my $db_name = 'the_database';
my $db_server = '127.0.0.1',
my $db_port = '3306';
my $db_user = 'justMe';
my $db_password = '123456';
1
2
3
$dsn = "DBI:mysql:$database";
$dsn = "DBI:mysql:database=$database;host=$hostname";
$dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
2010-04-24T15:12:20 pqdie Initialen 'pq' bitte nicht phonetisch aussprechen.an alle, die diesen thread hier lesen:
2010-04-24T15:12:20 pqNa denn nicht - trotz Beweis des Gegenteils.newlines im dsn sind weder dokumentiert noch funktionieren sie wie gewünscht (DBD::mysql 4.013, DBI 1.609).