PHP RewriteRule: Variable unsichtbar mitgeben

qhil

Captain
Registriert
Apr. 2011
Beiträge
3.119
Hallo zusammen,

ich habe ein Problem, wo ich nicht weiterkomme.
Mit Hilfe von RewriteRule ändere ich meine URLs. Dazu mal ein fiktives Beispiel: Ich habe eine Seite, wo diverse Buchtitel aufgelistet sind, welche verlinkt sind. Beim Klick auf den Link kommt dann eine Seite speziell für den entsprechenden Titel mit weiterführenden Informationen.

Beispielhafte Buchtitel:

Hallo Welt!
Hilfe! Ich habe einen Splitter im Zeh
Die Sprache der Klingonen

Die Links dazu sollen dann wie folgt aussehen:

domain.de/hallo-welt/
domain.de/hilfe-ich-habe-einen-splitter-im-zeh/
domain.de/die-sprache-der-klingonen/

Das ist auch alles kein Problem. Auf der Folgeseite möchte ich nun die zusätzlichen Informationen aus einer DB abfragen. Am Beispiel "Hilfe! Ich habe einen Splitter im Zeh" habe ich nun ein Problem, weil mehrere Sonderzeichen hintereinander lediglich zu einem "-" werden. Somit kann ich den Namen auf der Folgeseite nicht mehr rekunstruieren, um damit die Werte in der DB abzufragen. Nun dachte ich mir, dass ich irgendwie noch die ID des Buches mit übergebe - nur soll diese "unsichtbar" sein. Ich möchte halt meine URL beibehalten und daraus nicht so etwas machen:

domain.de/hilfe-ich-habe-einen-splitter-im-zeh/27/

Die 27 wäre in dem Fall die ID. Aber das ist einfach nur hässlich und merken kann sich das ja auch niemand. Auch möchte ich den veränderten Namen nicht extra in der DB speichern.

Gibt es da nicht eine elegantere Lösung?

Vielen Dank im Voraus!
 
Zuletzt bearbeitet:
qhil schrieb:
Aber das ist einfach nur hässlich und merken kann sich das ja auch niemand. Auch möchte ich den veränderten Namen nicht extra in der DB speichern.
Warum nicht? Leg eine einzigartige URL in der DB ab die verlinkt wird und nutz diese. Ist wohl der einfachste Weg, wenn du keine IDs mitgeben willst.
 
jep, so wirds gemacht. Zusätzlich zu jedem Buchtitel kommt noch ein einzigartiger Alias in die Datenbank. Dieser Alias setzt sich aus dem URL-bereinigten Titel und, falls jetzt nicht mehr einzigartig, noch zusätzlich der einzigartigen ID des Buches, zusammen.

Angenommen, 3 Leute hätten ein Buch geschrieben: "URL-Bereinigung leicht gemacht", dann würde das erste halt url-bereinigung-leicht-gemacht heißen. das nächste (ID 23) hätte hinten ne -23 dran, das andere mit ID=42 halt -42.

Vorteil: du kannst hier einen schönen Index auf den Alias setzen und recht shcnell durch dei Datenbank iterieren. Und du hast nie Dopplungen.
 
Ok, ich danke euch. Dann werde ich das Eingabe-Script nochmals anpassen. Ergibt eigentlich ja auch Sinn. Wollte halt nur vermeiden noch extra eine weiter Spalte in die Tabelle zu hauen - damit das Datenaufkommen halt so gering ist wie möglich.

Vielen, lieben Dank :)
 
Da die Spalte im Zweifel nur ASCII-Code enthält: 1Byte pro Zeichen kannst du sicher verschmerzen.

Und was das Eingabescript angeht: Denk dran, dass du das automatisieren kannst. Fang nicht an, den Alias selbst anzulegen, sondern lass ihn berechnen. Spart viele graue Haare.
 
Da hast du wohl Recht.
Was meinst du mit automatisieren? Ich habe das nun ganz einfach so gemacht:

Code:
$foldername = preg_replace('[\W]', '-', $name);
$foldername = preg_replace('/[-]{2,}/', '-', $foldername);
$foldername = strtolower(trim($foldername, '-'));

Ich mache es halt nach bestem Wissen und Gewissen. Ist das erste Mal, dass ich in einem Projekt mit RewriteRule rumspiele. Da gibt es sicher noch einige Optimierungsmöglichkeiten :)
 
Na du hast doch sicher ein Script, über das du neue Bücher anlegst und alte pflegst. In der Funktion, die jetzt deine Änderungen in die DB einträgt lässt du gleich noch den einzigartigen Alias erstellen.
Reihenfolge: Alias generieren -> gucken, ob der Alias bereits in der DB ist (doppelte Buchtitel) -> wenn ja, Alias um ID des Buches ergänzen, damits einzigartig wird.
 
Ja, so läuft das auch. Baue quasi mein eigenes, kleines CMS hinter der eigentlichen Seite. Also ich schreibe die Daten nicht händisch in die DB :) Habe die neue Spalte auch schon drin und das macht das Ganze um Einiges einfacher, da ich den Namen nicht für die DB-Abfrage brauche. Danke nochmal!
 
War nicht meine Idee, den Ansatz hab ich mir bei Contao abgeguckt. Die haben da eh ein paar sehr kreative Rewrite-Regeln in Kombination mit Get-Parametern wie nem Alias.... Ein Blick in den Code lohnt.
 
Um nicht wieder einen neuen Thread aufzumachen, missbrauche ich mal den alten, da das Problem letztendlich dasselbe ist.
Ich möchte via Link dieselbe Seite aufrufen, auf der sich auch der Link befindet. Nur eben mit dem Unterschied, dass ich eine Variable mitgeben will.

domain.de/db-eintrag-loeschen/

Auf der Seite soll dann natürlich abgefragt werden, ob die Variable gesetzt ist. Falls ja, dann soll der DB-Eintrag gelöscht werden. Falls nicht, erscheint halt nur eine Abfrage, ob wirklich gelöscht werden soll und der eben besagte Link.

Kann man dies realisieren, ohne dafür die URL zu ändern?
 
Ich würde sowas einfach nicht per Link machen, sondern per Form-POST
 
Dann muss ich mir aber auch immer son hässlichen Button auf die Seite hauen. Schon klar, es gibt CSS, aber irgendwie mag ich die Dinger nicht ;) Man kann ja auch ein Formular über einen Link absenden, aber dafür braucht man wieder JS soviel ich weiß...
 
Warum sollte ein Button anders aussehen als ein Link?
input[type="submit"] {border: none; background: none; padding: 0; margin:0; display: inline;} <- sollte aussehen wie stink normaler Text, nur klickbar.

Und was spricht gegen eine JS-Lösung? Du schreibst doch offensichtlich eine Backend-Lösung. In denen muss man weit weniger auf NoScript-Opfer aufpassen, und auch Barrierefreiheit ist nicht unbedingt wichtig. Das Magento-Backend kannst du z.B. ohne JS gar nicht bedienen. Da geht nix.
 
Ich habe bei Buttons oft das Verhalten, dass sich die Schrift im gedrückten Zustand verschiebt. Im IE habe ich das sogar immer. Da kann der Button vermutlich wenig für, trotzdem nervt mich so etwas.

Die Sache mit JS stimmt schon, aber wieso muss man immer auf alles zugreifen, selbst wenn es auch mit den 08/15 Methoden geht. Klar wird vermutlich nur ein kleiner Personenkreis das CMS nutzen, dennoch versuche ich Fehlerquellen zu minimieren. Ist halt eine "Angewohnheit".

Ich habe es nun übrigens mit Buttons gemacht. Funktioniert alles bestens. Und die Schrift bleibt wo sie ist :)
Erneut Danke, Daaron! ;)
 
Es wäre semantisch sowieso nicht korrekt gewesen, einen DB-Eintrag per Link (oder besser gesagt: GET-Request) zu löschen. Alle Requests, die einzigartig sind (Warenkörbe, Passwörter,...), nicht im Browser-Verlauf auftauchen dürfen, deren Verlinkung keinen Sinn macht oder die man nicht per Auto-Vervollständigen aus Versehen triggern soll, sollten immer POSTs sein.
 
Zurück
Oben