[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:
(414405 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
  1. 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
  1. <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
  1. #!"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
  1. #!"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
  1. 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
  1. [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:
(414304 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das soll hoffentlich kein Aprilscherz sein ;-)


1. prepare wird so nicht verwendet.

richtig ist


Code
  1. $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.


als Antwort auf: [#525779]