0

我正在尝试制作一个输入表单并使用javabean和jsp将它们保存到mysql数据库中。因为这是我第一次使用 jsp,所以我不知道为什么这个程序会为插入操作运行错误条件。

这是代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

public class Formulir {
    public String username;
    public String nama;
    public String ttl;
    public String alamat;
    public String telp;
    public String id_form;
    public Statement stmt=null;
    public Connection conn = null;
    public String sURL = "jdbc:odbc:formulir";

    public boolean insertIntoDB (String username, String nama, String ttl, String alamat, String telp, String id_form) {
        String sql = "insert into formulir values('"+username+"', '"+nama+"', '"+ttl+"', '"+alamat+"', '"+telp+"', '"+id_form+"')";
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            conn = DriverManager.getConnection(sURL, "", "");
            stmt=conn.createStatement();
            stmt.execute(sql);
            stmt.close();
            return true;
        } catch(Exception e) {
            return false;
        }
    }

这是输入表单过程的代码:

<jsp:useBean id="formulir" scope="session" class="BMS.Formulir" />
<jsp:setProperty name="formulir" property="*" />
<% if ((String)session.getAttribute("username")==null &&       (String)session.getAttribute("password")==null){
response.sendRedirect("daftar.jsp");} %>

<%
String username=(String)session.getAttribute("username");
String nama=request.getParameter("nama");
String ttl=request.getParameter("ttl");
String alamat=request.getParameter("alamat");
String telp=request.getParameter("telp");
String id_form="NULL";
%>

<html>
    <h2> <%=formulir.insertIntoDB(username, nama, ttl, alamat, telp, id_form)%> </h2>
</html>

这是公式表的结构:

username (varchar)
nama (varchar)
ttl (varchar)
alamat (varchar)
telp (varchar)
id_form (int)
4

4 回答 4

3

尝试这个:

  • 返回可能的错误消息以进行测试
  • 在 SQL INSERT 中列出列名,因此稍后添加的字段不会导致回归错误
  • 使用 PreparedStatement。这可以防止 SQL 注入黑客攻击,并转义单引号和反斜杠
  • 关闭连接
  • 保留所有本地

可能需要更正。在 Internet 中查找 Web 应用程序中 DataSource 的用法。存在 MySQL 驱动程序而不是 JDBC/ODBC 桥。

public String insertIntoDB (String username, String nama,
        String ttl, String alamat, String telp, String id_form) {
    String sql = "INSERT INTO formulir(username, nama, ttl, alamat, telp, id_form)"
        + " VALUES(?, ?, ?, ?, ?, ?)";
    try{
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection conn = DriverManager.getConnection(sURL, "", "");
        PreparedStatement stmt = conn.preparedStatement(stmt);
        stmt.setString(1, username);
        stmt.setString(2, nama);
        stmt.setString(3, ttl);
        stmt.setString(4, alamat);
        stmt.setString(5, telp);
        stmt.setInteger(6, Integer.parseInt(id_form));
        int count = stmt.executeUpdate();
        stmt.close();
        conn.disconnect();
        return "Updated: " + count;
    } catch(Exception e) {
        return e.getMessage();
    }
}
于 2013-05-23T14:09:32.293 回答
2

有很多地方可能会出错,而你的结构正在掩盖它们。(这是您希望尽可能使用非常具体的异常类型的原因之一);

  1. 我认为这是最有可能出现的问题id_form:您varchar通过将'. 更改'"+id_form+"'"+id_form+"
  2. sun.jdbc.odbc.JdbcOdbcDriver可能无法加载。这会给你一个 ClassNotFoundException。您可以创建一个catch(ClassNotFoundException e)块来查看它。这个问题提供了一个解决这个问题的方法。
  3. 您的连接字符串不允许您访问数据库。这将是由 引发的错误DriverManager.getConnection,并且是SqlException. 添加一个catch(SqlException e)块,如果出现错误,请确保您可以使用配置文件中的凭据连接到数据库。
  4. 您也可以从 中获得异常createStatement,但这很可能是由与 相同的问题引起的getConnection

关于半相关的说明:您可能希望研究一种称为PreparedStatement的东西。这不仅可以使您的代码不易受到攻击,而且还可以帮助您避免这种类型的转换问题。

于 2013-05-23T14:06:04.637 回答
0

您的 id_form 在表格中是一个 int 但您将 vlaue 放入 ' '

于 2013-05-23T14:03:35.363 回答
-1

这是Java代码: String sql = "insert into formulir values('"+username+"',

用单撇号包围表示 Java 中的 char 值

对于 Java 字符串,您可能希望以下内容:

"'"+用户名+"'"

因为在屏幕上我的版本看起来与原始版本相似,所以我添加了解释:

它应该是:

双引号,单引号,双引号,+,用户名,+,双引号,单引号,双引号。他所做的是:

单引号、双引号、+、用户名、+ 双引号、单引号

于 2013-05-23T13:57:24.413 回答