Aktueller Standort: Startseite> Neueste Artikel> Warum werden die von MySQL_Info zurückgegebenen Daten manchmal ungenau? Ursachen und Lösungen dahinter

Warum werden die von MySQL_Info zurückgegebenen Daten manchmal ungenau? Ursachen und Lösungen dahinter

M66 2025-06-27

Bei der Verwendung von PHP zur Entwicklung von Anwendungen mit MySQL verwenden einige Entwickler MySQL_Info () oder MySQLi_Info (), um zusätzliche Informationen zu erhalten, nachdem bestimmte SQL -Operationen durchgeführt wurden, z. Manchmal können Sie jedoch feststellen, dass die zurückgegebenen Daten ungenau sind und sogar falsche oder leere Zeichenfolgen direkt nach einigen Operationen zurückgeben. Was ist mit diesem "unzuverlässigen" Verhalten los? Dieser Artikel beginnt mit seinem Arbeitsprinzip, analysiert die Gründe und liefert Bewältigungsstrategien.

1. Was macht MySQL_Info () ?

MySQL_Info () wird hauptsächlich verwendet, um eine kurze Beschreibung des Ausführungsstatus zu erhalten, nachdem bestimmte nicht-selekte Anweisungen ausgeführt wurden, z. B.:

 $link = mysqli_connect("localhost", "user", "pass", "testdb");
mysqli_query($link, "UPDATE users SET status = 1 WHERE id < 100");
echo mysqli_info($link);

Der Rückgabeinhalt kann sein:

 Rows matched: 100 Changed: 100 Warnings: 0

Diese Ausgabeinformationen sind sehr nützlich, wenn Sie Stapelvorgänge debuggen, z. B. festzustellen, wie viele Zeilen übereinstimmen und wie viele Zeilen geändert werden. Dies hängt jedoch von den von der zugrunde liegenden MySQL zurückgegebenen Statussinformationen ab.

2. Warum sind manchmal ungenau?

1. Nicht alle Aussagen geben Informationen Informationen zurück

Nicht alle nicht ausgewählten Operationen generieren Informationeninformationen , und die offizielle MySQL-Dokumentation gibt auch eindeutig fest, dass nur die folgenden Aussage-Typen diese Informationen bereitstellen können:

  • Einfügen in ... Wählen Sie ...

  • AKTUALISIEREN

  • LÖSCHEN

  • Daten laden

Aussagen wie gewöhnlicher Einfügen , Ersetzen usw., insbesondere in Szenarien, in denen Daten nicht durch Unterabfragen eingefügt werden, füllen häufig den Info -Cache nicht aus.

2. Auswirkungen auf das kundenorientierte Verhalten

Die von PHP verwendete MySQL -Client -Bibliothek (libmysql oder mySQLND) wirkt sich auch auf die Erwerb von Informationen aus. Bei Verwendung von MySQLND (MySQL Native Treiber) ist der von MySQLI_Info () zurückgegebene Inhalt zuverlässiger. Wenn es sich um libmysql handelt, werden einige Informationen möglicherweise nicht aufgezeichnet oder zurückgegeben.

3.. Multi-Statement Execution Overwrite Info

Wenn mehrere SQL -Anweisungen in einer Verbindung ausgeführt werden (z. B. Stapelverarbeitung), gibt MySQLi_Info () nur die Info -Informationen der letzten Anweisung zurück. Das heißt:

 mysqli_query($link, "UPDATE table1 SET name = 'A'; UPDATE table2 SET name = 'B';");
echo mysqli_info($link); // Wird nur zurückkehren table2 Ausführungsinformationen

Dies lässt viele Entwickler fälschlicherweise glauben, dass die vorherigen Operationen nicht ausgeführt wurden oder keine Wirkung haben.

4. MySQL -Konfiguration und -versionsbeschränkungen

Verschiedene MySQL -Serverversionen haben Unterschiede bei der Rückgabe von Info -Inhalten. Beispielsweise zählen ältere Versionen möglicherweise keine Zeilen, die übereinstimmen oder Warnungen entsprechen, oder es gibt einen Fehler, der die falsche Anzahl von Zeilen zurückgibt. Darüber hinaus kann eine statistische Logik übersprungen werden, wenn einige Leistungsoptimierungsoptionen aktiviert sind.

3..

1. Verwenden Sie MySQLI und MySQLND -Treiber

Stellen Sie sicher, dass der MySQLND -Treiber in der PHP -Umgebung aktiviert ist. Sie können es wie folgt überprüfen:

 if (function_exists('mysqli_get_client_stats')) {
    echo "mysqlnd Ermöglicht";
}

MySQLND bietet eine umfassendere und standardisierte Unterstützung, die für Produktionsumgebungen eher empfohlen wird als libmysql.

2. Vermeiden Sie es, sich auf Informationen in mehreren Aussagen zu verlassen

Verlassen Sie sich nicht auf die Rückgabe von Informationen in mehreren Aussagen (multi_query). Jede Anweisung sollte separat ausgeführt werden und die entsprechenden Info -Informationen sollten sofort gelesen werden, um zu verhindern, dass sie durch nachfolgende Aussagen überschrieben wird.

 mysqli_query($link, "DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY");
$logInfo = mysqli_info($link);
echo "Protokollreinigungsergebnisse:" . $logInfo;

3.. Statistiken der wichtigsten Daten selbst basieren auf der Semantik

Für einige wichtige SQL -Operationen wird empfohlen, sich nicht ganz auf die von MySQL_Info () zurückgegebene Textbeschreibung zu verlassen, sondern durch eine zusätzliche Abfrage oder Protokollierung auf der Grundlage der Geschäftslogik zu überprüfen. Reinigen Sie beispielsweise den Unterschied in der Zeilenzahl vor und nach oder sorgen Sie für eine genaue Ausführung durch die Transaktionskontrolle.

4. Vermeiden Sie eine irreführende Anzahl von Zeilenanzeigen

Beachten Sie, dass sich geändert hat: 0 bedeutet nicht, dass SQL nicht erfolgreich ausgeführt wurde. Es kann sein, dass sich die Daten selbst nicht geändert haben (z. B. auf demselben Wert aktualisiert). Dieses Szenario ist im Update sehr häufig und erklärt auch, warum Sie sehen, dass Zeilen übereinstimmen, sich jedoch geändert haben: 0 .

4.. Debugging -Fähigkeiten

Um effizienter zu debuggen und aufzunehmen, können Informationen mit den folgenden Methoden in die Protokollierung oder an der Hintergrundschnittstelle angezeigt werden:

 $sql = "UPDATE users SET status = 0 WHERE active = 0";
mysqli_query($link, $sql);
file_put_contents("/var/log/mysql_ops.log", date('Y-m-d H:i:s') . " " . $sql . " => " . mysqli_info($link) . "\n", FILE_APPEND);

Diese Betriebsdatensätze können auch über die Schnittstelle an das Remote -Überwachungssystem gesendet werden: