75 votes

Que représente un point d'interrogation dans les requêtes SQL?

En parcourant certains livres sur le SQL, j'ai remarqué que les exemples ont tendance à utiliser des points d'interrogation (?) dans leurs requêtes. Que représente-t-il?

0 votes

Pouvez-vous fournir le code pour la requête ?

0 votes

Je suppose que ce sont des variables dans les déclarations préparées, mais vous devriez poster cette requête particulière pour être sûr.

131voto

egrunin Points 15356

Vous êtes en train de voir une requête paramétrée. Elles sont fréquemment utilisées lors de l'exécution de SQL dynamique à partir d'un programme.

Par exemple, au lieu d'écrire ceci (note : pseudocode):

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7")
result = cmd.Execute()

Vous écrivez ceci :

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?")
cmd.Parameters.Add(7)
result = cmd.Execute()

Cela présente de nombreux avantages, comme c'est probablement évident. L'un des plus importants : les fonctions de bibliothèque qui analysent vos paramètres sont intelligentes, et assurent que les chaînes sont correctement échappées. Par exemple, si vous écrivez ceci :

string s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"
cmd.Execute()

Que se passe-t-il lorsque l'utilisateur entre ceci ?

Robert'); DROP TABLE students; --

(La réponse se trouve ici)

Écrivez ceci à la place :

s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE name = ?"
cmd.Parameters.Add(s)
cmd.Execute()

Ensuite, la bibliothèque va sanitiser l'entrée, produisant ceci :

"SELECT * FROM students where name = 'Robert'); DROP TABLE students; --'"

Tous les SGBD n'utilisent pas de ?. MS SQL utilise des paramètres nommés, ce que je considère comme une grande amélioration :

cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname"
cmd.Parameters.AddWithValue("@varname", 7)
result = cmd.Execute()

22voto

SLaks Points 391154

Le ? est un paramètre sans nom qui peut être renseigné par un programme exécutant la requête pour éviter les injections SQL.

1 votes

Pouvez-vous fournir un exemple de ceci ?

8voto

Buhake Sindi Points 38654

Le ? est utilisé pour permettre une Requête Paramétrée. Ces requêtes paramétrées permettent d'utiliser des valeurs spécifiques au type lors du remplacement du ? par leur valeur respective.

C'est tout ce qu'il y a à dire à ce sujet.

Il y a plusieurs raisons pour lesquelles il est recommandé d'utiliser des Requêtes Paramétrées. En essence, c'est plus facile à lire et à déboguer, et cela contourne les attaques par injection SQL.

2voto

amorfis Points 4456

C'est un paramètre. Vous pouvez le spécifier lors de l'exécution de la requête.

2voto

vicatcu Points 2583

Je ne pense pas que cela ait de sens en SQL. Vous pourriez être en train de regarder les déclarations préparées en JDBC ou quelque chose du genre. Dans ce cas, les points d'interrogation sont des espaces réservés pour les paramètres de la déclaration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X