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.
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 PreparedStatement
s dans les Java Tutorials .
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);
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 .
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();
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.