Parametrisierte SQL-Abfragen in Node, Python, PHP, Java
Eine parametrisierte Abfrage trennt den SQL-Text von den Werten, die der Treiber getrennt an die Datenbank übergibt; das ist die übliche Maßnahme gegen SQL-Injection. Die Snippets zeigen die Schreibweise für Node.js, Python, PHP, Java, C#, Go und Prisma sowie IN-Listen mit Array, LIKE-Suchen und eine Positivliste für dynamische Sortierung.
13 Varianten auf einer Seite, jede mit eigenem Kopier- oder Download-Knopf.
Parametrisierte Abfrage: Node.js mit pg ($1, $2)
const { rows } = await pool.query( 'SELECT id, nachname FROM kunden WHERE ort = $1 AND id > $2 ORDER BY id LIMIT 20', [ort, letzteId], …Werte gehen getrennt vom SQL-Text an die Datenbank, deshalb ist Einschleusen von SQL ausgeschlossen. Tabellen- und Spaltennamen lassen sich so nicht parametrisieren.
Parametrisierte Abfrage: Node.js mit mysql2 (?)
const [zeilen] = await pool.execute( 'SELECT id, nachname FROM kunden WHERE ort = ? AND id > ? ORDER BY id LIMIT 20', [ort, letzteId], …
Parametrisierte Abfrage: Node.js mit better-sqlite3
const stmt = db.prepare('SELECT id, nachname FROM kunden WHERE ort = @ort AND id > @id') const zeilen = stmt.all({ ort, id: letzteId })Parametrisierte Abfrage: Python mit psycopg (%s)
cur.execute( "SELECT id, nachname FROM kunden WHERE ort = %s AND id > %s ORDER BY id LIMIT 20", (ort, letzte_id), …%s ist hier ein Platzhalter des Treibers, kein Python-String-Format.
Parametrisierte Abfrage: Python mit sqlite3 (? und :name)
cur.execute("SELECT id, nachname FROM kunden WHERE ort = ? AND id > ?", (ort, letzte_id)) cur.execute("SELECT id, nachname FROM kunden WHERE ort = :ort", {"ort": ort})Parametrisierte Abfrage: PHP mit PDO (benannte Platzhalter)
$stmt = $pdo->prepare('SELECT id, nachname FROM kunden WHERE ort = :ort AND id > :id ORDER BY id LIMIT 20'); $stmt->execute(['ort' => $ort, 'id' => $letzteId]); $zeilen = $stmt->fetchAll(PDO::FETCH_ASSOC);Parametrisierte Abfrage: Java JDBC PreparedStatement
String sql = "SELECT id, nachname FROM kunden WHERE ort = ? AND id > ? ORDER BY id"; try (PreparedStatement ps = conn.prepareStatement(sql)) { ps.setString(1, ort); …Parametrisierte Abfrage: C# mit Microsoft.Data.SqlClient
using var cmd = new SqlCommand("SELECT Id, Nachname FROM Kunden WHERE Ort = @ort", conn); cmd.Parameters.Add("@ort", SqlDbType.NVarChar, 100).Value = ort; using var reader = await cmd.ExecuteReaderAsync();Parametrisierte Abfrage: Go database/sql
rows, err := db.QueryContext(ctx, "SELECT id, nachname FROM kunden WHERE ort = $1 AND id > $2 ORDER BY id LIMIT 20", ort, letzteID)Platzhalter-Stil hängt vom Treiber ab: $1 bei PostgreSQL, ? bei MySQL und SQLite.
Parametrisierte Abfrage: Prisma $queryRaw als Template-Literal
const kunden = await prisma.$queryRaw` SELECT id, nachname FROM kunden WHERE ort = ${ort} AND id > ${letzteId} ORDER BY id LIMIT 20 `Das Template-Literal wird von Prisma in einen Platzhalter-Aufruf übersetzt. Mit $queryRawUnsafe und Zeichenkettenbau gilt das nicht.
Parametrisierte Abfrage: IN-Liste mit Array in PostgreSQL
const { rows } = await pool.query( 'SELECT id, nachname FROM kunden WHERE id = ANY($1::bigint[])', [[1, 2, 3]], …Ein Array-Parameter statt einer zusammengebauten IN-Liste.
Parametrisierte Abfrage: LIKE mit Suchbegriff als Parameter
const muster = `%${suche.replace(/[\\%_]/g, '\\$&')}%` const { rows } = await pool.query( "SELECT id, name FROM produkte WHERE name ILIKE $1 ESCAPE '\\'", …Die Platzhalter % und _ im Suchbegriff werden maskiert, damit Nutzer keine Jokerzeichen einschleusen.
Sichere dynamische Sortierung mit Positivliste
const SPALTEN = { name: 'nachname', ort: 'ort', neu: 'erstellt_am' } as const const spalte = SPALTEN[eingabe as keyof typeof SPALTEN] ?? 'nachname' const sql = `SELECT id, nachname FROM kunden ORDER BY ${spalte} LIMIT $1` …Spaltennamen lassen sich nicht als Parameter übergeben; nur aus einer festen Liste auswählen.
Weitere Themen in Datenformate & Snippets
- JSON Beispiele: gültig und ungültig zum Testen
- XML Beispiele: Namespaces, CDATA und Fehlerfälle
- YAML Beispiele: Listen, Anker und typische Fallen
- Markdown Beispiele: Tabelle, Listen, Codeblock
- HTML Beispiele: Formulare, Tabellen und Meta-Tags
- GraphQL Beispiele: Schema, Query, Mutation, Antwort
- Code-Snippets: Kundenmodell in vielen Sprachen
- curl Beispiele: GET, POST, Header, Upload, Auth