Aktueller Standort: Startseite> Neueste Artikel> Kombinieren

Kombinieren

gitbox 2025-05-06

Während des Entwicklungsprozesses mit Codesigniter (insbesondere Codesigniter 3) müssen wir manchmal Anweisungsblöcke (Multi-Query) mit mehreren SQL-Abfragen ausführen. Zum Beispiel möchten wir möglicherweise mehrere gespeicherte Prozeduren gleichzeitig aufrufen oder mehrere Abfragen in einer Anfrage zur Verbesserung der Effizienz ausführen.

Bei Verwendung von Abfragen mit mehreren Statements ist jedoch ein häufiges Problem: Nur auf die erste Ergebnismenge kann zugegriffen werden, und andere Ergebnissätze können nicht erhalten werden . Dies liegt daran, dass Codesigniter bei Verwendung von MySQLI -Treibern nicht automatisch mehrere Ergebnissätze verarbeitet. Um dieses Problem zu lösen, müssen wir die Methode $ this-> db-> next_result () manuell aufrufen, um das vorherige Ergebnissatz aufzuräumen und das System für das nächste vorzubereiten.

In diesem Artikel wird angezeigt, wie Sie in CodeIgniter ordnungsgemäß als Next_Result () verwendet werden, um Abfragen mit mehreren Statements zu behandeln.

Basisbeispiel: Verwenden Sie Multi_query und Next_Result ()

Nehmen wir an, Sie haben eine gespeicherte Prozedurdatei oder führen Sie SQL wie die folgende direkt im Controller aus:

 $sql = "
    CALL get_users(); 
    CALL get_orders();
";

Um diese Art von Multi-Statement-SQL auszuführen, können Sie die Query () -Methode verwenden und die Ergebnismenge manuell verwalten:

 $result = $this->db->query("CALL get_users();");

if ($result) {
    $users = $result->result();

    // Reinigen Sie das erste Ergebnissatz
    $result->free_result();
    $this->db->next_result();

    // Holen Sie sich das zweite Ergebnissatz
    $result2 = $this->db->query("CALL get_orders();");

    if ($result2) {
        $orders = $result2->result();

        // Wieder aufräumen
        $result2->free_result();
        $this->db->next_result();
    }
}

Diese Methode ist geeignet, um nur eine gespeicherte Prozedur gleichzeitig aufzurufen und dann die nächste Anweisung manuell auszuführen. Wenn Sie jedoch mehrere SQL -Anweisungen gleichzeitig ausführen möchten, z. B.:

 $sql = "
    CALL get_users(); 
    CALL get_orders(); 
    CALL get_products();
";

Es kann mit Hilfe der nativen Multi_query () -Funktion von MySQLI implementiert werden.

Verwenden Sie die Multi_query -Methode von MySQLI

Wenn Sie in Codesigniter den MySQLI -Treiber verwenden, können Sie dies tun:

 $mysqli = $this->db->conn_id; // Holen Sie sich das zugrunde liegende MySQLi Verbindung zu Ressourcen herstellen

$sql = "
    CALL get_users(); 
    CALL get_orders(); 
    CALL get_products();
";

if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            // Verarbeiten Sie das aktuelle Ergebnissatz
            $data[] = $result->fetch_all(MYSQLI_ASSOC);
            $result->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}

Dieser Code holt nacheinander mehrere Ergebnissätze und verwendet Next_Result () , um die nächste vorzubereiten.

Empfehlungen für die korrekte Nutzung in Codesigniter

Obwohl Sie Multi_query () direkt verwenden können, wird dringend empfohlen, mehrere Anweisungen separat auszuführen , insbesondere wenn Sie hohe Anforderungen an Sicherheit und Stabilität haben. Für Datenbankvorgänge werden die folgenden Praktiken empfohlen:

  1. Rufen Sie Free_Result () und Next_Result () nach jeder Abfrage an, um die Verbindung zu beseitigen.

  2. Vermeiden Sie es, mehrere Anrufe direkt in das Modell zu schreiben, aber stattdessen in einen einzelnen Aufruf zusammenfassen, und logische Steuerung wird in der PHP -Schicht platziert.

  3. Wenn Sie multi_query () verwenden müssen, stellen Sie sicher, dass Sie alle zurückgegebenen Ergebnissätze verarbeiten und die Fehler "Befehle aus der Synchronisierung" vermeiden.

Beispiel: Kapselung in die Modellmethode

Sie können diesen Vorgang in eine Modellmethode zusammenfassen und ein Array mit mehreren Datensätzen zurückgeben:

 public function get_multi_data()
{
    $mysqli = $this->db->conn_id;

    $sql = "
        CALL get_users(); 
        CALL get_orders(); 
        CALL get_products();
    ";

    $data = [];

    if ($mysqli->multi_query($sql)) {
        do {
            if ($result = $mysqli->store_result()) {
                $data[] = $result->fetch_all(MYSQLI_ASSOC);
                $result->free();
            }
        } while ($mysqli->more_results() && $mysqli->next_result());
    }

    return $data;
}

Im Controller können Sie es so nennen:

 $this->load->model('Data_model');
$result_sets = $this->Data_model->get_multi_data();

$users = $result_sets[0];
$orders = $result_sets[1];
$products = $result_sets[2];

Tipps: Achten Sie beim Debuggen auf die Protokollausgabe

Beim Debuggen von Multi-Statement-Abfragen wird empfohlen, die Protokollierungsfunktion von Codesigniter zu aktivieren und den Inhalt in Anwendungen/Protokollen zu beobachten, um Fehlerbehebungsfehler zu erleichtern.