首页>Program>source

我正在尝试为我的程序制作验证类.我已经建立了与MySQL数据库的连接,并且已经在表中插入了行.该表由 firstName组成 , lastNameuserID 领域.现在,我想通过构造函数的参数在数据库中选择特定的行.

import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.Connection;
public class Validation {
    private PreparedStatement statement;
    private Connection con;
    private String x, y;
    public Validation(String userID) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test", "root", "");
            statement = con.prepareStatement(
                    "SELECT * from employee WHERE  userID = " + "''" + userID);
            ResultSet rs = statement.executeQuery();
            while (rs.next()) {
                x = rs.getString(1);
                System.out.print(x);
                System.out.print(" ");
                y = rs.getString(2);
                System.out.println(y);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
}

但似乎不起作用。

最新回答
  • 7天前
    1 #

    您应该使用 setString() 设置 userID的方法 .这既可以确保语句的格式正确,又可以防止 SQL injection

    statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
    statement.setString(1, userID);
    

    关于如何使用 PreparedStatement有一个不错的教程

  • 7天前
    2 #

    如果使用的是预准备语句,则应按以下方式使用它:

    "SELECT * from employee WHERE userID = ?"
    

    然后使用:

    statement.setString(1, userID);
    

    ? 将在您的查询中替换为传递给 setString的用户ID 方法。

    在这里看看如何使用PreparedStatement。

  • 7天前
    3 #

    查询中存在问题。

      statement =con.prepareStatement("SELECT * from employee WHERE  userID = "+"''"+userID);
       ResultSet rs = statement.executeQuery();
    

    您正在使用Prepare Statement。因此,您需要使用 statement.setInt()设置参数 或 statement.setString() 取决于您的 userId类型

    Replace it with: -

      statement =con.prepareStatement("SELECT * from employee WHERE  userID = :userId");
       statement.setString(userId, userID);
       ResultSet rs = statement.executeQuery();
    

    或者,您可以使用 ? 代替命名的值- :userId ..

      statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
       statement.setString(1, userID);
    

  • 7天前
    4 #

    执行类似的操作,这也可以防止SQL注入攻击

    statement = con.prepareStatement("SELECT * from employee WHERE  userID = ?");
    statement.setString(1, userID);
    ResultSet rs = statement.executeQuery();
    

  • 7天前
    5 #

    您可以使用"?" 使用PreparedStatments在字符串中设置自定义参数。

    statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
    statement.setString(1, userID);
    ResultSet rs = statement.executeQuery();
    

    如果您直接在查询中传递用户ID,则它可能会受到 SQL INJECTION Attack.的攻击

  • c:const正确的数组指针?
  • c++:sizeof有什么作用?