2010-09-16 23 views
35

Durante l'analisi di alcuni libri SQL ho trovato che gli esempi tendono a utilizzare punti interrogativi (?) nelle loro query. Cosa rappresenta?Che cosa rappresenta un punto interrogativo nelle interrogazioni SQL?

+0

Potrebbe fornire il codice per la ricerca? – Gage

+0

Suppongo che siano variabili nelle istruzioni preparate, ma dovresti pubblicare quella particolare query per essere sicuro. – kennytm

+0

@Mitch Wheat, significa semplicemente che puoi ottenere aiuto dai geni qui abbastanza felicemente (se hai bisogno di risposte esperte). –

risposta

12

Il ? è un parametro senza nome che può essere compilato da un programma che esegue la query per evitare SQL injection.

+0

Potete fornire un esempio di questo? – Brad

1

Rappresenta normalmente un parametro che deve essere fornito dal client.

2

È un parametro. È possibile specificarlo durante l'esecuzione della query.

2

Non penso che abbia alcun significato in SQL. Potresti guardare le istruzioni preparate in JDBC o qualcosa del genere. In tal caso, i punti interrogativi sono segnaposto per i parametri della dichiarazione.

5

Il ? deve consentire Parameterized. Questa query con parametri è di consentire il valore specifico del tipo quando si sostituisce lo ? con il rispettivo valore.

Questo è tutto.

Ecco un numero reason del motivo per cui è preferibile utilizzare la query con parametri. Fondamentalmente, è più facile leggere e fare il debug.

65

Quello che stai vedendo è una query con parametri . Vengono spesso utilizzati durante l'esecuzione di SQL dinamico da un programma.

Ad esempio, invece di scrivere questo (nota: pseudocode):

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

si scrive questo:

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

Questo ha molti vantaggi, come probabilmente è ovvio. Uno dei più importanti: le funzioni della libreria che analizzano i parametri sono intelligenti e assicurano che le stringhe vengano scappate correttamente. Ad esempio, se scrivi questo:

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

Cosa succede quando l'utente inserisce questo?

Robert'); DROP TABLE students; -- 

(risposta è here)

Write questo, invece:

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

Poi la libreria disinfettare l'ingresso, producendo in questo modo:

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

Non tutti i DBMS utilizzare ?. MS SQL utilizza denominati parametri, che io considero un enorme miglioramento:

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

Risposta molto chiara che dimostra esempi e alternative. Grazie. – Termato

+8

Più uno per il cartone animato divertente – CHarris

+0

Punto eccellente sui parametri denominati MS SQL. – myidealab

Problemi correlati