JoomGallery Menu

Demo Joom
Doku Joom
Roadmap Joom

Team Menu

Login-Logout

Spenden

Der Unterhalt dieser Supportseite kostet natürlich auch Geld...

Alle Spenden, die über die Betriebskosten hinausgehen, leiten wir an UNICEF weiter.

Startseite arrow FAQ arrow Allgemeines arrow Das Bild existiert nicht mehr oder ist noch nicht durch den Administrator freigegeben!
Das Bild existiert nicht mehr oder ist noch nicht durch den Administrator freigegeben! PDF Drucken E-Mail
Geschrieben von M. Andreas Böttcher   
Dienstag, 29. Januar 2008
Artikelinhalt
Das Bild existiert nicht mehr oder ist noch nicht durch den Administrator freigegeben!
Seite 2: Anleitung; Kollationen ändern, Teil 1
Seite 3: Anleitung; Kollationen ändern, Teil 2

 

 

 

 

In seltenen Fällen kommt es in der PonyGallery ML vor, dass beim Klick auf ein Thumbnail um zur Detail-Ansicht zu wechseln eine Fehlermeldung mit dem Inhalt der Überschrift dieser FAQ ausgegeben wird. Der Anwender ist sich aber sicher, dass sowohl das Bild als solches existiert als auch die Freigabe durch den Administrator bereits erfolgt ist. Warum gibt es dann diese Fehlermeldung?

Die Ursache für diese Fehlermeldung liegt in falsch gesetzten Kollationen der Datenbank-Tabellen der PonyGallery ML.

Der Hintergrund: die PonyGallery ML führt in der sub_viewdetails.php ab Zeile 54 folgende Datenbankabfrage aus:
PHP-Code:

$database->setQuery("SELECT a.id, a.catid, a.imgtitle, a.imgauthor,
    a.imgtext, a.imgdate, a.imgcounter, a.imgvotes,
    a.imgvotesum, a.published, a.imgfilename, a.imgthumbname,
    a.ordering, a.owner, u.id as uid
    FROM #__ponygallery as a
    LEFT JOIN #__users as u ON u.username = a.owner
    WHERE a.id = '$id' AND a.approved=1");

Wenn man eine solche Datenbankabfrage lesen kann, dann sieht man, dass hier eine Vergleichsabfrage über das LEFT JOIN durchgeführt wird. Es wird u.a. die ID des Users aus der Joomla-Datenbanktabelle xxx_users (xxx steht hier für das Datenbankpräfix) ermittelt und das unter Zuhilfename des Vergleichs von dem Eintrag in der Spalte username aus dieser Tabelle und dem Eintrag aus der Spalte owner aus der Tabelle xxx_ponygallery. Es wird also ein Vergleich der beiden Einträge ausgeführt. Ist dieser Vergleich positiv - also stimmen die Einträge überein - werden die angeforderten Daten ausgegeben. Ist er es nicht, dann werden sie nicht ausgegeben und die PonyGallery ML geht dann davon aus, dass das Bild nicht existiert oder noch nicht durch den Admin freigegeben worden ist.
Wenn man sich aber nun die in den beiden Datenbank-Tabellen gespeicherten Werte für username und owner anschaut, dann sind sie absolut gleich. Warum also funktioniert es trotzdem nicht? Und genau da kommen die Kollationen ins Spiel.


Was ist eigentlich eine Kollation (Collation)?

Sie ist auf jeden Fall kein Zeichensatz (Character Set) im eigentlichen Sinn. Ein Zeichensatz ist nämlich lediglich eine Liste von Symbolen, die in einer Sammlung zusammengefasst sind. Das einzige, was man mit einer solchen Liste machen könnte, wäre zu entscheiden, ob ein bestimmtes Symbol benutzt werden darf oder nicht. Somit ist ein Zeichensatz als solches erstmal mehr oder weniger nutzlos. Die Symbole in einem Zeichensatz können von einem Computer auch nur deswegen verarbeitet werden, weil den Symbolen ein Encoding, also eine binäre Repräsentation zugeordnet ist.

Eine Kollation ist nun ein Regelsatz, der es ermöglicht, die einzelnen Symbole innerhalb eine Zeichensatzes zu vergleichen. Ein Beispiel: nehmen wir an, wir hätten ein Alphabet mit vier Buchstaben: “A”, “B”, “a” und “b”. Jedem dieser Buchstaben wird eine Nummer zugeordnet; “A” = 0, “B” = 1, “a” = 2 und “b” = 3. Der Buchstabe "A" ist ein Symbol, die Nummer 0 ist das Encoding für "A" und die Kombination aller Buchstaben und ihrer Encodings ist ein Zeichensatz.

Wenn wir nun die beiden Buchstaben "A" und "B" vergleichen wollen, dann ist der einfachste Weg, sich die Encodings anzusehen: 0 für "A" und 1 für "B". Weil 0 kleiner ist als 1 kann man also sagen, dass "A" kleiner ist als "B" und außerdem kann man sagen, dass "a" das LowerCase, also der Kleinbuchstabe, von "A" ist genauso wie "b" von "B". Damit haben wir bereits dem Zeichensatz eine Kollation hinzugefügt.

Eine Kollation ist also ein Satz von Regeln, um die Encodings zu vergleichen oder anders gesagt eine normierte Codierung der Encodings, welche für Vergleichs- und Sortierzwecke verwendet wird.

Das Beispiel ist stark vereinfacht, aber man kann sich so schon durchaus vorstellen, was eine Kollation vorgibt. In der Regel sind den Kollationen natürlich ganze Alphabete zugeordnet bis hin zu den asiatischen Zeichensätzen.

Auch die beiden deutschen Kollationen sind unterschiedlich, insbesondere in der Verarbeitung von den deutschen Umlauten. So wird der String "Blödsinn" mit der MySQL-Collation latin1_german1_ci zu "blodsinn" und auch so benutzt, um ihn mit anderen Strings zu vergleichen. Die Kollation latin1_german2_ci würde den Text "Blödsinn" stattdessen intern in "bloedsinn" umwandeln, bevor verglichen und sortiert wird. Abgespeichert wird aber bei beiden Kollationen immer der Originalwert, also "Blödsinn" und da liegt der Hase im Pfeffer!

Das erklärt auch, warum in beiden Datenbank-Tabellen der gleiche Wert abzulesen ist. Zum Vergleich, der durch die obige Datenbank-Abfrage durchgeführt wird, werden aber die internen Interpretationen der Kollations herangezogen. Und dann ist blodsinn etwas anderes als bloedsinn!

Das heißt für unseren speziellen Fall, dass die Kollationen in der Joomla-Datenbanktabelle xxx_users und insbesondere in der Spalte username mit der Kollation der Datenbank-Tabelle xxx_ponygallery und da insbesondere in der Spalte owner unbedingt übereinstimmen müssen, damit der gleiche String von den Kollationen beim Vergleich nicht unterschiedlich interpretiert wird! Auch der PHP-Parser - also die Instanz, die den PHP-Code liest und ausführt - würde im Fall der Unterschiedlichkeit der beiden Kollationen eine Notiz in seinen Error-Log schreiben, die ungefähr so lauten könnte: "PHP Notice:  Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_general_cs,IMPLICIT) ...." (derartige Notices bekommt man im Regelfall aber auf produktiven Maschinen nicht zu Gesicht, da sie aus Sicherheitsgründen unterdrückt werden). Wegen derartiger Notices bricht der Parser allerdings seine Arbeit nicht ab.


Wie kommen aber die Kollationen überhaupt in die Tabellen?

Auf jeden Fall nicht durch die PonyGallery ML. Sie gibt - wie bereits erwähnt - ausdrücklich keine Kollationen vor.
In den Datenbank-Tabellen werden Spalten mit dem Typ CHAR, VARCHAR oder einem TEXT-Typ immer auch mit einer Kollation versehen. Ist diese nicht angegeben, so wird die Kollation der Tabelle vererbt, welche ihre Kollation von der Datenbank erbt und diese wiederum vom Server!

Und was sagt uns das jetzt? Wenn man einer Datenbank-Tabelle nicht explizit eine andere Kollation als dem Rest verpasst, dann kann es eigentlich nicht vorkommen, dass die Kollationen nicht übereinstimmen. Die PonyGallery ML tut das nicht. Wer also dann? Der User natürlich, indem er z.B. einen Dump von einer lokalen Installation auf seinen Server schiebt und vergessen hat, bei der Erstellung des Dumps die Kollationen nicht mit einfügen zu lassen.

Die allgemeingültige Lösung ist also folgende: die Datenbank-Tabellen der PonyGallery ML und alle entsprechenden Spalten darin, die als Typ entweder CHAR, VARCHAR oder einem TEXT-Typ haben, müssen auf die Kollation umgestellt werden, die in der Joomla-Tabelle xxx_users eingestellt ist. Nicht umgekehrt, weil man sonst evtl. Probleme mit anderen Komponenten bekommt. Und man sollte, bevor man einen Dump von einer anderen Installation einspielt, sicherstellen, dass die Kollationen übereinstimmen oder garkeine angeben.

Wie man die Kollationen in einer Datenbanktabelle mit Hilfe von einem Datenbank-Tool wie z.B. phpMyAdmin verändern kann, erkläre ich anhand von Screenshots auf den nächsten Seiten...



» Keine Kommentare
Es gibt bisher noch keine Kommentare.
» Kommentar schreiben
E-Mail (wird nicht veröffentlicht)
Name
Titel
Kommentar
 verbleibende Zeichen
Captcha Image Code neu generieren, falls er unlesbar sein sollte
Letzte Aktualisierung ( Samstag, 16. Februar 2008 )
 
< zurück   weiter >
© 2008 JOOM::GALLERY
Joomla! is Free Software released under the GNU/GPL License.
HOSTED BY SCHWARZKÜNSTLER ®
PROTECTED BY BOT-TRAP.DE