Heim >Backend-Entwicklung >PHP-Tutorial >Wie gehe ich mit dynamisch dimensionierten Parameterlisten in MySQL-vorbereiteten Anweisungen um?

Wie gehe ich mit dynamisch dimensionierten Parameterlisten in MySQL-vorbereiteten Anweisungen um?

DDD
DDDOriginal
2024-12-03 03:14:09412Durchsuche

How to Handle Dynamically Sized Parameter Lists in MySQL Prepared Statements?

Dynamisch große Parameterlisten in MySQL-vorbereiteten Anweisungen

Beim Erstellen von MySQL-vorbereiteten Anweisungen in PHP stellt sich die Frage, wie mit Abfragen mit einer variablen Anzahl von Argumenten umgegangen werden soll. Stellen Sie sich zum Beispiel eine Abfrage wie diese vor:

SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)

Die Anzahl der IDs in der IN-Klausel variiert mit jeder Ausführung.

Mögliche Lösungen

Es gibt verschiedene Lösungsansätze diese Herausforderung:

  1. Lösung 1: Dummy-Variablen und Multiple Aufrufe

    • Erstellen Sie eine Anweisung, die eine feste Anzahl von Variablen (z. B. 100) akzeptiert und ungenutzte Slots mit Dummy-Werten füllt.
    • Führen Sie mehrere Aufrufe für größere Mengen aus.
  2. Lösung 2: Nicht vorbereitet Abfrage

    • Erstellen Sie die Abfrage dynamisch und führen Sie sie aus, um einen strengen Schutz vor Injektionsangriffen zu gewährleisten.

Optimale Lösung

Andere Optionen bieten jedoch eine bessere Effizienz:

  1. Vorübergehend Tabellenansatz

    • Erstellen Sie eine temporäre Tabelle und fügen Sie jeden Parameterwert darin ein.
    • Führen Sie einen einfachen Join mit der temporären Tabelle durch.
  2. Dynamisch IN Klausel

    • Erstellen Sie die Abfrage dynamisch mit einem Platzhalter für die IN-Klausel unter Verwendung von Implodierungs- und Array-Vorfüllfunktionen.
    • Zum Beispiel:

      $dbh = new PDO(...);
      $parms = [12, 45, 65, 33];
      $inclause = implode(',', array_fill(0, count($parms), '?')); // = ?,?,?,?
      $preparesql = sprintf('SELECT age, name FROM people WHERE id IN (%s)', $inclause);
      $st = $dbh->prepare($preparesql);
      $st->execute($parms);

Der erste Ansatz kann für große Mengen effizienter sein, während der zweite geeignet ist für kleinere.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit dynamisch dimensionierten Parameterlisten in MySQL-vorbereiteten Anweisungen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn