Datenbankabfragen verlinken
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
adresse
alpha
anfrage
begriff
beispiel
code
dank
datei
datenbank
frage
http
jemand
moment
problem
record
string
umlaut
url
wurst
zeichenkette
-
Hallo zusammen!
Ich bastle gerade an einem Mini-Nachschlagewerk für Fachbegriffe und brauche Eure Hilfe. Und zwar habe ich die Begriffe samt der Erklärungen in einer Datenbank und möchte, dass diese verlinkt werden. Man soll also beim Klick auf den Begriff auf eine neue Seite kommen und da wird der Begriff dann näher erklärt. Der Seitenname soll übrigens den Begriffnamen haben.
Kurfassung:
In meiner Datenbank gibt es zwei Spalten: Begriff und Erklärung. Auf der Seite, wo alle Begriffe aufgelistet werden (bei mir: uebersicht.html), sollen die entsprechenden Begriffe mit ihrem Eigennamen verlinkt werden.
Beispiel: Der Begriff heißt "Spam". Der Link zur Erklärungsseite soll dann "spam.html" lauten. Und auf dieser Seite (spam.html) steht dann die Erklärung. Es soll also virtuell eine neue Seite angelegt werden mit dem Inhalt der Erklärung aus der Datenbank.
Das einzigen Problem ist, dass ich keine Ahnung habe, wie ich das anstellen soll! Und um diese Uhrzeit bin ich damit auch total überfordert.
Wäre also nett, wenn sich Jemand meiner erbarmt und mir hilft.Vielen Dank im Vorraus dafür!
Gruß,
webdesignerin -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Genau das wird hier als Beispiel erklärt.
Edit: Naja, fast. Einfach das "seite_" aus der RewriteRule streichen, dann klappt das.
Beitrag zuletzt geändert: 16.6.2011 20:56:51 von drafed-map -
Leider kann ich dir nicht sagen wie du dein Problem lösen kannst aber ich vermute es geht mit .htaccess.
Aber warum versuchst du es nicht so:
Anstatt für jeden Begriff eine neue "Seite" erstellen zu lassen, übergibst du den Begriff einfach per Anhang an die URL und ließt dann auf der neuen Seite den enstprechenden Eintrag aus der Datenbank aus.
Also in etwa so (Quick & dirty):
Startseite:
<a href="detail.php?query=spam">Spam</a>
Detailseite:
<?php $sql = mysql_query("SELECT erklärung FROM tabelle WHERE begriff = '".$_GET['query']."'"); ?>
//edit: da war wohl mal wieder jemand schneller
Beitrag zuletzt geändert: 16.6.2011 20:58:15 von alfr3d -
Hallo alfr3d!
Ich habe es jetzt per Anhang bzw. mit nem Query gemacht. Soweit alles Bestens. Das einzige Problem (oder besser gesagt: zwei) ist, dass ich jetzt noch den Seitentitel und die Seitenurl dynamisch anpassen lassen muss.
Im Moment sieht der Link bei mir so aus: uebersicht.html?Begriff=Spam - und ich möchte ja, dass er entweder so: begriff_spam.html oder so aussieht: spam.html
Mit dem Link und Vorschlag von drafed-map bin ich leider nicht weitergekommen, weil dieser Rewrite nur für Datenbankeinträge mit ID ist. In meiner Datenbank gibt es aber keine IDs. Und da ich nicht weiß, wie man das ggf. an die Tabellespalte "Begriffe" anpasst... kam ich eben nicht weiter.
Und der Seitentitel (<title></title>) ist im Moment leider noch Bedeutung und nicht Spam oder Begriff: Spam. Bitte um Hilfe!
Gruß,
webdesignerin -
Hallo, ich denke wenn Du eine Datenbank hast wirst Du mit php vertraut sein:
Seitentitel einstellen geht so, der Seitentitel steht hier in der Spalte Name des Datensatzes:
<?php
echo "<title>"htmlentities($row["name"])."</title>";
?> -
rlippold schrieb:
Hallo, ich denke wenn Du eine Datenbank hast wirst Du mit php vertraut sein:
Seitentitel einstellen geht so, der Seitentitel steht hier in der Spalte Name des Datensatzes:
<?php
echo "<title>"htmlentities($row["name"])."</title>";
?>
Hallo rlippold!
Mit PHP bin ich schon ein wenig vertraut, aber das Problem bei Deinem Vorschlag ist doch, das nur ein zufälliger bzw. der erste Begriff in der Datenbank als Titel angegezigt wird und nicht unbedingt der, der auf der Seite eigentlich erklärt wird. Außerdem sind ja ein paar " zu viel und ich weiß nicht wo ' hinmüssen bzw. ein Slash vor den ". Vielleicht verräts mir Jemand?
Gruß,
webdesignerin -
Das mit dem Titel ist ganz easy,
Du übergibst den Begriffname ja mit GET, also z.B.
xxx.html?begriff=spam
Also setzt du zwischen <title>$_GET['begriff']</title> und schon haste zumindest den aktuellen Titel zum Begriff.
Wie das mit der URL funzt kann ich dir aber leider nicht sagen.
Beitrag zuletzt geändert: 17.6.2011 10:18:54 von trickdieb -
Die Lösung von Trickdieb schein mir die bessere zu sein, da Du den Seitennamen ja nicht in der Datenbank speicherst, sonder mit GET übergiebst.
-
Also das mit dem Titel hat trickdieb ja erklärt, einfach mit $_GET übernehmen.
Wegen der .htaccess und den RewriteRule, ich kenne mich nicht wirklich damit aus aber es stand da ja:
RewriteEngine on RewriteRule ^seite_([0-9]+).html$ seite.php?id=$1
Was macht der Server?
Die Anfrage wird nach "seite_ZAHL.html" untersucht. Die gefundene ZAHL wird in der Variablen $ gespeichert. Nun wird die Anfrage intern auf "seite.php?id=ZAHL" geleitet. Die URL-Leiste im Browser (Client) bleibt dabei unverändert.
Also wenn ich den kleinen Text verstanden hab müsste es evtl so aussehen:
RewriteEngine on RewriteRule ^([a-c]+).html$ detail.php?query=$1
-> Die Anfrage wird nach "TEXT.html" untersucht. Der gefundene TEXT wird in der Variablen $ gespiechert. Nun wird die Anfrage intern auf "detail.php?query=TEXT" geleitet. Die URL-Leiste im Browser (Client) bleibt dabei unverändert.
Vielleicht kann jemand der sich richtig damit auskennt noch was dazu sagen...
Beitrag zuletzt geändert: 17.6.2011 10:36:17 von alfr3d -
Naja, so ähnlich... Wir wollen aber doch nicht nur die Buchstaben a, b und c zulassen, oder? Das dürfte funktionieren:
RewriteEngine on RewriteRule ^(.*).html$ seite.php?begriff=$1
-
Hallo zusammen!
@ trickdieb & rlippold: Danke, ich habe den Titel wie folgt erfolgreich hinbekommen:
$Begriff=& $_GET['Begriff']; echo $_GET['Begriff'];
@ drafed-map: Inwiefern muss ich dann die Links auf in der Übersicht anpassen? Im Moment sehen die bei mir so aus:
<a href='bedeutung.html?Begriff=".$row->Begriff."'>$row->Begriff</a>
Gruß,
webdesignerin
-
Auch wenn ich nicht angesprochen bin:
<a href="bedeutung.html?begriff=spam">Spam</a>
<a href="bedeutung.html?begriff=offtopic">Offtopic</a>
usw...
Wenn jetzt jemand einen Link klickt:
$begriff = $_GET['begriff'];
$erklaerung = "SELECT * FROM tabellenbezeichnung WHERE begriff='$begriff'' ";
$lesen = mysql_query($erklaerung);
das ganze speicherst dir in einem Array (mysql_fetch_array) und kannst es dann ausgeben.
ist zwar ziemlich kurz geschrieben, aber sollte veranschaulichen worauf ich hinaus will.
edit:
ich sehe gerade es geht ja um den Link in der URL Leiste der sich ändern soll? Dann ist das ot, sorry. Ich lasse es mal stehen vielleicht ist es ja doch noch hilfreich für dich.
Beitrag zuletzt geändert: 17.6.2011 11:47:56 von trickdieb -
drafed-map schrieb:
Naja, so ähnlich... Wir wollen aber doch nicht nur die Buchstaben a, b und c zulassen, oder? Das dürfte funktionieren:RewriteEngine on RewriteRule ^(.*).html$ seite.php?begriff=$1
Das klappt irgendwie nicht. Wie soll denn die Seiten URL mit dieser Rewrite Rule am Ende lauten? Ich habe alles Mögliche ausprobiert, aber immer einen 404-er bekommen!?
Gruß,
webdesignerin -
Wenn du meinen Code nimmst und jemand die Seite spam.html aufruft, dann ist das wie, wenn jemand die Seite seite.php?begriff=spam aufrufen würde. Du musst also seite.php in den Namen deines PHP-Scripts ändern, den Code in die .htaccess speichern und die Get-Variable $_GET['begriff'] (nicht $_GET['Begriff']) im PHP-Script verwenden.
-
Hallo!
@ drafed-map: Es geht zwar, aber das Problem war bzw. ist, dass ich noch folgende Rewrite Rule davor hatte:
RewriteRule ^(.*)\.html$ $1.php [L]
Dein Code geht zwar, sorgt jedoch dafür, dass die anderen .php Seiten (die eigentlich auch .html sein sollten) nicht erreichbar sind (es erscheint: Unbekannter Name). Wie verbinde ich beide Rewrite Rules (Deine und meine Alte)?
Gruß,
webdesignerin -
Das geht logischerweise nicht. Immer merken: EIn Computer ist dumm und alles, das er falsch verstehen kann, wird er auch falsch verstehen.
Wenn du den Begriff 'spam' nachschlägst, lautet die Adresse: http://deine-seite.tld/spam.html
Wenn du das PHP-Script 'spam.php' öffnest, lautet die Adresse: http://deine-seite.tld/spam.html
Merkst du was? -
drafed-map schrieb:
Wenn du den Begriff 'spam' nachschlägst, lautet die Adresse: http://deine-seite.tld/spam.html
Wenn du das PHP-Script 'spam.php' öffnest, lautet die Adresse: http://deine-seite.tld/spam.html
Merkst du was?
Ne sorry, das verstehe ich gerade wirklich nicht. Heißt das, ich muss mir was Anderes einfalles lassen, weil jetzt die anderen Seiten mit der neuen Rewrite Rule (auch mit beiden) nicht mehr gehen und die ganze, bisherige Arbeit war umsonst?
Gruß,
webdesignerin -
Okay..
RewriteEngine on RewriteRule ^(.*).html$ seite.php?begriff=$1
Dadurch passiert folgendes:
Du rufst spam.html auf, der Server leitet auf seite.php?begriff=spam um
Das ist genau das, was du suchst :)
Was du zusätzlich tun kannst ist, spezielle Seiten/Dateien auszuschließen:
RewriteEngine on RewriteRule ^(wurst.html|kaese.html) - [L] RewriteRule ^(.*).html$ seite.php?begriff=$1
Dadurch werden wurst.html und kaese.html aus den Rewriterules entfernt. Das ist zum Beispiel dann wichtig, wenn die Dateien wurst.html und/oder kaese.html tatsächlich vorhanden sind.
Ohne diese Rule würden auch diese Seiten auf seite.php?begriff=x leiten, was ja nicht im Sinne des Erfinders ist :)
Wenn du einen Prefix oder einen Suffix verwendest, wärst du ein wenig freier in der Gestaltung deiner Rules:
RewriteEngine on RewriteRule ^begriff_(.*).html$ seite.php?begriff=$1
Dadurch müsste man begriff_spam.html aufrufen, um auf seite.php?begriff=spam geleitet zu werden. Alle existierenden .html Seiten ohne den Suffix begriff_ sind also von der Rule gänzlich ausgeschlossen.
EDIT:
Ich hab dir mal ein Beispiel fertig gemacht -> http://fabo.lima-city.de/work/rewrite/spam.html
Hier wird XXX.html umgeleitet zu index.php?begriff=XXX, wobei wurst.html und kaese.html nicht inbegriffen sind, da diese Dateien tatsächlicj existieren und dementsprechend nicht umgeschrieben werden sollen:
http://fabo.lima-city.de/work/rewrite/wurst.html
http://fabo.lima-city.de/work/rewrite/kaese.html
Bei Verwendung von ^(.*).html$ kannst du KEINE weitere Rewriterule dieser Art in diesem Verzeichnis nutzen (logischerweise). Das sorgt, wie du bereits selbst bemerkt hast, für Fehler. Dementsprechend musst du einen Prefix oder einen Suffix nutzen, damit sich die beiden Rules nicht überschneiden. Oder halt exkludieren, wenn es nicht all zu viele Dateien sind.
EDIT:
Es geht auch anders. Du könntest mittels file_exists() in der PHP-Datei prüfen, ob die aufgerufene Datei existiert, oder nicht. Wenn ja, wird diese mittels include eingebunden und wenn nicht, lässt du deine Datenbankabfragen sausen.
Dadurch würdest du dir einiges an Tipparbeit sparen (bei den Excludes).
Beitrag zuletzt geändert: 17.6.2011 18:58:50 von fabo -
Hallo fabo!
Vielen Dank für die Erklärung!
Verstehe, dann sind beide Rewrite Rules aufeinmal einfach doppelt gemoppelt bzw. kommen sich absolut in die Quere, sodass der Computer nicht wissen kann, wie er auf diese unklare und unsinnige Regel reagieren soll. Jetzt habe auch ich's verstanden.
Für mich käme dann wohl (leider) eher der Umweg über das Prä- oder Suffix in Frage. Ich werd's gleich mal ausprobieren. Was das Ausschließen von Dateien angeht, so hätte ich noch eine Rückfrage zu Deinem Wurst und Käse Sandwich: Was ist, wenn die Dateien, die wirklich exisitieren, keine .html, sondern eine .php Endung haben und nach .html konvertiert werden sollen. Dann bringt doch die Ausschlussregel nichts, oder?
Gruß,
webdesignerin -
Ich habe meinen obigen Beitrag bearbeitet :) Das könnte dir helfen.
Zu deiner Frage: Ich bin grundsätzlich davon ausgegangen, dass es sich um PHP-Dateien handelt, die in Html-Dateien umgeschrieben werden sollen.
Durch den Filter kannst du also bewirken, dass spam.html nicht an seite.php?begriff=spam weitergeleitet wird bzw. diese Seite (ob existent, oder nicht) nicht durch mod_rewrite genutzt wird.
Ist spam.html nicht vorhanden, würde natürlich die Rule greifen und die Anfrage würde an seite.php?begriff=spam weitergeleitet werden. Durch diese Pseudo-Exclude-Anweisung wird spam.html komplett ignoriert.
Ich hoffe, du verstehst, was ich meine. Ich steige nämlich gerade selber nicht mehr durch :D
Mit der vorgeschlagenen file_exists PHP-Variante würde jede Anfrage an seite.php?begriff=XXX weitergeleitet werden (die Pseudo-Exclude-Anweisung aus der .htaccess entfernen) und du könntest irgendetwas damit machen (zum Beispiel includen):
if(file_exists($_GET['begriff'].'.php')) { include $_GET['begriff'].'.php'; exit(); } else { echo 'Die aufgerufene Datei existiert nicht.' // Datenbankabfragen, blabla... }
Beitrag zuletzt geändert: 17.6.2011 19:16:02 von fabo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage