• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

Ein paar troubles mit php5 (Anfänger Zeugs)

Chemiker

Well-known member
Registriert
11 Oktober 2001
Beiträge
1.377
Punkte Reaktionen
0
Hallöchen!

Ich bin vor einiger Zeit auf Ubuntu umgestiegen und hab' mir jetzt einen Apache2 Server mit PHP5 und MySQL für Webseitenentwicklung eingerichtet.


Mein Code sieht folgendermaßen aus (index.php):
Code:
<?php

	error_reporting(E_ALL);

	global $page;

	if ($page == "") {$page = "einl";}

	include("header.php");
	include("navi.php");
	include("$page.php");
	include("footer.php");

?>

Nun wird die erste Seite auch korrekt dargestellt und weder Opera noch Firefox motzen über Parsing Errors, nur funktionieren Links nicht. D.h. wenn ich z.B.
Code:
<a href="index.php?page=avenger.php>
anklicke, ändert sich die variable Seite nicht und bleibt nach wie vor "einl". Komischerweise funktionieren die Seiten einwandfrei wenn sie auf meinen Webspace liegen [www.cistron.de/avenger k.A. was für eine PHP Version dort läuft].

Hat jemand eine Ahnung woran es hakt?

ciao und danke schonmal,
Chemiker
 
Ich habe nur ganz grundlegende PHP-Kentnisse und was du da machst, erscheint mir schon recht hoch.

Aber ich würde darauf tippen, dass auf dem Server PHP 5 läuft.

Zum "Fehler" würde ich sagen, dass du zwei verschiedene Variablen mit dem Namen page hast: die globale Variable Page und die lokale Variable Page. Da PHP so frei ist, sind auch vielen Fehlerquellen die Türen offen.

Muss page global sein? Sonst würde ich sagen lass die Deklaration weg.



Das ganze ist nur ein Schuss ins blaue. Mit dem was ich so über das Programmieren und über PHP weiß, würde ich aber darauf tippen. Ich würde es sonst gar nicht vorschlagen, aber irgendwie hilft dir keiner.
 
Code:
	global $page;

	if ($page == "") {$page = "einl";}
Was wird angezeigt, wenn du ein
echo $page; einfügst?

Code:
include("$page.php");
Wenn $page wie in deinem Beispiel "avenger.php" ist, dann ist $page.php also "avenger.php.php"?

Code:
<a href="index.php?page=avenger.php>
Da fehlen Anführungszeichen.

Komischerweise funktionieren die Seiten einwandfrei wenn sie auf meinen Webspace liegen [www.cistron.de/avenger k.A. was für eine PHP Version dort läuft].

Hat jemand eine Ahnung woran es hakt?
phpinfo() hilft dir weiter. Guck da mal nach auf beiden Servern, was für die Variable register_globals eingestellt ist.
http://www.php-faq.de/q/q-sicherheit-global.html

Persönlich halte ich nichts von Variablen, die vom Benutzer beeinflußbar sind, aber nicht vor der Verwendung in Skripten überprüft werden.
http://www.php-faq.de/q/q-sicherheit-parameter.html
 
Wenn Du in PHP (egal welche Version) quotest (Gänsefüsse), dann werden Variablen zwischen den Quotes ausgelesen.

Du definierst eine Variable

$page

und dann wird

include("$page.php");

im Falle dass $page den Wert avenger.php enthält zu

include("avenger.php.php");

die es ziemlich sicher nicht bei Dir gibt.

Zum Zweiten, Du willst Get-Variablen auslesen:

<a href="index.php?page=avenger.php>

Die musst Du dann natürlich auch abfragen.

mit global $page; macht man das nicht. global definiert nur, das Funktionen und Methoden auf Variablen außerhalb ihres Gültigkeitsbereiches zugreifen können. Was Du wahrscheinlich meinst ist register_globals, allerdings steht Dir das nicht auf jedem Webserver zur verfügung und ist generell eine schlechte Idee.

Alle per GET übergebenen Variablen stehen seit PHP 4.1 im superglobalen Array $_GET zur Verfügung, also in Deinem Beispiel unter $_GET['page'].

Und dann noch ein Fehlerchen:

if ($page == "") {$page = "einl";} wird nur in dem Fall zu einl, wenn die Get-Variable den Wert "" enthält. Ansonsten wird der dort vom Browser übergebene Wert benutzt, ein sperrangelweites Scheunentor.

Besser wäre hier der Befehl switch.

Code:
<?php

error_reporting(E_ALL);



switch($_GET['page']) {
  case "avenger": $page="avenger.php"; break;
  case "irgendwas": $page="irgendwas.php"; break;
  default: $page="einl.php"; 
  }
include("header.php");
include("navi.php");
include($page);
include("footer.php");

?>

damit ist es praktisch egal, was als Wert vom browser übergeben wird. Solange er nicht exakt bei einer der Konditionen von switch passt, wird immer mittels der default-definition die include-datei einl.php geladen.

dann passiert auch bei einem solchen Aufruf:

http://www.cistron.de/avenger/index.php?page=nichtexistierende_seite

nicht das hier:

Warning: main(nichtexistierende_seite.php): failed to open stream: No such file or directory in /var/www/web113/html/avenger/index.php on line 11
Warning: main(nichtexistierende_seite.php): failed to open stream: No such file or directory in /var/www/web113/html/avenger/index.php on line 11
Warning: main(): Failed opening 'nichtexistierende_seite.php' for inclusion (include_path='.') in /var/www/web113/html/avenger/index.php on line 11

Falls in dieser include-Datei Dinge abgehandelt werden, die für das weitere Script von Bedeutung sind, dann verwende anstelle include den Befehl require

Der Link wäre dann nebenbei einfacher und nicht so auskunftsfreudig.

<a href="index.php?page=avenger">blablabla</a>

und hier noch die Bibel des PHP auf deutsch
 
Hui danke! Meine PHP Kenntnisse sind zwar beschränkt, aber ich werd' mich duch das mal durchwühlen und herumprobieren.
 
Ooookay. Hab' mir euren Rat zu Herzen genommen und index.php entsprechend modifiziert, nur bekomm' ich weiterhin eine Fehlermeldung, wenn ich ohne spezifizierten ?page=blah link auf die Seiten zugreife. Und zwar folgendes:
Code:
Notice: Undefined index: page in /var/www/avenger/index.php on line 4

Index.php:
Code:
<?php
	error_reporting(E_ALL);

	switch($_GET['page']) {
		case "einl": $page="einl"; break;		
		case "avenger": $page="avenger"; break;
		case "vengeance": $page="vengeance"; break;
		case "block": $page="block"; break;
		case "resis": $page="resis"; break;
		case "stats": $page="stats"; break;
		case "skills": $page="skills"; break;
		case "equip": $page="equip"; break;
		case "merc": $page="merc"; break;
		case "gameplay": $page="gameplay"; break;
		case "nut": $page="nut"; break;
		case "gestatten": $page="gestatten"; break;
		case "calc": $page="calc"; break;
		case "epilog": $page="epilog";
		default: $page="einl"; break;
		}

	require_once("header.html");
	require_once("navi.php");
	require_once("$page.html");
	require_once("footer.html");
?>
Zeile 4 wäre ja dann wohl "switch($_GET['page']) {". Was passt nun daran nicht? Wenn ich einen link ala "index.php?page=avenger" verfolge, ist die Fehlermeldung weg.

Danke schonmal für eure Hilfe.
 
Wenn du keine GET variable "page" hast gibts natürlich ein Fehler/Warnung.
Folgendes wurde dir ans Herz gelegt
Persönlich halte ich nichts von Variablen, die vom Benutzer beeinflußbar sind, aber nicht vor der Verwendung in Skripten überprüft werden.

Du solltest auch bevor du die $_GET['x'] verwendest mit isset() oder ähnlichem nachsehen ob dieses überhaupt definiert ist.
 
Was wäre denn die bessere Alternative, um unterschiedliche Seiten zu inkludieren? Alle Tutorials die ich lese schmeißen einfach die Navigation und den Rest in die content files per include() oder require(). Aber somit muss man doch wieder viele Seiten manipulieren, sollte man etwas an der Seitenstruktur ändern wollen.

Wie definiere ich $page als $_GET variable?


edit:
okay, nun weiß ich auch was $_GET Variablen sind. Theoretisch könnte es mir ja egal sein, ob PHP mich darüber informiert, dass $page nicht definiert ist, beim ersten Ankommen auf index.php. Immerhin bekomm' ich später die notice ja nicht mehr, wenn ich den error_report Befehl rausnehme. Was meint ihr dazu?

edit2:
Notice hin oder her, das dürfte doch ein Weg sein, um sie zu vermeiden:
Code:
<?php
	error_reporting(E_ALL);

	if (isset($_GET['page'])) {	
	switch($_GET['page']) {
		case "einl": $page="einl"; break;		
		case "avenger": $page="avenger"; break;
		case "vengeance": $page="vengeance"; break;
		case "block": $page="block"; break;
		case "resis": $page="resis"; break;
		case "stats": $page="stats"; break;
		case "skills": $page="skills"; break;
		case "equip": $page="equip"; break;
		case "merc": $page="merc"; break;
		case "gameplay": $page="gameplay"; break;
		case "nut": $page="nut"; break;
		case "gestatten": $page="gestatten"; break;
		case "calc": $page="calc"; break;
		case "epilog": $page="epilog"; break;
		default: $page="einl"; break;
		}
	} else {
	$page="einl";	
	}
	
?>

edit3:
Oder doch ein Array?
Code:
	$seite = array();
	$seite['einl']="einl";
	$seite['avenger']="avenger";
	$seite['block']="block";
	$seite['resis']="resis";
	$seite['stats']="stats";
	$seite['skills']="skills";
	$seite['equip']="equip";
	$seite['merc']="merc";
	$seite['gameplay']="gameplay";
	$seite['nut']="nut";
	$seite['gestatten']="gestatten";
	$seite['calc']="calc";
	$seite['epilog']="epilog";

	if (isset($_GET['page']) AND isset($seite[$_GET['page']])) {
	$page=$seite[$_GET['page']];
	} else {
	$page=$seite['einl'];
	}
 
Chemiker schrieb:
edit2:
Notice hin oder her, das dürfte doch ein Weg sein, um sie zu vermeiden:

Code:
<?php
	error_reporting(E_ALL);

	if (isset($_GET['page'])) {	
	switch($_GET['page']) {
		case "einl": $page="einl"; break;		
		case "avenger": $page="avenger"; break;
	[...snip...]
		case "epilog": $page="epilog"; break;
		default: $page="einl"; break;
		}
	} else {
	$page="einl";	
	}
	
?>

so sieht es schon besser aus.

edit3:
Oder doch ein Array?

da würdest Du einen User-generierten Wert als index an ein Array übergeben. Sollte zwar theoretisch genauso sicher sein wie switch, würde ich aber prinzipiell vermeiden.
 
Danke, virusette!

Weiß trotzdem jemand einen Weg, wie ich die $_GET Variable bei einem ähnlichen Seitenaufbau umgehen kann? Ich hab' gestern noch bei "A list apart" herumgestöbert, also scheinbar machen die Webdesign-Profis das auch so. Aber niemand ist unfehlbar und man liest beim Markup schon teilweise den größten Quatsch von irgendwelchen selbsternannten Gurus.
 
Aetra schrieb:
Warum willst du alles innerhalb der gleichen URI machen? Was spircht gegeb
http://server.com/einl.php http://server.com/avenger.php, etc?
Dass ich dann jede Menge Files mit dem selben includes hab'. Für den Guide wäre das ja schnurzegal, weil es sowieso nur eine Hand voll Seiten sind. Aber bei einem größeren Projekt ist es schon umständlich etwas an der Struktur zu verändern.
 
Grade eben packst du deine "Struktur" in php code. das ist nicht grade ideal und am schwierigsten wenn du dann deine "struktur" verändern willst. Ein grosses Projekt inkludiert eine Datei und die macht dann alles wie z.B. das Menu, Header, Footer, etc anzuzeigen,
 
Irgendwie muss die Usereingabe rüberkommen und das sind nun mal im Prinzip nur $_GET und $_POST und Links

$_POST benötigt dann aber Formulare und da schwächelt z.B. der IE6 beim CSS, z.B. gibt es für input/submit keinen hover-effekt u.a.

Links kann man natürlich auf dem Webserver abfangen und wieder in Variablen umsetzen, daß ist aber erstmal ein anderes Thema.

Für größere Projekte sollte man sich vielleicht mal auch mit anderen, höheren Auszeichungssprachen als HTML/XHTML beschäftigen und vor allem mit DBs.

Desweiteren ist bei größeren Projekten PHP möglicherweise nicht performant genug, perl wäre eine erste Altenative.
 
Du hast noch nie ein größeres Projekt in perl geschrieben, soviel steht fest :D
 
>>Desweiteren ist bei größeren Projekten PHP möglicherweise nicht performant genug, perl wäre eine erste Altenative.

Das halte ich mal für stark vom Entwickler abhängig :D
 
Wir wollen ja nicht übertreiben. Ich plane keine Präsenz mit mehr als tausend Seiten (wobei ich denke, dass selbst dabei MySQL und PHP ausreichen müssten), sondern lediglich ~100.

Für größere Projekte sollte man sich vielleicht mal auch mit anderen, höheren Auszeichungssprachen als HTML/XHTML beschäftigen und vor allem mit DBs.
Wie meinst du das? Anderes Markup verwenden, oder schlicht den content von der DB abrufen? Dabei wird doch anschließend sowieso wieder XHTML ausgegeben und vom Browser geparst, oder etwa nicht?

Grade eben packst du deine "Struktur" in php code. das ist nicht grade ideal und am schwierigsten wenn du dann deine "struktur" verändern willst.
Finde ich schon praktischer. Ich ändere lieber ein index- und vielleicht extra ein config-file, als 100 einzelne Seiten, nur weil mir etwas nicht mehr passt.

Trotzdem schön, dass sich hier soviele daran beteiligen. Von mir aus könnt' ihr ruhig darüber diskutieren, wie man denn am besten ein mittelgroßes Projekt aufzieht. Kann für mich nur von Vorteil sein, ein bisschen den Profis auf die Finger zu schauen.
 
Zurück
Oben