[DBI->mySQL] Anfügen eines Datensatzes

Hi,

wenn ich in meiner sqlTabelle ein Feld mit autoicrement belegt habe und füge einen Datensatz mit DBI an, wie kann ich herausfinden, welche Zahl bei dem Feld mit dem autoincrement übernommen wurde?
Gibt mir DBI das irgendwie zurück?

gruss,
Martin

Tag auch,

wenn ich in meiner sqlTabelle ein Feld mit autoicrement belegt
habe und füge einen Datensatz mit DBI an, wie kann ich
herausfinden, welche Zahl bei dem Feld mit dem autoincrement
übernommen wurde?
Gibt mir DBI das irgendwie zurück?

Autoincrement ist eine datenbankspezifische Funktion, hat
also nichts mit DBI sondern mit dem DBD-Treiber für
mysql zu tun. Die mysql-Doku
(http://www.mysql.com/doc/P/e/Perl_DBI_Class.html)
sagt dazu:

MySQL-specific Methods 

The methods shown below are MySQL-specific and not part of the
DBI standard.

insertid 
 If you use the AUTO\_INCREMENT feature of MySQL, the new
 auto-incremented values will be stored here. Example: 

 $new\_id = $sth-\>{insertid};

 As an alternative, you can use $dbh-\>{'mysql\_insertid'}. 

Gruss,
-Andreas.

ich bekomms ned hin :frowning:
hi,

kann machen was ich will … diese Variable bleibt immer leer :frowning:

habe das wie folgt eingebaut:

my $db = DBI-\>connect($\_sqlServer,$\_sqlUser,$\_sqlPass);
my $query = $db-\>prepare("INSERT INTO tabelle ($fields) VALUES ($values)");
$new\_id = $sth-\>{insertid};
$query-\>execute;
$db-\>disconnect;
print $new\_id;

ist aber immer leer die Variable … ich habe den

$new\_id = $sth-\>{insertid};

auch schon mal nach dem Aufruf von

$query-\>execute;

gesetzt. Gleiches Ergebnis…
Wo ist mein Fehler? *verzweifel*

Gruss,
Martin

Hi Martin,

kann machen was ich will … diese Variable bleibt immer leer

habe das wie folgt eingebaut:

> my $db = DBI-\>connect($\_sqlServer,$\_sqlUser,$\_sqlPass);  
> my $query = $db-\>prepare("INSERT INTO tabelle ($fields)  
> VALUES ($values)");  
> $new\_id = $sth-\>{insertid};  
> $query-\>execute;  
> $db-\>disconnect;  
> print $new\_id;

Wo ist mein Fehler? *verzweifel*

Nun, die neue insert-ID bekommst Du natürich erst nach
der INSERT-Anweisung und wo Dein Fehler liegt, wird Dir
Perl schon sagen, Du musst dazu die Fehlermeldungen abfragen:

my $db = DBI-\>connect($\_sqlServer,$\_sqlUser,$\_sqlPass) or die $DBI::errstr;
my $query = $db-\>prepare("INSERT INTO tabelle ($fields)
VALUES ($values)") or die $DBI::errstr;
$query-\>execute or die $DBI::errstr;
my $new\_id = $sth-\>{insertid} or die $DBI::errstr;
$db-\>disconnect or die $DBI::errstr;
print $new\_id;

Die Fehlermeldungen werden auch automatisch ausgegeben mit
folgender connect-Zeile:

$dbh = DBI-\>connect("$db\_server", "$db\_user", "$db\_passwort",
{RaiseError =\> 1}) || die "Keine Verbindung: $DBI::errstr\n"; 

Gruss,
-Andreas.

Hi,

danke für den Tipp. Aber wie ich schon befürchtete, kein Ergebnis :frowning:

nochmal im deteil, wie ich die Sache in Perl aufrufe

# Verbindung zum MySQL Server
my $dbh = DBI-\>connect("$\_sqlServer", "$\_sqlUser", "$\_sqlPass",{RaiseError =\> 1}) || die "Keine Verbindung: $DBI::errstr\n"; 
# Senden der Daten
my $query = $dbh-\>prepare("INSERT INTO mca\_clans (clanname) VALUES ('blah')");
$query-\>execute;
my $new\_id = $sth-\>{insertid};

$dbh-\>disconnect;

print "id = $new\_id";

Und hier das Ergebnis, das ich bekomme:

id = 

das ist alles … nämlich nix … absolut nix :frowning:
Ich spring gleich aus dem Fenster … das sind Stellen in der PERL Programmierung, die ich hasse … es müsste funktionieren, aber nix :frowning:
ich habe hier MySQL 3.22.32 nur die DBI Version weiss ich nicht, wie ich die herausfinden kann …
Was mach ich nur falsch :frowning: vielleicht eine inkompatibilität?

gruss
Martin

ps: Die Daten werden übrings erfolgreich in der Datanbank aufgenommen … Das auto_increment tut seinen Job ganz normal und erhöht den Wert … also von der Hinsicht funktioniert alles …

Woher will die Datanbank eigendlich wissen, was mit my $new_id = $sth->{insertid}; gemeint ist? Ich meine, ich könnte doch theoretisch mehrere auto_increment werte haben oder? Woher will man denn wissen, welche ich da jetzt haben will?

So, ich habe jetzt eine etwas umständliche aber funktionierende Lösung gefunden …

# Verbindung zum MySQL Server
my $dbh = DBI-\>connect("$\_sqlServer", "$\_sqlUser", "$\_sqlPass",{RaiseError =\> 1}) || die "Keine Verbindung: $DBI::errstr\n"; 

# Senden der Daten
my $query = $dbh-\>prepare("INSERT INTO tabelle ($fields) VALUES ($values)");
$query-\>execute;

my $query = $dbh-\>prepare("SELECT id FROM tabelle WHERE id=LAST\_INSERT\_ID()");
$query-\>execute;
my $newid = $query-\>fetchrow;

$dbh-\>disconnect;

so funktioniert es … umständlich, aber geht :smile:

gruss,
Martin

Aber wie ich schon befürchtete, kein Ergebnis :frowning:

Mit dieser negativen Einstellung ist es kein
Wunder das es schiefgeht, Stichwort „selbsterfüllende
Prophezeiungen“, also immer optimistisch bleiben …

nochmal im deteil, wie ich die Sache in Perl aufrufe

Verbindung zum MySQL Server

my $dbh = DBI->connect("$_sqlServer", „$_sqlUser“,
„$_sqlPass“,{RaiseError => 1}) || die „Keine Verbindung:
$DBI::errstr\n“;

Senden der Daten

my $query = $dbh->prepare(„INSERT INTO mca_clans (clanname) VALUES (‚blah‘)“);
$query->execute;
my $new_id = $sth->{insertid};

-> statt $sth musst Du für Dein Beipiel auch $query
schreiben, dann klappt das ganze auch.

$dbh->disconnect;
Was mach ich nur falsch :frowning: vielleicht eine inkompatibilität?

Du benutzt kein „use strict“ am Anfang Deines Perl-Programms
und rufst es nicht mit dem Warnschalter „-w“ auf. Dadurch
werden automatisch Variablen ins Leben gerufen, die es
gar nicht geben dürfte …

Gruss,
-Andreas.

1 Like