MyBB.de Forum

Normale Version: Nützliche MySQL Befehle
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Dieses Tutorial hat MattRogowski von MyBB.com ursprünglich hier erstellt. Wir haben uns entschlossen, dies auch in unserem Forum aufzunehmen und um den ein oder anderen Befehl zu ergänzen.

Gleich zu Beginn das Wichtigste!

Führt SQL Queries wirklich nur dann aus, wenn Ihr Euch darüber absolut sicher seid, was dieser Query bewirkt und wenn Ihr der Person vertraut, die Euch einen Query hat zukommen lassen. Das Arbeiten mit SQL Queries ist wie das berühmt berüchtigte Spiel mit dem Feuer. Ein kleiner Fehler kann sehr viel oder alles zerstören oder Dich zumindest in große Problem stürzen. Wer sich nicht sicher ist, sollte lieber zweimal im Forum nachfragen oder/und vorher ein Backup der Datenbank erstellen. Lieber ein Backup der Datenbank zu viel, als ein Forum komplett neu aufbauen zu müssen.


Was ist ein SQL Query?

Zunächst einmal sind es Befehle, die in einem Datenbank Manager wie z.B. PHPMyAdmin ausgeführt werden und Datenbankeinträge ändern, ergänzen oder auch löschen. Für gewöhnlich werden sie verwendet, wenn eine große Menge an Daten editiert oder geändert werden sollen.


Wie sehen solche Befehle aus?

Prinzipiell gibt es zwei unterschiedliche Schreibweisen, die wir uns hier mal ansehen wollen. Als Beispiel nehmen wir einen Befehl, mit dem man die Beitragszahl des Admins auf 1 setzen kann.

PHP-Code:
UPDATE `mybb_usersSET `postnum` = '1' WHERE `uid` = '1' 
oder
PHP-Code:
UPDATE mybb_users SET postnum=1 WHERE uid=

Dieser Query führt ein update der Tabelle mybb_users durch. Es setzt (set) den Eintrag in postnum (steht für die Beitragszahl) dort auf 1, wo die uid (User-ID) 1 ist. Vergleiche die fett gedruckten Werte mit dem o.a. Query in den PHP-Tags. Wenn wir nun dieses Query ausführen, sollte als Ergebnis ausgegeben werden, dass genau eine Tabellenreihe (table row) betroffen war, nämlich von dem User mit der User-ID 1, der normalerweise der Super-Admin ist.

Beachte auch, dass diese beiden Beispiele ein unterschiedliches Layout aufweisen. Eines nutzt die Zeichen ` und ' inklusive Leerezeichen, während das andere Query dies nicht nutzt. Kurz und gut, jedes der beiden Beispiele funktioniert, aber auf eines ist zu achten: Wenn Du das erste Layout nutzt, musst Du darauf achten, dass Du die korrekten Zeichen für ` und ' verwendest. Datenbanktabellen und -spalten benötigen ein `, während die Einträge, die geändert werden sollen, ein ' benötigen. SQL query Funktionen sind unabhängig von Groß- und Kleinschreibung, so dass sowohl UPDATE/update, SET/set und z.B. WHERE/where funktioniert, egal ob in großen Buchstaben oder eben nicht.

Um in einem Query eine spezielle Datenbank anzusprechen, würde die Zeile wie folgt aussehen:
PHP-Code:
UPDATE `database_name`.`mybb_usersSET `postnum` = '1' WHERE `uid` = '1' 

Wie Du sehen kannst, befindet sich hier der Datenbankname innerhalb von zwei ` Zeichen. Die Datenbanktabelle wird direkt mit einem Punkt . angehängt.


Was kann schief gehen?

Wenn Du SQL Queries ausführst, musst Du Dir sicher sein, was Du machst und welche Auswirkungen der Query hat. Die Änderungen durch den Query können nicht rückgängig gemacht werden. Wenn Du z.B einen Query ausführst, der eine bestimmte E-Mail Adresse jedem einzelnen User zuordnet, dann wirst Du im ACP auf ziemlich viel Ärger stoßen und Du wirst das nicht rückgängig machen können. Hier ein klassisches Beispiel, was schief gehen kann:

PHP-Code:
UPDATE `mybb_usersSET `email` = 'email@domain.com' WHERE `uid` = '1' 

Dieser Query setzt die E-Mail Adresse des Users mit der uid 1 auf email@domain.com. Hier haben wir eine spezifische uid und die Änderung wird nur die eine Tabellenreihe mit der uid 1 betreffen. Wenn man aber nun

PHP-Code:
UPDATE `mybb_usersSET `email` = 'email@domain.com' 

ausführt, dann haben wir den Salat.

Du hast die E-Mail Adresse von allen Usern auf email@domain.com gesetzt, da Du keine spezifische Tabellenreihe abgefragt hast. Dies wird im ACP zu Fehlern bei den Usern führen. Diese haben z.B. keine Chance mehr, sich ein neues Passwort zusenden zu lassen, bekommen keine Mails mehr zu abonnierten Themen usw. usf.

Manchmal kann man die WHERE-Bedingung aber auch weglassen, wie wir weiter unten sehen werden. Wir machen das, wenn wir wirklich alle einzelnen Einträge einer Tabelle einheitlich ändern wollen. Wie z.B. beim Zurücksetzen aller Avatare.


Welche Queries könnten nun für Dich von Interesse sein?

Die meisten Queries, die Du jemals benötigen wirst, werden wohl sogenannte UPDATE Queries sein. Hier werden Datenbankeinträge aktualisiert, während ADD oder REMOVE Queries die Datenbanktabellen oder auch die Datenbankstruktur verändern. Es gibt aber noch ein paar andere Queries, die wir gut gebrauchen können.

Nachfolgend findet Ihr ein paar Queries, die interessant sein könnten bzw. im Forum immer wieder angefragt werden. Achtet bitte darauf, dass einige dieser Queries noch zusätzliche Aktionen nach sich ziehen können, wie z.B. Templateänderungen, damit User bestimmte Einstellungen, die Ihr extra geändert habt, nicht wieder rückgängig machen können.

Klassische Ansicht für alle User (Templateänderungen sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `classicpostbit` = '1' WHERE `classicpostbit` = '0' 

Horizontale Ansicht für alle User (Templateänderungen sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `classicpostbit` = '0' WHERE `classicpostbit` = '1' 

Zurücksetzen eines Passwortes auf 'test' (X muss hier durch die uid des Users ersetzt werden, dessen Passwort ersetzt werden soll):
PHP-Code:
UPDATE `mybb_usersSET `password` = '098f6bcd4621d373cade4e832627b4f6', `salt` = '' WHERE `uid` = 'X' 

Zurücksetzen Deiner Admin-Usergruppe auf '4', falls diese durch irgendeine Aktion geändert wurde (ändere den Wert für uid, wenn diese nicht 1 ist):
PHP-Code:
UPDATE `mybb_usersSET `usergroup` = '4' WHERE `uid` = '1' 

Themenbewertung in allen Foren deaktivieren (danach muss der 'forums' cache im ACP neu ermittelt werden):
PHP-Code:
UPDATE `mybb_forumsSET `allowtratings` = '0' WHERE `allowtratings` = '1' 

Themenbewertung in allen Foren aktivieren (danach muss der 'forums' cache im ACP neu ermittelt werden):
PHP-Code:
UPDATE `mybb_forumsSET `allowtratings` = '1' WHERE `allowtratings` = '0' 

Alle unsichtbaren User sichtbar machen (Templateänderungen sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `invisible` = '0' WHERE `invisible` = '1' 

Entferne alle Avatare (Templateänderungen und Änderung der Konfiguration sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `avatar` = '' 

Entferne alle Signaturen (Templateänderungen sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `signature` = '' 

Entferne alle von den Usern selbst erstellten Benutzertitel (Templateänderungen und Änderung der Konfiguration sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `usertitle` = '' 

Alle User sollen E-Mails vom Admin erhalten können (Templateänderungen sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `allownotices` = '1' WHERE `allownotices` = '0' 

Alle User sollen PNs erhalten können (Templateänderungen sind notwendig, wenn User dies nicht wieder selbst umstellen können sollen):
PHP-Code:
UPDATE `mybb_usersSET `receivepms` = '1' WHERE `receivepms` = '0' 

Aktiviere alle User, die auf Aktivierung warten:
PHP-Code:
UPDATE `mybb_usersSET `usergroup` = '2' WHERE `usergroup` = '5' 

Lösche alle User, die auf Aktivierung warten:
PHP-Code:
DELETE FROM `mybb_usersWHERE `usergroup` = '5' 

Aktiviere die Sommerzeit für alle User:
PHP-Code:
UPDATE mybb_users SET dst '1' 

Deaktiviere die Sommerzeit für alle User:
PHP-Code:
UPDATE mybb_users SET dst '0' 

Baumstruktur für alle User statt linearem Modus:
PHP-Code:
UPDATE `mybb_usersSET `threadmode` = 'threaded' WHERE `threadmode` = 'linear' 

Linearer Modus für alle User statt Baumstruktur:
PHP-Code:
UPDATE `mybb_usersSET `threadmode` = 'linear' WHERE `threadmode` = 'threaded' 


In all den o.a. Queries haben wir als Präfix mybb_ verwendet. Wenn Du diesen Präfix während der Installation oder danach geändert hast, dann musst Du die Queries natürlich entsprechend anpassen. Welchen Präfix Du in der Datenbank nutzt, kannst Du über die Datei inc/config.php in der Zeile "$config['database']['table_prefix']" ermitteln. Du kannst aber natürlich auch direkt in der Datenbank nachsehen.


Das ist ja alles ganz toll aber wie und wo führe ich die Queries nun aus?

Um die Queries ausführen zu können, benötigst Du Zugang zu Deiner Datenbank, z.B. mittels PHPMyAdmin. Wenn Du Dich dort eingeloggt hast, solltest Du so eine Seite sehen, wobei auf der linken Seite eine Liste der Datenbanken gezeigt wird:

[attachment=7950]

Wenn Du nun auf Deinen Datenbanknamen klickst, erscheint eine Seite, die wie folgt aussieht. Hier werden alle Datenbanktabellen angezeigt:

[attachment=7951]


Klicke auf den Tabe mit der Bezeichnunge 'SQL'. Es erscheint eine Seite mit einer Textbox. Hier kannst Du den Query eingeben.

[attachment=7952]

Mit 'Go' oder 'OK' wird der Query ausgeführt. Danach erscheint eine entsprechende Bestätigung, dass der Query ausgeführt wurde.

[attachment=7953]

Wenn eine Fehlermeldung erscheint, die z.B. sagt, dass in dem Query ein Fehler vorhanden ist, dann versichere Dich, dass Du den Query korrekt kopiert hast oder frage bei der Person nach, die Dir den Query hat zukommen lassen (kann ja auch sein, dass Du hier im Forum einen entsprechenden Tipp erhältst). Wenn einer der o.a. Queries nicht funktionieren sollte, dann versuche die alternative Schreibweise zu verwenden, die oben in diesem Beitra vorgestellt wurde).



Wir hoffen, mit diesem Thread dem ein oder anderen weiter helfen zu können. Wenn es Fragen gibt, immer her damit und wer einen Query hat, der vielleicht auch für andere User von Interesse sein könnte, dann bitte per PN an ein Teammitglied, damit wir es kontrollieren und ggf. hier eintragen können.