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