• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

JSP mit schreibender Datenbankverbindung

Status
Für weitere Antworten geschlossen.
O

Only4

Guest
Hallo, hab ein problem ich versuche aus einem Formular die daten in eine Datenbank reinzuimportieren. Leider tritt bei Tomcat immer der selbe Fehler auf dieser wie folgt lautet:




Meine Html datei sieht wie folgt aus:
PHP:
<html>
<head>
<title>Kundenfeedback</title>
<meta name="author" content="administrator">
<meta name="editor" content="html-editor phase 5">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
 <h2>Hier können Sie uns eine Nachricht zukommen lassen.</h2>
 <br />

 <form action="fback.jsp" method="post">
  Bitte geben Sie Ihre Kundennummer ein (fünfstellig):<br />
  <input type="text" name="tfkd" size="5" maxlenght="5"><br />
  Bitte geben Sie Ihre E-Mail-Adresse ein:<br />
  <input type="text" name="tfmail"><br />
  Bitte geben Sie Ihre Nachricht ein:<br />
  <textarea name="tfmessage" cols="50" rows="10"></textarea><br />
  <input type="Submit" name="" value="Abschicken">
 </form>

</body>
</html>
meine JSP datei so:
PHP:
<%@ page language = "Java"%>
<%@ page import="java.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta name="author" content="administrator">
<meta name="editor" content="html-editor phase 5">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">

<%
  String mKdnr;
  String memail;
  String mmessage;
  String mSQL;
  String mDB;
  Connection mdbHaro = null;
  Statement stmtSQL = null;
  ResultSet rs = null;
  int iKdnr;

  // Auslesen von den Datenfeldern
  mKdnr = request.getParameter("tfkd");
  memail= request.getParameter("tfmail");
  mmessage= request.getParameter("tfmessage");

  // Umwandeln von String nach Integer
  iKdnr = Integer.parseInt(mKdnr);

  // SQL Befehl formuliert
  mSQL="INSERT INTO NACHRICHT ( KdNr, EMail, Nachricht ) ";

  mSQL=mSQL + "VALUES ('iKdnr'+ 'memail' +'mmessage');";

  // Laden der Treiber und auswahl der Datenbank
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    mDB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:/xampp/tomcat/webapps/jsp/jsp_06/HARO.MDB";

    try{

    mdbHaro=DriverManager.getConnection(mDB,"","");
    stmtSQL = mdbHaro.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    }

    catch(Exception err)
    { System.err.println(err);
    }
    try
    {
    rs = stmtSQL.executeQuery(mSQL);
    }

    catch(SQLException err)
    {
      //out.println{"<h2>SQL fehlerhaft</h2>");
      System.err.println(err); }

          try
    {
    rs.next();

    }
   catch(SQLException err)
    {

        System.err.println(err);
      }

    rs.close();
    mdbHaro.close();

%>
</body>
</html>
Ich hoffe ihr könnt mir schnell zu meinen kleinen fehler helfen, laut tomcat ist etwas faul an der zeile 50 die aber nach meiner meinung kein fehler ist :/

Habe schon etwas programmiert mit datenbanken und jsp aber das waren leider nur abfragen.

Schonmal danke im vorraus!
 
Zuletzt bearbeitet von einem Moderator:
Denke, die SQL-Query passt nicht. Kontrollier diese Zeilen noch mal, da kommst du mit den Anführungszeichen und Pluszeichen durcheinander (müssen wohl Kommas hin):

Code:
  // SQL Befehl formuliert
  mSQL="INSERT INTO NACHRICHT ( KdNr, EMail, Nachricht ) ";

  mSQL=mSQL + "VALUES ('iKdnr'+ 'memail' +'mmessage');";
 
Denke, die SQL-Query passt nicht. Kontrollier diese Zeilen noch mal, da kommst du mit den Anführungszeichen und Pluszeichen durcheinander (müssen wohl Kommas hin):

Code:
  // SQL Befehl formuliert
  mSQL="INSERT INTO NACHRICHT ( KdNr, EMail, Nachricht ) ";

  mSQL=mSQL + "VALUES ('iKdnr'+ 'memail' +'mmessage');";


Also hab das jetzt so umgeändert aber ich bedenke immernoch das da etwas falsch an der Zeile ist die mir vorgeschlagen worden ist von dir bei mir wird immernoch der selbe fehler angezeigt. habe es aber jetzt so geschrieben:

PHP:
  mSQL="INSERT INTO NACHRICHT ( KdNr, EMail, Nachricht ) ";

  mSQL=mSQL + "VALUES ('"+ iKdnr +"','"+ memail +"','"+ mmessage +"');";

Von den abfragen mit datenbanken weis ich das wir abfragungsbefehle so eingegeben habe, ich bin mir sicher es liegt an den anführungszeichen,


Hier ein beispiel zu den Abfragungsbefehlen
PHP:
   mSQL="SELECT Name,Strasse,PLZ,Ort ";
   mSQL=mSQL+"FROM KUNDE ";
   mSQL=mSQL+"WHERE KdNr='"+mKdNr+"';";
 
Lass dir im Zweifel einfach mal die fertig zusammengebaute Query als Zeichenkette ausgeben. Das hilft bei sowas meist weiter. Die fragliche Zeile im Code scheint jedenfalls vermutlich an einer falsch formulierten Query zu scheitern.
 
Wir sind hier, wie schon angemerkt wurde, in einem Javascript Forum, daher kenn ich mich mit Java nicht aus, aber gibt es in Java keine SQL Injections? Oder werden die emfangenen Parameter automatisch gefiltert? Wenn nicht ist das wieder mal ein Beispiel wie man eine Einladung für hacker, cracker und spammer baut.
 
Lass dir im Zweifel einfach mal die fertig zusammengebaute Query als Zeichenkette ausgeben. Das hilft bei sowas meist weiter. Die fragliche Zeile im Code scheint jedenfalls vermutlich an einer falsch formulierten Query zu scheitern.

Also hab es heute gelöst, das resultset musste einfach weg und man musste einen schriebenden zugriff einfügen -.- leichte anfänger fehler danke nochmal für alle die daran rumgerätselt haben

JSP datei sieht nun so aus und sie funktioniert!
PHP:
<%@ page language = "Java"%>
<%@ page import="java.sql.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta name="author" content="administrator">
<meta name="editor" content="html-editor phase 5">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">

<%
  String mKdnr;
  String memail;
  String mmessage;
  String mSQL;
  String mDB;
  Connection mdbHaro = null;
  Statement stmtSQL = null;

  int iKdnr;

  // Auslesen von den Datenfeldern
  mKdnr = request.getParameter("tfkd");
  memail= request.getParameter("tfmail");
  mmessage= request.getParameter("tfmessage");

  // Umwandeln von String nach Integer
  iKdnr = Integer.parseInt(mKdnr);

  // SQL Befehl formuliert
  mSQL="INSERT INTO NACHRICHT ( KdNr, EMail, Nachricht ) ";
  mSQL=mSQL + "VALUES ('"+ iKdnr +"','"+ memail +"','"+ mmessage +"');";

  // Laden der Treiber und auswahl der Datenbank
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    mDB = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=H:/www/jsp/jsp_06/DB/HARO.MDB";

    try{

    mdbHaro=DriverManager.getConnection(mDB,"","");
    stmtSQL = mdbHaro.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    }

    catch(Exception err)
    { System.err.println(err);
    }
    try
    {
    stmtSQL.executeUpdate(mSQL);
    out.println("<h2>Ihre Nachricht wurde erfolgreich in der Datenbank gespeichert</h2>");
    out.println("<h2>Hier gelangen sie wieder <a href=\"start.html\">zur&uuml;ck</a></h2>");
    }

    catch(SQLException err)
    {
      out.println("<h2>Ihre Nachricht wurde nicht gespeichertSQL fehlerhaft</h2>");
      System.err.println(err);
    }

    mdbHaro.close();

%>
</body>
</html>
 
Ah, okay. Vielleicht sollte ich auch nicht antworten, wenn ich die Architektur nicht kenne. Pardon. :)

Hast du über den Punkt von struppi nachgedacht? Gibt es nicht irgendwie die Möglichkeit, stmtSQL.bindParam() oder so zu sagen und im eigentlichen SQL-String Platzhalter für Variablen zu verwenden, damit die Java-Klasse das Escaping übernimmt?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben