Perl - MySQL Befehl nicht gültig

Dey

Banned
Registriert
Mai 2005
Beiträge
1.925
my $sql = "INSERT INTO $tablename (Switch, IPAddr, Port, OperStatus, Speed, Adminstatus, Autonegotation, PoE, VLan) VALUES ('$rcHostname1', '$hostname', '$rcPortIndex1', '$ifOperStatus1', '$ifSpeed1', '$ifAdminStatus1', '$rcPortAutoNegotiate1', '$snAgentPoePortControl1', '$rcVlanPortVlanIds1')";
$myquery = $dbh->prepare($sql);
$myquery->execute();

Bei der Ausführung dieses Befehls erhalte ich eine Fehlermeldung, dass der verwendete MySQL Befehl nicht der richtigen Syntax entspricht und deshalb nicht ausgeführt werden kann.

Leider erkenne ich nicht, wo der Fehler liegt. Ich habe in einer vorherigen Version dieses Befehls bereits erfolgreich eine SQL Query ausgeführt, aber dann nach Änderung davon lief es nicht mehr.

Also auf Seiten der Datenbankverbindung etc. gibt es keine Problem. Habt ihr vielleicht eine Ahnung?
 
Lass dir doch $sql mal ausgeben und schau dir an, was drin steht. Außerdem gibt MYSQL auch noch ausführlichere Fehlerbeschreibungen wieder.. Vermutlich hast du eine Zeichenkette nicht escaped oder das Format für einen der Werte stimmt nicht.
 
my $sql = "INSERT INTO $tablename (Switch, IPAddr, Port, OperStatus, Speed, Adminstatus, Autonegotation, PoE, VLan) VALUES ('$rcHostname1', '$hostname', '$rcPortIndex1', '$ifOperStatus1', '$ifSpeed1', '$ifAdminStatus1', '$rcPortAutoNegotiate1', '$snAgentPoePortControl1', '$rcVlanPortVlanIds1')";

Sollte das Semikolon nicht vor dem Anführungszeichen stehen?
 
Nein, eigentlich nicht. Das ";" gehört ja nicht zum SQL-Befehl, sondern sagt der Perl-Umgebung, dass der vorangehende Ausdruck an dieser Stelle endet.

MySQL meldet, dass die Syntax nicht passt und verweist auf meinen String. Wenn ich ihn mir über die print-Methode ausgeben lassen, scheint es für mich, dass er richtig ist.
 
Trotzdem wird doch ein SQL Statement meines Wissens ebenfalls mit einem Semikolon abgeschlossen?
 
Ich hab gerad noch mal in meinen bestehenden Projekten geguckt, weil ich selbst verunsichert war. Dort habe ich es nicht mit einem ; abgeschlossen.
 
@ DivX: Das ist nur dann notwendig, wenn ein weiterer SQL-Befehl folgt.

@Dey: Poste den Befehl mal, vielleicht entdeckt hier jemand einen Fehler.
 
Okay. Der Befehl lautet:

INSERT INTO (Switch, IPAddr, Port, OperStatus, Speed, Adminstatus, Autonegotation, PoE, VLan) VALUES ('10.182.20.5', '10.182.20.5', '56', 'up', '10', 'up', '0', '-', '"00 14 "')
 
fehlt da vielleicht die Tabelle in die du inserten willst?
 
Ich glaube, das ist es! :D Genial.

Bin jetzt nicht in der Arbeit, aber morgen früh probiere ich es aus und sage Bescheid.
 
Darf ich noch eins anfügen?

Ich möchte noch darauf hinweisen, dass die Verwendung von "bind"-Parametern empfohlen ist. Damit muss man sich nicht um das Escapen von SQL-Sonderzeichen kümmern. Das übernimmt dann das DBI-Modul.

Code:
my $sql = "INSERT INTO $tablename (Switch, IPAddr, Port, OperStatus, Speed, Adminstatus, Autonegotation, PoE, VLan) VALUES (?,?,?,?,?,?,?,?,?)";
$myquery = $dbh->prepare($sql);
$myquery->execute($rcHostname1, $hostname, $rcPortIndex1, $ifOperStatus1, $ifSpeed1, $ifAdminStatus1, $rcPortAutoNegotiate1, $snAgentPoePortControl1, $rcVlanPortVlanIds1);

Der Vorteil? Schutz vor SQL-Injections und plötzlich auftretenden SQL-Fehlern.

Mehr Info dazu gibt es auch unter http://wiki.perl-community.de/Wissensbasis/DbiPlatzhalter
 
Ah, danke für den Hinweis. Ist gut zu wissen :)
 
Zurück
Oben