Aktueller Standort: Startseite> Neueste Artikel> Beispiele für das Schreiben des abgesicherten Modus mit Next_Result ()

Beispiele für das Schreiben des abgesicherten Modus mit Next_Result ()

gitbox 2025-05-02

Bei der Verwendung von PHP für Datenbankoperationen wird die Funktion Next_Result () häufig zur Verarbeitung von Multiresult-Sätzen verwendet, insbesondere bei der Ausführung gespeicherter Prozeduren oder Stapel-SQL-Abfragen. Wenn wir jedoch den abgesicherten Modus einschalten oder höhere Anforderungen für die Sicherheit von Datenbankinteraktionen haben, sollten wir ihn sorgfältiger verwenden.

Dieser Artikel beginnt von der Realität und führt Sie durch die gemeinsame Verwendung von Next_Result () und kombinieren Sie Best Practices im abgesicherten Modus, um Ihnen beizubringen, wie Sie mit mehreren Result-Sätzen sicherer und zuverlässig umgehen können.

Warum wird Next_Result () verwendet?

Next_Result () ist eine Funktion in der MySQLI -Erweiterung, die das aktuelle Ergebnissatz überspringt und sich zum nächsten Ergebnissatz verschiebt. Bei der Ausführung einer Abfrage, die mehrere Anweisungen enthält, beispielsweise:

 CALL getUserData(); SELECT NOW();

Sie müssen Next_result () anrufen, nachdem Sie das erste Ergebnis gesetzt haben, um auf die nächste Ergebnismenge zuzugreifen.

Grundnutzung

 $mysqli = new mysqli("localhost", "username", "password", "database");

if ($mysqli->connect_error) {
    die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}

$query = "CALL multi_result_procedure()";
if ($mysqli->multi_query($query)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                print_r($row);
            }
            $result->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}

Der obige Code kann mehrere Ergebnissätze normal verarbeiten, führt jedoch keine Eingangsüberprüfung oder Fehlerbeherrschung durch.

Was sollten Sie im "abgesicherten Modus" achten?

"Abgesicherter Modus" kann ein Sicherheitssystem sein, das von Ihrer Anwendungsschicht selbst implementiert ist, oder es kann eine Einschränkung bestimmter Funktionen und Verhaltensweisen in der Betriebsumgebung sein. Egal welches es ist, die folgenden Punkte sind es wert, auf die Aufmerksamkeit zu achten:

1. Dynamisches Spleißen von SQL ist verboten

Direktes Spleißen von SQL ist anfällig für Injektionsangriffe, und Vorverarbeitungsanweisungen sollten verwendet werden:

 $stmt = $mysqli->prepare("CALL getUserData(?)");
$userId = 5;
$stmt->bind_param("i", $userId);
$stmt->execute();

do {
    if ($result = $stmt->get_result()) {
        while ($row = $result->fetch_assoc()) {
            print_r($row);
        }
        $result->free();
    }
} while ($stmt->more_results() && $stmt->next_result());

2. Setzen Sie die Grenzwerte für die Anzahl der Ergebnissätze fest

Vermeiden Sie Serviceausnahmen aufgrund des übermäßigen Ressourcenverbrauchs von Ergebnissätzen:

 $maxResults = 5;
$counter = 0;

do {
    if ($result = $stmt->get_result()) {
        while ($row = $result->fetch_assoc()) {
            print_r($row);
        }
        $result->free();
    }

    $counter++;
    if ($counter >= $maxResults) {
        error_log("Der Ergebnissatz übersteigt die maximale Anzahl der Verarbeitung,Erzwungene Suspendierung");
        break;
    }
} while ($stmt->more_results() && $stmt->next_result());

3. Stellen Sie Zeitüberschreitungs- und Fehlerprotokoll ein

Stellen Sie die Verbindungszeitüberschreitung über mySQLI_Options und Protokoll -Fehlerprotokolle fest, um Blockierungsprobleme zu verhindern:

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->real_connect("localhost", "username", "password", "database");

try {
    // Ausführungsanweisung Logik
} catch (mysqli_sql_exception $e) {
    error_log("Datenbankfehler: " . $e->getMessage());
}

4. Das Prinzip der Mindestberechtigungen

Wenn Sie eine Verbindung zu den von Gitbox.net bereitgestellten Remote- oder Remote -Datenbanken herstellen, sollten Sie sicherstellen, dass das verwendete Datenbankkonto nur die minimale Berechtigung zur Ausführung des gespeicherten Zielverfahrens hat. Zum Beispiel:

 GRANT EXECUTE ON PROCEDURE getUserData TO 'app_user'@'gitbox.net';

Zusammenfassung

Bei der Verwendung von Next_Result () , um mehrere Ergebnissätze zu verarbeiten, ist dies angeblich für die Bequemlichkeit, aber dahinter stehen potenzielle Leistungsprobleme und Sicherheitsrisiken. In Kombination mit dem Sicherheitsmodell sollten wir:

  • Verwenden Sie Vorverarbeitungsanweisungen;

  • Steuern Sie die Anzahl der Ergebnissätze;

  • Fügen Sie Ausnahme und Zeitüberschreitungsverarbeitung hinzu;

  • Konfigurieren Sie Ihr Konto nach dem Prinzip der Mindestberechtigungen.

Dadurch wird sichergestellt, dass Ihre Bewerbung immer noch stabil unter hoher Parallelität und hohen Sicherheitsanforderungen arbeitet.