.htaccess, Umlaute in URL und Post von MySQL holen

Pinky

Erfahrenes Mitglied
Hallo Leute,

lange hab ich mich nicht mehr gemeldet, aber das ist ja in diesem Fall ein gutes Zeichen :). Zur Zeit hab ich jedoch folgendes Problem und darum wend ich mich hilfesuchend an euch:

Ich hab ein kleines CMSystem aufgebaut. In einer MySQL-Datenbank werden die Inhalte gespeichert, die ich auf meiner Webseite ausgeben möchte. Die Links der Webseite möchte ich so formatieren, dass der Titel des Inhalts in der URL aufgenommen wird. Beispiel:

Ich speichere den Inhalt mit dem Titel: In Köln lässt sichs leben!
Auf der Webseite werden die Links aus der Datenbank automatisch generiert und erhalten folgendes Format:

HTML:
<a href="http://www.meineseite.com/In-Koeln-laesst-sichs-leben/">In Köln lässt sichs leben!</a>

Wenn ich nun auf den Link klicke und auf die Ausgabeseite gelange, auf der der Inhalt mit dem Titel In Köln lässt sichs leben! ausgegeben werden soll, findet meine Datenbank keinen Eintrag. Die Datenbankabfrage sieht so aus:

Code:
$res = mysql_query("SELECT * FROM `inhalt` WHERE `title` LIKE '%" . $_GET[dir_1] . "%'");

$_GET[dir_1] hab ich durch meine .htaccess-Datei definiert!

Für die Umwandlung der Titel hab ich folgende Funktion geschrieben:
PHP:
$search = array("ä", "ö", "ü", "Ä", "Ö", "Ü" , "-" , "?", "!", " ");
$replace = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "_" , "", "", "-");
$title = str_replace($search , $replace , $title);
return $title;

Das Problem sind ja nun die Umlaute, durch die mein Eintrag nicht mehr gefunden wird. Wie muss ich das anstellen, dass jeder Titel, egal mit oder ohne Umlaute, in der Datenbank gefunden wird?

Vielen Herzlichen Dank für alle Antworten & freundlich Grüsst euch
euer Pinky
 
Zuletzt bearbeitet:
Hallo Pinky,
ich würde dir raten in der Datenbank zusätzlich zu jedem Dokument einen Alias zu speichern, in dem die generierte URI zu finden ist. Das hat den Vorteil, das du diese Unique setzen kannst, so dass systemisch ausgeschlossen ist, dass es 2 oder mehr Dokumente mit der gleichen URI gibt.

Nach deiner aktuellen systematik wäre die einzige Chance das dazugehörige Dokument zu finden, indem du alle Titel ausliest und durch diese Funktion schiebst, die dir die URI generiert und diese dann wieder gegen $_GET['dir_1'] abgleicht. Das wäre aber eine denkbar hässliche Lösung, da so das auffinden der richtigen Seite mit steigender Webseitengröße immer länger dauert.

Grüße,
Sebastian
 
Hallo zusammen & vielen Dank für die raschen Antworten.

@threadi
Das möchte ich eigentlich vermeiden, der URL noch IDs oder sonstige Zahlenkombinationen anzuhängen. Ich möchte die URL schlussendlich so logisch halten wie möglich.

Ich habe das mit der Rückwandlunsfunktion bereits probiert. Doch dabei entstanden Probleme, dass z.B. auch Wörter wie "Soeben" in "Söben" umgewandelt werden, was im Endeffekt dazu führt, dass der Eintrag wieder nicht gefunden wird.

@DirectWeb
Deine Variante tönt gut. Ich kann mir jedoch grad nichts genaues darunter vorstellen. Meinst du, ich solle ein weiteres Feld in der MySQL-DB erstellen, dass z.B. "URL" heisst und in welchem ich den bereits umgewandelten Namen (hier also In-Koeln-laesst-sichs-leben) speichere? Da fällt mir nur grad ein, dass ich dann probleme mit habe, wenn zwei Titel identisch sind (kanns ja evt. geben). Kannst du deinen Vorschlag etwas ausführen? Das wäre sehr hilfreich für mich.

Im Verlaufe des Schreibens bin ich mir plötzlich nicht mehr sicher, ob ihr zwei evt. nicht das gleiche meint :)!

Herzlichen dank & freundlicher Gruss
Euer Pinky
 
Zuletzt bearbeitet:
Nein, meinen wir nicht, allerdings ist seine Idee durchaus auch realisierbar. Was Du jedoch auch bedenken musst: es gibt Portale bei denen man sich anmelden kann um seine eigene Webseite zu vermarkten, wo die URLs von z.B. Neuigkeiten auf der Seite eine eindeutige Kennung zwingend benötigen. GoogleNews schreibt z.B. die Einführung einer eindeutigen Zahl in der URL vor. Falls dir GoogleNews egal ist, mach es wie von DirectWeb beschrieben.
 
Hallo Threadi,

GoogleNews ist mir vorläufig mal egal. Ich glaub nicht, dass ich das in absehbarer Zeit brauche. Aber kannst du mir erklären, was der DirectWeb mit seinem Vorschlag genau mein? Ich komm mit seinem Beschrieb nicht klar!

Danke
Euer Pinky
 
Er meint folgendes:
Wenn Du eine neue Seite in der Datenbank speichert, erstellst und sicherst Du gleichzeitig auch deren URL in der Datenbank. In einer extra Spalte natürlich die ausreichend Platz dafür lässt.
Diese Seite kannst Du dann irgendwo auf deiner Seite verlinken, z.B. im Menü. Die URL dafür erhälst Du aus eben dieser Datenbankspalte.
Wenn diese Seite nun aufgerufen wird, leitest Du die Anfrage per htaccess an eine Datei weiter die die aufgerufene URL ermittelt und mit einem einzigen Statement in der Datenbank schaut, ob diese URL eingetragen ist und wenn ja, welchem Datensatz sie gehört.
 
Also doch wie ich vermutete habe. Da muss ich vorneweg aber noch prüfen, ob der Titel nicht bereits einmal in der DB vorhanden ist, da ich anstonsten zwei Einträge mit dem selben Titel habe, die DB aber nur ein Eintrag findet. Beispiel:

Ich schreib am 21.02.2011
In Köln lässt sichs leben und speichere den Titel in folgemdem Format in das Feld URL In-Koeln-laesst-sichs-leben

Ich schreib am 21.02.2015 (hab vergessen, dass es den Titel bereits gibt)
In Köln lässt sichs leben und speichere den Titel in folgemdem Format in das Feld URL In-Koeln-laesst-sichs-leben

Jetzt hab ich ein Problem, oder? Natürlich kann ich eben auf das Vorhandensein einer URL prüfen und z.B. einfach ein -2 am Ende anhängen.

Seh ich die ganze Angelegenheit richtig? Nur damit wir uns verstehen :) :).

Danke für die Antworten, die nächste wird verm. die Letzte sein :).
 
Guten Morgen,
threadi hat meine Idee schon gut beschrieben, nur das ich nicht die ganze URL, sondern nur die URI also sozusagen den Dateinamen speichern würde.

@threadi: Mit Google News habe ich mich noch nicht beschäftigt, danke für den Hinweis.

Wenn du die Tabellenspalte auf "Unique" setzt hast du die Problematik umgangen bzw. du kannst direkt beim eintragen darauf reagieren. Das ist soweit richtig

Grüße,
Sebastian
 
Zuletzt bearbeitet:
Vielen Dank euch allen. Das war jetzt noch spannend. Schlussendlich habe ich die Idee von DirectWeb doch richtig verstanden :). Schlussendlich hab ichs wie folgt gelöst:

Ich habe in der MySQL-Datenbank ein weiteres Feld namens "URL" eingefügt, in welches ich den umgewandelten Titel speichere. Um den Titel umzuwandeln und doppelte URLs mit gleichen Titeln zu vermeiden, habe ich folgende Funktion geschrieben:

PHP:
function MAKE_URL($url, $mysqldb)
{
     include 'config.php';
     $url = rtrim($url);
     $url = preg_replace("/[^a-zA-Z0-9_äöüÄÖÜ_ ]/" , "" , $url);

     $search = array("ä", "ö", "ü", "Ä", "Ö", "Ü", " ");
     $replace = array("ae", "oe", "ue", "Ae", "Oe", "Ue", "-");
     $url = str_replace($search , $replace , $url);

     #PRÜFEN OB URL BEREITS BESTEHT
     $res = mysql_query("SELECT * FROM `" . $db . '_' . $mysqldb . "` WHERE `url` LIKE '%" . $url . "%' AND `sec` != '" . $_GET[dir_6] . "' ORDER BY `url` DESC");
     $tmp = mysql_fetch_array($res);
     $num = mysql_num_rows($res);

     if ($num > 0)
     {
          if ($num > 1) { $num = end(explode("-",$tmp[url]))+1; } // LETZE SCHLUSSZAHL ERMITTELN
          $url = $url . '-' . $num;
     }

     return $url;
}

Sollte jemand Fragen zu dieser Funktion haben, so bitte einfach per PM. Ich kann hier nicht auf alles eingehen, doch eigentlich sollte Sie selbstsprechend sein.

Vielen Dank fürs Helfen & adios :).
Euer Pinky
 
Zuletzt bearbeitet:
Zurück