webentwicklung-frage-antwort-db.com.de

Was stellt ein Fragezeichen in SQL-Abfragen dar?

Bei der Durchsicht einiger SQL-Bücher stellte ich fest, dass in Beispielen Fragezeichen (?) in ihren Abfragen. Was stellt es dar?

42
pradeep

Was Sie sehen, ist eine parametrisierte Abfrage . Sie werden häufig verwendet, wenn dynamisches SQL von einem Programm ausgeführt wird.

Zum Beispiel, anstatt dies zu schreiben ( note: pseudocode):

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

Du schreibst das:

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

Dies hat viele Vorteile, wie wahrscheinlich offensichtlich ist. Eine der wichtigsten: Die Bibliotheksfunktionen, die Ihre Parameter analysieren, sind clever und sorgen dafür, dass Zeichenfolgen ordnungsgemäß maskiert werden. Wenn Sie beispielsweise Folgendes schreiben:

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

Was passiert, wenn der Benutzer dies eingibt?

Robert'); DROP TABLE students; --

(Antwort ist hier )

Schreiben Sie dies stattdessen:

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

Dann wird die Bibliothek bereinigen die Eingabe, die Folgendes erzeugt:

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

Nicht alle DBMS verwenden ?. MS SQL verwendet named Parameter, die ich als große Verbesserung betrachte:

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

Das ? ist ein unbenannter Parameter, der von einem Programm eingegeben werden kann, das die Abfrage ausführt, um SQL-Injection zu vermeiden.

12
SLaks

Das ? erlaubt eine parametrisierte Abfrage . Diese parametrisierte Abfrage ermöglicht typspezifische Werte beim Ersetzen des ? mit ihrem jeweiligen Wert.

Das war's auch schon.

Hier ist ein Grund , warum es besser ist, parametrisierte Abfragen zu verwenden. Grundsätzlich ist es einfacher zu lesen und zu debuggen.

5
Buhake Sindi

Es ist ein Parameter. Sie können es bei der Ausführung der Abfrage angeben.

2
amorfis

Ich glaube nicht, dass das in SQL irgendeine Bedeutung hat. Möglicherweise sehen Sie sich Prepared Statements in JDBC oder so an. In diesem Fall sind die Fragezeichen Platzhalter für Parameter der Anweisung.

2
vicatcu

Es stellt normalerweise einen Parameter dar, der vom Client bereitgestellt werden muss.

1
Jens Schauder