web-dev-qa-db-fra.com

passage de paramètres à un JDBC PreparedStatement

J'essaie de faire ma classe de validation pour mon programme. J'ai déjà établi la connexion à la base de données MySQL et j'ai déjà inséré des lignes dans la table. Le tableau comprend les champs firstName, lastName et userID. Maintenant, je veux sélectionner une ligne spécifique sur la base de données via mon paramètre de mon constructeur.

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);
        }
    }
}

mais cela ne semble pas fonctionner.

15
user1708134

Vous devez utiliser la méthode setString() pour définir userID. Cela garantit à la fois que l'instruction est formatée correctement et empêche SQL injection:

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

Il y a un joli tutoriel sur la façon d'utiliser correctement PreparedStatements dans les Java Tutorials .

37
Keppil

Il y a un problème dans votre requête ..

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

Vous utilisez la déclaration de préparation. Vous devez donc définir votre paramètre à l'aide de statement.setInt() ou statement.setString() selon le type de votre userId

Remplacez-le par: -

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

Ou, vous pouvez utiliser ? À la place de la valeur nommée - :userId ..

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

Si vous utilisez une instruction préparée, vous devez l'utiliser comme ceci:

"SELECT * from employee WHERE userID = ?"

Utilisez ensuite:

statement.setString(1, userID);

? sera remplacé dans votre requête par l'ID utilisateur passé dans la méthode setString.

Jetez un oeil ici comment utiliser PreparedStatement .

4

Faites quelque chose comme ça, ce qui empêche également attaques par injection SQL

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

Vous pouvez utiliser '?' pour définir des paramètres personnalisés dans une chaîne à l'aide de PreparedStatments.

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

Si vous passez directement l'ID utilisateur dans la requête pendant que vous le faites, il peut être attaqué par Attaque par INJECTION SQL.

1
Nandkumar Tekale