Seite 1 von 1

user_level von Moderator wird nicht gelöscht (+Bugfix)

Verfasst: 11.02.2005 13:52
von XChrome
Ich weiß nicht, obs bei anderen auch so ist, aber wenn ich einem Moderator komplett wieder zum normalen User machen will, wird im Table phpbb_users der user_level nicht wieder von 2 auf 0 zurückgesetzt. Vorher gabs aufgrund der Fehlprogrammierung des phpbb ja schon diesen Bugfix *klick*. Mein Forum läuft auf php5, deshalb kann ich jetzt nicht sagen, ob der Bug schon in php4 war. mySQL gibt bei der Anfrage der Summe 'NULL' zurück, geprüft wird aber nach 'HAVING SUM(aa.auth_mod) = 0', was unter PHP5 nicht identisch ist. Ich glaube aber sogar, dass das auch unter PHP4 so ist, weil die Datenbank ansich in dem Fall schon keine user_ids zurückgibt.

Für alle, die dieses Problem auch haben, hab ich folgenden Bugfix parat:

Code: Alles auswählen

Öffne admin/admin_ug_auth.php

Suche nach: (kommt 2x vor - letzteres ersetzen!)
HAVING SUM(aa.auth_mod) = 0";

ändern in:
HAVING COUNT(aa.auth_mod) = 0";
Evtl könnte der Code für oracle & postgresql darüber dementsprechend auch geändert bzw verkürzt werden... müsste mal jemand ausprobieren. Danach wird das user_level wieder korrekt zurückgesetzt und die ehemaligen Moderatoren nicht mehr überall im Forum als Moderator ausgewiesen.

Verfasst: 12.02.2005 00:30
von Dennis63
Mit PHP5 ist nen BUG im phpBB. Steht sogar in den Ankündigungen.

Schaue Dir mal hier Post Nummer 380602 an da steht ne Lösung.

Grüße
Dennis

Verfasst: 12.02.2005 14:44
von XChrome
Das hab ich schon gelesen. Allerdings ist dort nirgends DIESER Bug mit dem user_level aufgeführt, den ich hier genannt habe. Ich habe das jetzt extra unter PHP4 auch getestet und auch da wird user_level wird nicht zurückgesetzt. Und das hat in dem Falle auch nichts mit PHP5 zu tun, weil mysql ansich über das Query nichts zurückgibt. Auszug aus der mysql-Doku bestätigt dies doch auch:
SUM(ausdruck)

Gibt die Summe von ausdruck zurück. Beachten Sie, dass der Rückgabewert NULL ist, wenn die Ergebnismenge keine Zeilen hat!
Unter mysql ist NULL im Gesensatz zu PHP (egal ob PHP4 oder 5) nicht 0. Ein einfaches mySQL-Query beweist das schon:

Code: Alles auswählen

SELECT 0 IS NULL, NULL IS NULL
Gibt 0 und 1 zurück. Somit kann die Abfrage nach den user_ids, die nicht mehr im auth_access-table vorhanden sind, mittels SUM auch nicht funktionieren.

Code: Alles auswählen

				$sql = "SELECT u.user_id 
					FROM ( ( " . USERS_TABLE . " u  
					LEFT JOIN " . USER_GROUP_TABLE . " ug ON ug.user_id = u.user_id ) 
					LEFT JOIN " . AUTH_ACCESS_TABLE . " aa ON aa.group_id = ug.group_id ) 
					WHERE u.user_level NOT IN (" . USER . ", " . ADMIN . ")
					GROUP BY u.user_id 
					HAVING SUM(aa.auth_mod) = 0";
Wie kann also in der letzten Zeile SUM(aa.auth_mod) = 0 sein, wenn mysql in dem Fall NULL zurück gibt und NULL unter mysql nicht identisch mit 0 ist? Nur COUNT gibt in dem Fall 0 zurück und liefert somit die user_ids, deren user_level zurückgesetzt werden sollen.