Hauptmenü

Untermenü

MySQLi - Methoden - MySQLi - Multi Queries

1. Das alte Problem

Wie oft schon stand man vor dem Problem, mehrere voneinander unabhängige Abfragen in einem Ergebnis zusammen zu fassen. Also jagte man erst einen Query durch den Äther, dann den nächsten und am Ende hat man beide Ergebnisse irgendwie zusammengefrickelt. Oder man hat die SQL-Statements irgendwie in Arrays abgespeichert und die dann einzeln durchlaufen.

Hosianna

Dank der Methode/Funktion multi_query sind solche Zeiten vorbei. Denn nun kann man so viele SQL-Statements wie nötig in einen Rutsch an die Datenbank senden. Und wenn man möchte, in einem Array zusammenfassen.

2. Die Queries

... werden in einer Zeichenkette zusammengefasst. Und ganz wichtig ist, dass sie durch ein Semikolon voneinander getrennt sind. Also so, als ob man direkt in einem Frontend wie phpMyAdmin arbeitet


$query  'SELECT bla FROM blubb;';
$query .= 'SELECT blubber FROM laber WHERE id > 500;';
$query .= 'SELECT * FROM jodelbla;';

Beim letzten SQL-Statement kann man es weglassen, muss es aber nicht.

3. Die Ausführung

Hier gibt es eine Besonderheit, die mit der Verarbeitung zusammenhängt. Denn hier benötigt man eine Bedingung. Das liegt schlicht und ergreifend daran, dass die Abarbeitung in einem Block erfolgen muss. Isso.


// Objektorientiert
$mysqli = new mysqli('host''user''pw''db');
$query  '...;';
$query .= '...;';
if ($mysqli->multi_query($query)) {
  ...
}

// Prozedural
$mysqli mysqli_connect('host''user''pw''db');
$query  '...;';
$query .= '...;';
if (mysqli_multi_query($mysqli$query)) {
  ...
}

4. Die Erfassung

erfolgt in einer do ... while-Schleife. Wenn man nur mit while arbeitet, wird auch nur das Ergebnis des ersten Queries erfasst.


// Objektorientiert
if ($mysqli->multi_query($query)) {
  do {
      ...
  } 
  while ($mysqli->next_result());
}

// Prozedural
if (mysqli_multi_query($mysqli$query)) {
  do {
       ...
  } 
  while (mysqli_next_result($mysqli));
}

Ein Hinweis

Mit next_result hüpfen wir von einem Query zum nächsten. Dabei gibt diese Methode so lange ein true zurück, bis die letzte Abfrage erreicht wurde.

5. Die Daten

... werden dann im do-Block verarbeitet.


// Objektorieniert
do 
{
  if ($result $mysqli -> store_result()) {
    while ($row $result -> fetch_assoc()) {
      ...
    }
  }
  if ($mysqli -> more_results()) {
    ...
  }
}

// Prozedural
do 
{
  if ($result mysqli_store_result($mysqli)) {
    while ($row mysqli_fetch_assoc($result)) {
      ...
    }
  }
  if (mysqli_more_results($mysqli)) {
    ...
  }
}

Erläuterung

store_result

Diese Methode benötigt man, um die Ergebnismenge als Referenz zwischenzuspeichern. Die eigentliche Erfassung erfolgt dann durch Methoden der MySQLi_Result-Klasse. Zu der komme ich im Anschluss. Anstelle von store_result kann man auch ein use_result nehmen. Wer den genauen Unterschied wissen möchte, sollte sich das hier mal durchlesen.

more_results

Diese Methode gibt immer dann ein true zurück, wenn ein Query abgearbeitet wurde und der nächste anfängt. Und in einer entsprechenden Bedingung kann man alles Mögliche machen, um die Ergebnisse voneinander zu trennen.


$index 0;
do 
{
  ...
    while ($row $result -> fetch_assoc()) {
      $erg[$index][] = $row;
    }
  }
  if ($mysqli -> more_results()) {
    $index++;
  }
}

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt