echo $begrüßung;
ich habe ein Problem mit dem enum Datentyp in mySQL. Und zwar moechte ich auch in der Lage sein, dort Werte zu speichern, die Hochkommata enthalten.
Das ist kein enum-spezifisches Problem sondern ein generelles.
Nun ist es ja so, dass der enum Datentyp Hochkommata als Begrenzer fuer die einzelnen Werte einsetzt.
Nicht wirklich. Es sind ganz normale String, die in Hochkomma oder Gänsefüßchen eingeschlossen werden müssen, wenn man sie über eine Text-Schnittstelle, wie es so ein SQL-Statement darstellt, übertragen werden sollen. Dabei sind gewisse Maskierungsregeln zu beachten, wenn Begrenzungszeichen und noch einige andere als Daten in diesen Strings vorkommen sollen.
Ansich ja kein Problem, mit addslashes() kann ich in PHP diese Hochkommata ja codieren, so dass sie mir keine Probleme machen. Anschliessend speichere ich diese Werte in der Datenbank.
addslashes() ist vielleicht für die Hochkommas ausreichend, aber es berücksichtigt nicht sämtliche kritische Zeichen. Für MySQL ist es besser, mysql_real_escape_string() zu verwenden.
Wenn ich nun die Werte von der Datenbank abfragen moechte, nutze ich einfach stripslashes() um sie wieder los zu werden.
Das ist überflüssig, da sie nur zum Transport im SQL-Statement benötigt und hinzugefügt wurden. In der Ergebnismenge stehen die Daten so wie sie in der Datenbank stehen: in ihrer Roh-Form.
Ist dies im generellen ein guter Ansatz? In der Theorie funktioniert es naemlich ganz gut, aber in der Praxis habe ich es nicht hinbekommen da immer zu viele oder zu wenige backslashes vorhanden waren.
Es könnte noch sein, dass dir hier Magic Quotes dazwischenfunkt. Dieses Feature wendet selbständig addslashes() auf die EGPCS-Variablen an. addslashes() ist jedoch wie gesagt nicht ausreichend. Ab PHP6 hat sich das mit den Magic Quotes auch erledigt, dieses Feature wird es dann nicht mehr geben. Bis dahin ist es eine gute Idee, sie auszuschalten, oder ihre Auswirkungen am Scriptanfang rückgängig zu machen. Siehe Disabling Magic Quotes.
Generell besteht bei diesem Ansatz ja immer das Problem mit werten die Hochkommata oder backslashes enthalten.
Generell bei Strings. Dagegen hilft immer mysql_real_escape_string().
Wie verhalt es sich, wenn meine Wertemenge sehr gross ist, Beispielsweise ich speichere alle Haupstaedte der Welt.
ENUM kann bis zu 65535 Werte haben. Das Problem ist eigentlich nur, dass bei einer Pflege der Werte das Tabellenlayout geändert werden muss. Weiterhin ist dieser Typ auf eine Tabelle beschränkt. Braucht man die Aufzählung in einer weiteren Tabelle empfiehlt es sich stattdessen eher eine eigene Tabelle zu erstellen - jedenfalls aus Datenpflegesicht. Wenn Performance eine größere Rolle spielt, ist auch doppelte Datenhaltung "gestattet". Eine weitere Tabelle bedeutet nämlich auch einen zusätzlichen Join.
Ich moechte nur diese Hauptstaedte in meiner Datenbank haben, da wuerde sich ja auch der enum Datentyp anbieten oder? Oder sollte ich lieber eine extra Tabelle erzeugen, die alle gueltigen Staedtenamen enthaelt und dann mit PHP absichern, dass nur gueltige Werte in der anderen Tabelle gespeichert werden?
In die "andere Tabelle" schreibt man einen Verweis auf den Primärschlüssel der Städtenamentabelle. Ändert sich mal die Hauptstadt, ändert man den Wert in der Städtenamentabelle und die Zuordnung zum Primärschlüssel in der "anderen Tabelle" bleibt erhalten.
Abgesehen davon ist eine Liste der Hauptstädte möglicherweise ein schlechtes Beispiel. Die Hauptstadt ist sicher günstiger als ein Feld in der Ländertabelle aufgehoben - oder ein Verweis auf eine allgemeine Städteliste.
echo "$verabschiedung $name";