mysql error number: 1064

Eiriksun
Hallo @ all,
ich habe jetzt schon einige Seiten hier durchgewüselt aber nichts zu meinem Problem hier finden können.

Ich mußte ein Backup einspielen und wenn ich jetzt einige Benutzer in der Acp bearbeiten möchte bekomme ich folgende Meldung.



Zitat:
SQL-DATABASE ERROR Database error in WoltLab Burning Board (2.3.6): Invalid SQL: SELECT * FROM bb2_avatars WHERE (userid = 0 AND groupid IN (0,,2,14) AND needposts <= '2709') OR userid = '9' ORDER BY userid DESC mysql error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2,14) AND needposts <= '2709') OR userid = '9' ORDER BY userid DESC' at line 1 mysql error number: 1064 mysql version: 5.1.54-0.dotdeb.0-log php version: 5.2.16-0.dotdeb.0 Date: 07.02.2012 @ 21:16 Script: /wbb/acp/users.php?action=edit&userid=9&sid=

nun mein englisch ist nicht das aller beste und irgend wie verstehe ich das auch, nur was soll ich jetzt machen.
Ist da jemand der mir da helfen kann.

G
Eiriksun
Steinadler
Da ist ein Komma zuviel:

php:
1:
groupid IN (0,,2,14)


so sollte es sein:

php:
1:
groupid IN (0,2,14)
Eiriksun
ok nur wo muß ich denn suchen in acp/user.php finde ich nichts
Pigsel
FROM bb2_avatars WHERE (userid = 0 AND groupid IN (0,,2,14)

versuch es mal in der Tabelle avatars
Eiriksun
mit phpMyAdmin oder wie, sorry das ich so dusselig frage aber ich komme so nicht weiter
Schrimm
Nein, das Problem liegt in der users.php.

Die Suchstelle lautet "AND groupid IN (" und dahinter befinden sich wahrscheinlich Variablen anstatt der Zahlen.

Alternativ kannst du auch einfach mal nach ",," suchen, also zwei Beistrichen hinteinander.

Wenn du eine solche Stelle besitzt, löscht du einfach einen Beistrich.

Solltest du das Problem immer noch nicht finden, dann hänge die users.php im ZIP-Archiv an.
Eiriksun
So ich habe mir die Users.php angeschaut konnte aber keine ",," finden. Ich habe jetzt mal die Users.php aus dem Acp Verzeichnis als zip angehangen.
Schrimm
Die Datei ist in Ordnung.

Jedoch könnte es sein, dass bei der Einspielung des Backups ein Fehler aufgetreten ist.

Bei gewissen Benutzern könnte sich (wbb2) in der user2groups-Tabelle Leerspalten(eine Zeile mit einer leeren Spalte) befinden.

Dadurch könnte es passieren, dass das "Gruppenid-Array"($user['groupids']), eines Users, beispielweise folgendermaßen befüllt wird:

php:
1:
2:
3:
$user['groupids'][0] = 
$user['groupids'][1] = 2
$user['groupids'][2] = 14

Wie man erkennt, befindet sich, im Array, an der Position 0 kein Eintrag.
Nun wird die Funktion implode() auf das Array angwandt, die einen Beistrich zwischen jedes Element hinzufügt und einen String daraus macht.

Der String sehe nun so aus:

,2,14

Der Beistrich vor der zwei ist jedoch für den weiteren Ablauf schädlich.
Mit dem ganzen Befehl der Zeile dann wie folgt:

...userid = 0 AND groupid IN (0,,2,14) AND...

Dieser Befehl ist aber ungültig und das besagt auch die Fehlermeldung.

Fehlerbehebung
Variante 1:
Du müsstest die user2groups-Tabelle anschauen und überprüfen, ob dort Einträge mit "Nulleinträgen" vorhanden sind und die Userid mit der ID des Benutzer überprüfen, bei dem der Fehler auftritt.
Die Nulleinträge sind wahrscheinlich die Fehlerquelle.

Variante 2:
Einen MySQL-Befehl ausführen, der dir automatisch diese "falschen Einträge" löscht.

Variante 3:
Du müsstest eine Sicherungsabfrage bei der implode()-Funktion oder vorher einbauen, die dir diese "Leerspalten" ignoriert bzw. eine Fehlerbehebung vornimmt.
Stichwort: Trinitäts-Operator/Ternary Operator (Kurzform der If/else-Bedingung)