Zum Inhalt springen
BeispielWerk
English

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