PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: Seiten verlinken


Scream
2003-08-12, 23:02:21
Ich habe meine PHP Seite folgendermaßen aufgebaut:
Eine index.php mit 3 Tabellen. In jeder Tabelle wird eine andere Seite includet. Einmal die menu.php, einmal die top.php und die main.php.
Jetzt meine Frage:
Wenn ich im Menü zum Beispiel auf "News" klicke, wie geht das, dass die news.php automatisch in Tabelle von main.php geladen wird?
Wenn ich verlinke wird die news.php entweder gar nicht angezeigt oder in einem neuen Fenster geöffnet.

JTHawK
2003-08-12, 23:08:45
Eine Möglichkeit:

1. du verlinkst immer auf index.php

2. du übergibst eine variable beim link zb

<a href="index.php?do=news" target="_self">


3. den include machst du nun abhängig von dieser Variable


if ($do == "news") {
inlcude("news.php");
}


und das machst du dann mit allen anderen Menüpunkten so weiter

Scream
2003-08-12, 23:52:52
Recht herzlichen Dank !!

Nasenbaer
2003-08-13, 00:05:41
Original geschrieben von JTHawK

if ($do == "news") {
inlcude("news.php");
}


und das machst du dann mit allen anderen Menüpunkten so weiter
Nein machst du nicht! :)

Nimm lieber die Variante, denn die ist für sowas gedacht:

switch( $do )
{
case news:
include("news.php");
break;

case about:
include("about.php");
break;

default: // falls was falsches oder nichts angehängt wurde.
include("main.php");
break;
}


Mfg Nasenbaer

Scream
2003-08-13, 00:22:09
Auch dir danke !!
Aber was ist bei deiner Lösung eigentlich besser ? Schreiben muss man eigentlich genau so viel und sonst seh ich da keinen großen Unterschied.

Matthias2x
2003-08-13, 05:31:59
Original geschrieben von Scream
Auch dir danke !!
Aber was ist bei deiner Lösung eigentlich besser ? Schreiben muss man eigentlich genau so viel und sonst seh ich da keinen großen Unterschied.
du willst es kürzer, kein problem...

if($do){
include($do.'.php'); // wird $do übergeben, include entspr. File
} else {
include('main.php'); // andernfalls include ein default-File
}

einziger nachteil, wenns überhaupt einer ist, die variable $do muß du genauso benennen (ohne .php am ende) wie die Files welche includet werden sollen.
z.b.:
$do=news für news.php
$do=about für about.php

usw.

Nasenbaer
2003-08-13, 09:59:45
Original geschrieben von Scream
Auch dir danke !!
Aber was ist bei deiner Lösung eigentlich besser ? Schreiben muss man eigentlich genau so viel und sonst seh ich da keinen großen Unterschied.
Die switch-Anweisung ist gerade dafür gedacht Variablen auf verschiedene Werte hin zu überprüfen. In anderen Programmiersprachen wird der Compiler dadurch effizienteren Code generieren können genau wie hier der PHP-Interpreter.
Ob man den Unterschied hier merkt ist fraglich aber die Übersicht ist auf jedenfall höher.

Mfg Nasenbaer

JTHawK
2003-08-13, 21:53:34
Ich wollt jan icht gleich mit der Tür ins Haus fallen und alles Vorkauen, ein bisschen Eigeninitiative müssen die Leute schon zeigen.

Aber Ihr könnt ja auch gleich die Seite komplett schreiben - ich halte Euch nicht auf :D

Scream
2003-08-14, 00:11:12
Noch ne Frage:
Ich habe in der Index.php nen counter eingebaut. Wenn man ins Menü klickt, wird die Seite ja auch über die Index.php aufgerufen und es wird ein neuer Besucher gezählt. Wie kann ich das unterbinden?

Nasenbaer
2003-08-14, 00:27:09
Original geschrieben von Scream
Noch ne Frage:
Ich habe in der Index.php nen counter eingebaut. Wenn man ins Menü klickt, wird die Seite ja auch über die Index.php aufgerufen und es wird ein neuer Besucher gezählt. Wie kann ich das unterbinden?
Da gibts viele Möglichkeiten den gleichen Benutzer zu identifizieren. Per IP,Cookie,Session fallen mir da so ein.
Wie man es dann am besten umsetzt findeste per google raus. :)

Mfg Nasenbaer

Scream
2003-08-14, 00:47:26
Also der Counter hat ne Reloadsperre, die man in Sekunden setzen kann. Aber was bringt mir das? Ich weiss ja nicht, wie lange der auf meiner Seite surft und wie viele Links er aufruft.
Könnte man den Counter nicht irgendwie auslagern.
Oder das er nur beim ersten Seitenaufruf geladen wird ?

MadMan2k
2003-08-20, 02:07:21
du könntest ne reloadsperre per sessionid machen - der counter würde dann pro seitenaufruf nur einmal hochzählen

näheres (http://tut.php-q.net/sessions.html)

Scream
2003-08-30, 14:33:48
Noch was.
Den Code habe ich so:

switch($id)
{ case main1:
include("main1.php");
break;
case main2:
include("main2.php");
break;
case release:
include("release.php");
break;
default: // falls was falsches oder nichts angehängt wurde
include("main1.php");
break;
}


In der main1.php ist eine Tabelle enthalten, in die ich auch includen will.
Der Code da ist so:

switch($id)
{ case kino:
include("kino.htm");
break;
default: // falls was falsches oder nichts angehängt wurde
include("kino.htm");
break;
}


Dann müsste der Link ungefähr so lauten:
index.php?id=main1?id=Kino
Geht aber nicht. Wie kann ich das sonst machen?

Nasenbaer
2003-08-30, 14:45:56
Kann auch gar nicht gehen.
Du hast 2 mal eine Variable mit dem selben Namen. Du überschreibst dabei einfach die erste. ;)

Nenne die erste vielleicht $module und die zweite $submodule oder so ähnlich.

Und mehrere Variablen werden mit & angehängt:
index.htm?module=news&submodule=kino

Scream
2003-08-30, 14:49:48
Das "&" hat gefehlt.
Danke !!!

Scream
2003-09-03, 14:47:05
Und die nächste Frage.
Ich will bei meiner Seite oben in der Mitte was includen, das mache ich so:

<?switch($mitte)
{ case games:
include("mitte/release_games.htm");
break;
case kino:
include("mitte/release_kino.htm");
break;
default:
include("mitte/release.htm");
break;
}

Und unten in die Tabelle wie gehabt:

<?switch($sub)
{ case kino:
include("kino.htm");
break;
case games:
include("games.htm");
break;
}
?>

Kann ich jetzt die 2 Anweisungen irgendwie zusammenfassen, da ich nicht no eine Variable ($mitte) will.

Nasenbaer
2003-09-03, 16:13:09
Original geschrieben von Scream
Kann ich jetzt die 2 Anweisungen irgendwie zusammenfassen, da ich nicht no eine Variable ($mitte) will.
Soll bei beiden immer das gleiche angezeigt werden? Also entweder Kino oder Games oder können oben Games und unten Kino stehen?

Scream
2003-09-03, 16:57:02
Soll bei beiden immer das gleiche angezeigt werden?

Ja, immer das gleiche.

Nasenbaer
2003-09-03, 17:33:06
Dann nenne doch beide Argumente der Switch-Anweisungen gleich?


switch($sub)
{
case games:
include("mitte/release_games.htm");
break;

case kino:
include("mitte/release_kino.htm");
break;

default:
include("mitte/release.htm");
break;
}



Und unten in die Tabelle wie gehabt:

switch($sub)
{
case kino:
include("kino.htm");
break;

case games:
include("games.htm");
break;

default:
include( ? ? ? ? );
break;
}

Scream
2003-09-03, 23:35:55
Hätte ich selber darauf kommen können.
Trotzdem danke.

Scream
2003-09-04, 00:19:25
Schon wieder eine Frage ;-)
Kann ich mit nem Link auch eine Variable übergeben?
Als Beispiel habe ich den Link: index.php?id=games&sub=patches
Oben in der Mitte wird nun eine Datei geladen. In der Datei ist ein Array. Könnte man es einrichten, dass man mit dem Link eine bestimmte Zeile aus dem Array lesen kann?
Im Beispiel: Wenn ich den Link von oben nehme kann ich dann das Array mit dem Index Patches irgendwie auslesen und anzeigen lassen?
P.S. Der Code ist mir schon bekannt, ich will nur wissen, ob man das mit dem Link anstellen kann und wenn nicht, wie ich es sonst machen soll.

Nasenbaer
2003-09-04, 00:51:32
Original geschrieben von Scream
Schon wieder eine Frage ;-)
Kann ich mit nem Link auch eine Variable übergeben?
Als Beispiel habe ich den Link: index.php?id=games&sub=patches
Oben in der Mitte wird nun eine Datei geladen. In der Datei ist ein Array. Könnte man es einrichten, dass man mit dem Link eine bestimmte Zeile aus dem Array lesen kann?
Im Beispiel: Wenn ich den Link von oben nehme kann ich dann das Array mit dem Index Patches irgendwie auslesen und anzeigen lassen?
P.S. Der Code ist mir schon bekannt, ich will nur wissen, ob man das mit dem Link anstellen kann und wenn nicht, wie ich es sonst machen soll.

Wenn ich das jetzt richtig verstanden habe willst du mit einer URL eine Variable übermittelten dessen Inhalt dir aber zur Entwicklungszeit noch nicht bekannt ist?
Wenn ja dann machs doch so:

<a href="test.php?variable=<?php echo( $variablenwert); ?>" target="_self">Klick mich</a>


EDIT: Semikolon ergänzt :-)

Mfg Nasenbaer

Scream
2003-09-04, 11:06:53
Ich werde es im Laufe des Tages mal ausprobieren und antworte dann hier.

Scream
2003-09-06, 12:47:55
Also der Code ist soweit gut. Danke.

Scream
2003-09-08, 14:47:31
Noch einmal ganz zum Anfang:


default: // falls was falsches oder nichts angehängt wurde.
include("main.php");
break;

Kann man das auch trennen, also falls nichts angehängt z.B. wurde die Startseite, und falls was falsches angehängt wurde z.B. eine Fehlerseite.

Nasenbaer
2003-09-08, 15:44:05
Original geschrieben von Scream
Kann man das auch trennen, also falls nichts angehängt z.B. wurde die Startseite, und falls was falsches angehängt wurde z.B. eine Fehlerseite.
Jup klar geht das aber man muss etwas tricksen. ;)

default: // falls was falsches oder nichts angehängt wurde.
if( !isset( &var ) )
{
// &var is not set (nichts wurde angegeben)
}
else
{
// &var hat einen Inhalt. Aber dieser wurde vorher nicht
// abgefangen
}
break;

Mfg Nasenbaer

Scream
2003-09-10, 16:04:56
In der Mitte wird die Startseite geladen. In der Startseite befindet sich ein Counter. Bei Aufruf der Startseite wird natürlich der Counter aktualisiert. Über dem Logo oben wird der Counter erneut geladen, um ihn dann immer sichtbar zu machen.
Jetzt habe ich aber ein kleines Problem:
In der Index.php wird die Datei, in der das Logo ist am Anfang geladen, und danach die Seite in der Mitte. Wenn man jetzt auf die Startseite geht wird der Counter aktualisiert, oben wird der neue Stand aber erst nach einem erneuten Klick auf einen Link im Menü sichtbar, weil das Logo ja vor der Startseite in der Mitte geladen wird.
Kann man das irgendwie umschreiben?
Ich hoffe ihr versteht, was ich meine ;-)

blax
2003-09-13, 18:21:17
Wenn ich das richtig vertanden habe rufst du den counter 2mal auf: einmal in dem mittleren frame, und einmal unter dem banner

die anzeige des counters unter dem banner muss so programmiert sein, dass der counter nur das ergebnis anzeigt, und nicht den counter weiterzählt


oder hab ich da was falsch verstanden?

Scream
2003-09-13, 21:02:45
Ja genau, bis dahin stimmt das so. So weit bin ich auch schon. Aber:
Der Counter unter dem Banner wird in der Datei zuerst aufgerufen. Danach der Counter auf der Startseite. Darum ist der Counter unter dem Banner aber nicht immer aktuell. Erst wenn die Datei erneut aufgerufen wird, wird der Counter unter dem Banner aktualisiert. Das ist mein Problem.

Nase
2003-09-13, 23:50:49
Dann dreh das Ganze doch einfach um. Also der Counter, der die Besucher zählt, kommt in den Bannerteil, die Ausgabe in den Mainteil.

Scream
2003-09-14, 08:46:25
Kann ich nicht machen, weil im Main Teil immer die Seite aus dem Menü includet wird.

Scream
2006-08-23, 23:31:05
Nein machst du nicht! :)

Nimm lieber die Variante, denn die ist für sowas gedacht:

switch( $do )
{
case news:
include("news.php");
break;

case about:
include("about.php");
break;

default: // falls was falsches oder nichts angehängt wurde.
include("main.php");
break;
}


Mfg Nasenbaer


ich hab ein problem
und zwar geht dieser code seit geraumer zeit nicht mehr
kann es sein dass bei einer neuen php version das anders geregelt werden muss?

3 pages auf 3 verschiedenen servern sind davon betroffen
egal welchen link man anklickt es wird immer die index.php neu geladen.........






EDIT: $id=$_GET['id']; dann gehts ;)
haben sie jetzt wohl bei allen anbietern geändert das mit den register globals.......

Wanginator
2006-08-24, 01:23:55
EDIT: $id=$_GET['id']; dann gehts ;)
haben sie jetzt wohl bei allen anbietern geändert das mit den register globals.......

ist auch sicherer so :)

Gast
2006-08-24, 19:29:36
EDIT: $id=$_GET['id']; dann gehts ;)
haben sie jetzt wohl bei allen anbietern geändert das mit den register globals.......
Pfui, nicht auf register globalsv erlassen!


Außerdem: wozu im <a>-Tag ein target="_self", es is doch immer self, und man sollte die Kontrolle beim User belassen und in XHTML 1.0 strict gibts das nimmer

darph
2006-08-25, 10:33:53
du willst es kürzer, kein problem...

if($do){
include($do.'.php'); // wird $do übergeben, include entspr. File
} else {
include('main.php'); // andernfalls include ein default-File
}
Ganz ganz schlecht.

index.php?do=../../../../irgendeinewichtigesystemdatei ;)



€dit: Oh. alt. ;(

Doch noch was neues: und in XHTML 1.0 strict gibts das nimmerUnd bevor jetzt noch einer sagt "Jaja, ich schreibe aber in transitional" - ja, nun. Transitional, wer der italienischen Sprache mächtig ist, wird mir zustimmen, bedeutet hier "Übergangsweise". Also, daß bestehende Seiten für einen Übergangszeitraum valide gemacht werden können, bis das Webseitenteam mit was Neuem aufwarten kann. Für eine Übergangszeit. Es ist gewiß nicht dafür gedacht, neue Seiten damit zu schreiben, weil's bequemer ist. Und dann Javascriptlinks zu verwenden, um die Seite trotzdem im neuen Fenster zu erzwingen ist ganz pös. ;)

The_Invisible
2006-08-25, 12:45:08
Ganz ganz schlecht.

index.php?do=../../../../irgendeinewichtigesystemdatei ;)



wo dann (bei nem gescheiten server) die open_basedir restriction greifen sollte

Warning: main() [function.main]: open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s)

mfg

darph
2006-08-25, 12:52:37
Sicher richtig. Aber hier: sollte liegt das Kaninchen im Mohnfeld begraben. Sofern ich meinen Webserver nicht selbst eingerichtet und eingestellt habe, würde ich nicht drauf vertrauen.

Da ist die vorgenannte case-Variante mit Defaultwert doch besser. Okay, es mag mehr Code zu schreiben sein, aber die zusätzliche Sicherheit sind die paar Zeilen doch allemal wert. Wer es beim Programmieren aus Bequemlichkeit vermeiden will, etwas mehr Code zu schreiben, sollte es vielleicht ganz lassen. ;)

Oder man holt sich den Seiteninhalt aus einer Datanbank. Kein Zugriff auf's Filesystem, die durch Aktionen des Besuchers manipulierbar wären.

The_Invisible
2006-08-25, 13:12:54
Sicher richtig. Aber hier: liegt das Kaninchen im Mohnfeld begraben. Sofern ich meinen Webserver nicht selbst eingerichtet und eingestellt habe, würde ich nicht drauf vertrauen.

Da ist die vorgenannte case-Variante mit Defaultwert doch besser. Okay, es mag mehr Code zu schreiben sein, aber die zusätzliche Sicherheit sind die paar Zeilen doch allemal wert. Wer es beim Programmieren aus Bequemlichkeit vermeiden will, etwas mehr Code zu schreiben, sollte es vielleicht ganz lassen. ;)

Oder man holt sich den Seiteninhalt aus einer Datanbank. Kein Zugriff auf's Filesystem, die durch Aktionen des Besuchers manipulierbar wären.

das kann man ja ganz schnell testen :D

aber ansonsten hast schon recht.

mfg

Marscel
2006-08-25, 14:15:52
Solche Fehler haben mir schon einigen Spaß auf dem Server von manchem erlaubt. Was ich da alles finden konnte. :D

basename(), realpath(), file_exists() sowie vorgegebene Pfade im Code usw. sind hier Pflicht.

Kampf-Sushi
2006-08-25, 14:28:12
du willst es kürzer, kein problem...

if($do){
include($do.'.php'); // wird $do übergeben, include entspr. File
} else {
include('main.php'); // andernfalls include ein default-File
}

einziger nachteil, wenns überhaupt einer ist, die variable $do muß du genauso benennen (ohne .php am ende) wie die Files welche includet werden sollen.
z.b.:
$do=news für news.php
$do=about für about.php

Hm...

$do=index;
if($do){
include($do.'.php'); // wird $do übergeben, include entspr. File
} else {
include('main.php'); // andernfalls include ein default-File
}

Wenn du das so machst, solltest du $do auf jeden Fall vorher überprüfen ^^

The_Invisible
2006-08-25, 14:37:25
Hm...

$do=index;
if($do){
include($do.'.php'); // wird $do übergeben, include entspr. File
} else {
include('main.php'); // andernfalls include ein default-File
}

Wenn du das so machst, solltest du $do auf jeden Fall vorher überprüfen ^^

ich würde auch noch im file welches die dateien includet ein 'define("PARENT",true)' machen und dieses in den include dateien prüfen, da diese ja nicht zum standalone aufrufen gedacht sind und es böse überraschungen geben könnte

mfg