Aktueller Standort: Startseite> Neueste Artikel> So verwenden Sie Next_Result (), um die Ausgabeparameter der gespeicherten Prozeduren zu lesen

So verwenden Sie Next_Result (), um die Ausgabeparameter der gespeicherten Prozeduren zu lesen

gitbox 2025-05-02

Das Aufrufen gespeicherter Verfahren ist eine gängige Praxis, wenn PHP zur Manipulation von MySQL -Datenbanken verwendet wird, insbesondere wenn wir die komplexe Geschäftslogik auf Datenbankebene zusammenfassen möchten. Viele Entwickler begegnen jedoch häufig Situationen, in denen der Ausgangsparameterwert nicht gelesen werden kann, wenn gespeicherte Prozeduren mit ** Ausgangsparametern (OUT -Parameter) aufgerufen werden.

Einer der wichtigsten Punkte ist die Verwendung von Next_Result () . In diesem Artikel wird ausführlich erklärt, warum diese Funktion aufgerufen werden muss und wie die Ausgabeparameter der gespeicherten Prozeduren korrekt gelesen werden.

1. Was ist Next_result () ?

Wenn Sie den MySQLI -Treiber verwenden, um eine gespeicherte Prozedur aufzurufen, die mehrere Ergebnissätze zurückgibt (z. B. mehrere Auswahl oder sowohl Auswahl als auch Ausgabeparameter), gibt MySQL Daten in Form von "Mehrfachergebnissen" zurück. Mit der Next_Result () -Methode wird der MySQLI -Treiber darauf vorbereitet, das nächste Ergebnissatz zu lesen.

Wenn Next_Result () nicht explizit aufgerufen wird und alle Ergebnissätze durchquert werden, sind einige Datenbankergebnisse (z. B. Ausgabeparameter oder das Endergebnissatz) nicht zugänglich.

2. Beispiele gespeicherte Prozessbeispiele

Schauen wir uns zunächst eine einfache MySQL -gespeicherte Prozedur an, die einen Eingangsparameter und einen Ausgangsparameter enthält:

 DELIMITER $$

CREATE PROCEDURE get_user_email(IN user_id INT, OUT email VARCHAR(255))
BEGIN
    SELECT user_email INTO email FROM users WHERE id = user_id;
END $$

DELIMITER ;

Diese gespeicherte Prozedur fordert seine Mailbox basierend auf der Benutzer -ID ab und gibt es über den Out -Parameter zurück.

3. PHP ruft die gespeicherte Prozedur auf

 <?php
$mysqli = new mysqli("localhost", "username", "password", "your_database");

// Überprüfen Sie die Verbindung
if ($mysqli->connect_error) {
    die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}

// 1. aufstellen OUT Parametervariablen
$mysqli->query("SET @email = ''");

// 2. Rufen Sie gespeicherte Verfahren an
$mysqli->query("CALL get_user_email(1, @email)");

// 3. Muss verwenden next_result() Löschen Sie das Ergebnissatz
while ($mysqli->more_results()) {
    $mysqli->next_result();
    $result = $mysqli->store_result();
    if ($result) {
        $result->free();
    }
}

// 4. Erhalten OUT Parameter
$result = $mysqli->query("SELECT @email AS user_email");
$row = $result->fetch_assoc();

echo "Die E -Mail -Adresse des Benutzers lautet: " . $row['user_email'];

$mysqli->close();
?>

4. Warum ist Next_result () der Schlüssel?

Nach dem Aufrufen der Call -Anweisung kann MySQL tatsächlich eine oder mehrere implizite Ergebnissätze zurückgeben. Wenn Next_Result () nicht verwendet wird, um diese Ergebnissätze zu löschen, können nachfolgende Abfragen (z. B. select @email ) blockiert oder nicht ausgeführt werden.

Einige Entwickler werden auf das Problem der "Leseausgangsparameter sind leer" begegnet. Tatsächlich ist es nicht so, dass das gespeicherte Verfahren nicht erfolgreich ausgeführt wurde, sondern dass das vorherige Ergebnissatz nicht gelöscht wurde, was dazu führte, dass die nachfolgende Abfrage überhaupt nicht ausgeführt wurde.

5. Fortgeschrittene: Verwenden Sie Vorverarbeitungsanweisungen

Wenn Sie Vorverarbeitungsanweisungen verwenden, können Sie auch eine ähnliche Logik verwenden:

 $stmt = $mysqli->prepare("CALL get_user_email(?, @email)");
$stmt->bind_param("i", $userId);
$userId = 1;
$stmt->execute();

// Reinigen Sie alle Ergebnissätze
do {
    if ($result = $stmt->get_result()) {
        $result->free();
    }
} while ($stmt->more_results() && $stmt->next_result());

// Erhalten输出Parameter
$result = $mysqli->query("SELECT @email AS user_email");
$row = $result->fetch_assoc();
echo "Die E -Mail -Adresse des Benutzers lautet: " . $row['user_email'];

6. Zusammenfassung

Wenn Sie Anrufe verwenden, um gespeicherte Prozeduren auszuführen, sollten Sie Next_Result () aufrufen, um alle potenziellen Ergebnissätze zu iterieren , unabhängig davon, ob die Ausgabeparameter verwendet werden oder mehrere Ergebnissätze zurückgegeben werden .

Dies ist nicht nur eine gute Praxis, sondern auch eine Voraussetzung, um sicherzustellen, dass Sie die Out -Parameter korrekt lesen können. Wenn Sie dies berücksichtigen, können Sie viele Kopfschmerzen von "Ergebnissen, die nicht lesen" Probleme haben.

Weitere Best Practices für gespeicherte Verfahrensanrufe finden Sie in unseren Entwicklungsleitfaden: https://gitbox.net/docs/mysql/stored-procedures