Auswirkungen der Funktion mysqli_report

25. August 2008
Als ich mich erstmals mit der MySQL-Erweiterung (MySQL Improved Extension) befasste und ein kleines Testskript schrieb, passierte etwas Unverständliches - mein phpMyAdmin stürzte plötzlich und ohne erkennbaren Grund ab. Das Error-Log zeigte mir folgenden Fehler an:
 
[11-Sep-2007 23:36:18] PHP Fatal error:  Uncaught exception 'mysqli_sql_exception'
with message 'No index used in query/prepared statement
SHOW SESSION VARIABLES LIKE 'collation_connection';'
in /srv/www/htdocs/phpMyAdmin/libraries/dbi/mysqli.dbi.lib.php:187
Stack trace:
#0 /srv/www/htdocs/phpMyAdmin/libraries/dbi/mysqli.dbi.lib.php(187):
mysqli_query(Object(mysqli), 'SHOW SESSION VA...', 0)
#1 /srv/www/htdocs/phpMyAdmin/libraries/database_interface.lib.php(929):
PMA_DBI_try_query('SHOW SESSION VA...', Object(mysqli), 1)
...
 
Scheinbar schien es sich um ein Problem des phpMyAdmin zu handeln. Ich konnte aber nicht erkennen, warum diese Exception geworfen wurde. Außerdem waren diese Exceptions nicht reproduzierbar - sie passierten einfach. Ich google'te etwas herum, fand auch einiges zu dieser Exception, aber keiner der Vorschläge hatte irgendwie mit phpMyAdmin zu tun. Zufällig fand ich jedoch irgendwo die Erwähnung der Funktion mysqli_report. An der angegebenen Stelle (Zeile 187 in der mysqli.dbi.lib.php) fand ich aber diese Funktion nicht. Außerdem viel mir noch auf, dass der phpMyAdmin immer in Verbindung mit dem Aufruf meines Test-Skripts abstürzte. Also kommentierte ich den Aufruf von mysqli_report(MYSQLI_REPORT_ALL) in meinem Skript aus und startete den Webserver, das Skript sowie phpMyAdmin neu. Alles funktionierte prima. Danach nahm ich die Report-Funkton wieder auf, allerdings mit dem Parameter MYSQLI_REPORT_ERROR. Auch hier funktionierte alles prima.
 
Ein Blick in die Beschreibung von mysqli_report auf php.net half mir zu verstehen, warum es zu dieser Exception kam: Ich verwendete eine Query, in der ich keine Indizes angab - ich wollte einfach alle Datensätze auslesen. Da ich aber der Funktion mysqli_report als Parameter den Wert MYSQLI_REPORT_ALL übergeben hatte, wurden auch Reports (bzw. Exceptions) für Queries ausgelöst, die keine bzw. schlechte Indizes verwendeten. Okay soweit, aber warum musste mein phpMyAdmin mit darunter leiden? Der Grund lag darin, dass der letzte Aufruf von mysqli_report das Reporting für jeden Prozess setzt der mysqli benutzt. Dies war beim phpMyAdmin der Fall. Er benutzte ebenfalls Indexlose-Queries und löste damit diese Exception aus.
 

Hast Du etwas dazu zu sagen? Dann tu's doch!
HILFE
Code-Beispiele werden mit den BBCodes [code][/code] dargestellt. Jedes Tag muss eine Zeile für sich allein haben, d.h der Beispiel-Code muss wirklich ZWISCHEN den Tags stehen. Beispiel:
[code] ACHTUNG! HIER UMBRUCH WICHTIG. TAG [code] MUSS ALLEIN STEHEN
#include <stdio.h>

int main( void ){
    return 0;
} ACHTUNG! HIER UMBRUCH WICHTIG. NACHFOLGENDES TAG [/code] MUSS ALLEIN STEHEN
[/code]

Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
Dein Name *
Deine Email
Deine Website
Vorschau