[GastForen Archiv Perl und CGI Html-Formular, CGI, MySQL - Wo liegt der Fehler?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Archiv - Archivierte Foren
Themen
Beiträge
Moderatoren
Letzter Beitrag

Html-Formular, CGI, MySQL - Wo liegt der Fehler?

Adrifu
Beiträge gesamt: 1

1. Apr 2014, 20:52
Beitrag # 1 von 2
Bewertung:
(115239 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Leute,

vielleicht kann mir ein Profi bei meinem Problem helfen:

Ich habe eine Datenbank in MySQL erstellt:

Code
USE test; 
DROP TABLE if exists adressen;
CREATE TABLE adressen (
id int(5) NOT NULL auto_increment,
vorname varchar(30),
name varchar(30),
strasse varchar(30),
plz varchar(30),
ort varchar(30),
telefon varchar(30),
PRIMARY KEY (id),
UNIQUE KEY id (id)
);
INSERT INTO adressen VALUES("1", "Hans", "Muster", "Mustergasse 99",
"9999", "Mustershausen", "099 999 99 99");
INSERT INTO adressen VALUES("2", "Fritz", "Müller", "Hauptstrasse 90",
"8888", "Testeshausen", "088 888 88 88");


und ein HTML-Formular:

Code
<html> 
<body>
<form action="/cgi-bin/sqlinsert.cgi" method="post">
Vorname <input type="text" name="vorname"/><br/>
Name <input type="text" name="name"/><br/>
Strasse <input type="text" name="strasse"/><br/>
PLZ/Ort <input type="text" name="plz"/> <input type="text" name="ort"/><br/>
Telefon <input type="text" name="telefon"/><br/>
<input type="submit" value="absenden"/>
</form>
Oder:
<form action="/cgi-bin/sqlselect.cgi" method="post">
<input type="submit" value="Eintr&auml;ge ansehen"/>
</form>
</body>
</html>


und die dazugehörigen CGI-Scripte:

Code
#!"C:\perl64\bin\perl.exe" -w 
print "Content-type: text/html\n\n";
print "<html><body>";
use DBI;
my ($dbh, $sqlData, $sqlResult, $rowsAffected, $errorCode, %FORM);
$dbh = DBI->connect("DBI:mysql:test:localhost", "root", "1234") or
die("Verbindungsfehler: ".DBI->errstr);

&readForm; # Formulardaten einlesen
foreach (keys(%FORM)) { # Werte backquoten
$FORM{$_} =~ s/([\'\"\`\\])/\\$1/g;
}

# Werte einfügen
$sqlData = $dbh->prepare("INSERT INTO adressen (vorname, name, strasse, plz, ort,".
".telefon) VALUES ('".$FORM{"vorname"}."','".$FORM{"name"}."','".$FORM{"strasse"}.
"','".$FORM{"plz"}."','".$FORM{"ort"}."','".
$FORM{"telefon"}."');");
$rowsAffected=$sqlData->execute;

if ($rowsAffected > 0) { # 1 oder mehr Datensätze betroffen: alles OK
print "Abfrage erfolgreich: $rowsAffected Datensätze betroffen.";
print "ID des Datensatzes: ".$dbh->{'mysql_insertid'}.".";
} else { # Fehler
print "Es ist ein Fehler aufgetreten: ".$dbh->errstr;
}

$sqlData->finish;
$dbh->disconnect;

print "</html></body>";

sub readForm { # Parameter in %FORM einlesen
my ($buffer,@pairs,@pair,$i);
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
} else {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
@pairs = split(/&/, $buffer);
foreach (@pairs) {
@pair = split(/=/, $_, 2);
for ($i=0;$i<2;$i++) {
$pair[$i] =~ tr/+/ /;
$pair[$i] =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
}
$FORM{$pair[0]} = $pair[1];
}
}


und zum auslesen:

Code
#!"C:\perl64\bin\perl.exe" -w 
print "Content-type: text/html\n\n";
print "<html><body>";
print "<table border=\"0\" width=\"100%\">";
use DBI;
my ($dbh, $sqlData, $sqlResult);
$dbh = DBI->connect("DBI:mysql:test:localhost", "root", "1234") or
die("Verbindungsfehler: ".DBI->errstr);

$sqlData = $dbh->prepare("SELECT * FROM adressen;");
$sqlData->execute;
while ($sqlResult = $sqlData->fetchrow_hashref) {
print "<tr valign=\"top\">";
print "<td>".$sqlResult->{"vorname"}." ".$sqlResult->{"name"}."</td>".
"<td>".$sqlResult->{"strasse"}.
"</td><td>".$sqlResult->{"plz"}." ".$sqlResult->{"ort"}."</td>".
"<td>".$sqlResult->{"telefon"}."</td>";
print "</tr>";
}
$sqlData->finish;
$dbh->disconnect;

print "</table></html></body>";


Das auslesen der Datenbank funktioniert einwandfrei nur das Einfügen der Daten macht mir noch Kopfzerbrechen! Ich bekomme folgende Fehlermeldungen:

Code
Es ist ein Fehler aufgetreten: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') VALUES ('Alfons','Alabama','hausstrasse','77777','poltern','0691562')' at line 1 


und die Apache-Error-Log:

Code
[Tue Apr 01 20:27:27 2014] [error] [client 127.0.0.1] DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') VALUES ('Alfons','Alabama','hausstrasse','77777','poltern','0691562')' at line 1 at C:/Apache/cgi-bin/sqlinsert.cgi line 19.\r, referer: http://localhost/sqlform.html 
[Tue Apr 01 20:27:27 2014] [error] [client 127.0.0.1] Use of uninitialized value $rowsAffected in numeric gt (>) at C:/Apache/cgi-bin/sqlinsert.cgi line 21.\r, referer: http://localhost/sqlform.html


Könnt ihr mir vielleicht helfen das ganze zum laufen zu bringen.
Vielen Dank Vorab.
X

Html-Formular, CGI, MySQL - Wo liegt der Fehler?

oesi50
  
Beiträge gesamt: 2315

7. Apr 2014, 20:53
Beitrag # 2 von 2
Beitrag ID: #525931
Bewertung:
(115139 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das soll hoffentlich kein Aprilscherz sein ;-)


1. prepare wird so nicht verwendet.

richtig ist


Code
$sqlData = $dbh->prepare("INSERT INTO adressen (vorname, name, strasse, plz, ort,telefon) VALUES (?,?,?,?,?,?)"); 
$sqlData->execute($FORM{"vorname"}, $FORM{"name"}, $FORM{"strasse"}, $FORM{"plz"}, $FORM{"ort"}, $FORM{"telefon"});


damit wird automatisch auch zuverlässig eine SQL-Injection verhindert. http://de.wikipedia.org/wiki/SQL-Injection

möglicherweise kommt dein Fehler sogar davon.


2. der zweite Fehler ist ein Folgefehler des Ersten.


Grüße Oesi
Ich weiß, dass ich nicht weiß... (Sokrates)


als Antwort auf: [#525779]

Aktuell

Veranstaltungen

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen. pdf-icon Hier eine kleine Anleitung.

Veranstaltungen
03.06.2019

Nürnberg
Montag, 03. Juni 2019, 09.30 Uhr

Schulung, Seminar

Freisteller zählen seit den Anfangsjahren der elektronischen Bildbearbeitung zu den wichtigsten EBV-Techniken. Im Lauf der Jahre haben sich verschiedene Techniken entwickelt, und auch Photoshop hat mit zahlreichen Freistell-Werkzeugen die Arbeit mit Freistellern vereinfacht. In diesem Seminar lernen Sie die wichtigsten Freistell- und Maskierungstechniken kennen, um Ihre Bilddaten schnell und effizient freizustellen.

Ja

Organisator: Cleverprinting.de

https://www.cleverprinting.de/schulung-freistellen-tipps-und-tricks/

Freistellen – die besten Strategien, Tipps, Tricks
Veranstaltungen
03.06.2019 - 04.06.2019

Düsseldorf
Montag, 03. Juni 2019, 09.30 Uhr - Dienstag, 04. Juni 2019, 17.30 Uhr

Schulung, Seminar

Unsere Schulung „Zweitägige Weiterbildung zum Cleverprinting-Reinzeichner“ bietet allen Anwendern, die in Agenturen oder freiberuflich als Reinzeichner bzw. in der Reinzeichnung arbeiten, topaktuelles Grafik- und PrePress-Fachwissen rund um das Thema „Druckdatenerstellung mit InDesign, Photoshop, Acrobat“.

Ja

Organisator: Cleverprinting.de

https://www.cleverprinting.de/zweitaegige-weiterbildung-zum-cleverprinting-reinzeichner/

Zweitägige Weiterbildung zum Cleverprinting-Reinzeichner
Hier Klicken