Umstieg PHP 5.3 auf 5.4 fehlende Kompatibilität eines Scripts?
Michael
- php
Hallo,
ich habe seit gestern die Möglichkeit PHP 5.4 zu nutzen, da mein Hoster die neue Version im Angebot hatte. Leider funktioniert aber mein Script mit der neuen Version nicht mehr, es wird keine Seite mehr geladen.
Es geht hier um ein PHP Script welches mir Inhalte dynamisch in einer Index.php lädt die quasi das Design und die Seite in Form bringt, nur die Inhalte werden gewechselt.
Hier mein Script:
<?php
$action = "";
if(isset($HTTP_GET_VARS['action'])){$action = $HTTP_GET_VARS['action'];}
switch($action){
case "startseite": include("startseite.php"); break;
case "impressum": include("impressum.php"); break;
default: include("startseite.php"); break;
}
?>
Ruft man jetzt z.B. das Impressum auf sieht der Link so aus:
http://domain.tld/index.php?action=impressum
Das Problem ist jetzt halt das der Inhalt der Seite mit PHP 5.4 nicht gewechselt werden kann, es bleibt lediglich beim Index also der Startseite hängen.
Hat jemand eine Idee was ich dafür anpassen muss?
Grüße,
Michael
Hallo Michael,
if(isset($HTTP_GET_VARS['action'])){$action = $HTTP_GET_VARS['action'];}
$HTTP_GET_VARS ist schon seit der Einführung von $_GET in Version 4.1(!) veraltet, ist seit 5.0 nur noch verfügbar gewesen wenn register_long_arrays eingeschaltet war und wurde mit 5.4 ganz abgeschafft.
Gruß,
Tobias
$HTTP_GET_VARS ist (schon lange) veraltet.
Beispiel mit http://domain.tld/index.php?action=impressum
if(isset($_GET['action']))
{
switch($_GET['action'])
{
case 'impressum': include 'impressum.php'; break;
default: include 'startseite.php'; // No break!
}
}
$HTTP_GET_VARS ist (schon lange) veraltet.
Beispiel mit http://domain.tld/index.php?action=impressum
if(isset($_GET['action']))
{
switch($_GET['action'])
{
case 'impressum': include 'impressum.php'; break;
default: include 'startseite.php'; // No break!
}
}
Super, danke das funktioniert soweit.
Habe nur ein Problem, wenn ich jetzt die domain.tld aufrufe dann ist quasi dort wo die Startseite nun sein sollte kein Inhalt hinterlegt, also quasi nur die Index.php ohne Inhalt. Rufe ich allerdings den Link so auf http://domain.tld/index.php?action=startseite dann sieht man die Seite die auch direkt beim ersten ansurfen zu sehen sein soll.
Wie schaffe ich es also das ich nach Eingabe der domain.tld gleich auf die Startseite komme, das hat mit dem alten Script funktioniert?
Ich danke dir schonmal für die Hilfe!
Hallo Michael,
Wie schaffe ich es also das ich nach Eingabe der domain.tld gleich auf die Startseite komme, das hat mit dem alten Script funktioniert?
Indem du nicht den Code von Xileks einfach blind übernimmst (er macht nicht das gleiche wie dein alter Code) sondern deinen Code entsprechend auf $_GET umschreibst.
Gruß,
Tobias
if(isset($_GET['action']))
{
switch($_GET['action'])
{
case 'impressum': include 'impressum.php'; break;
default: include 'startseite.php';
}
}
// Wenn kein Action übergeben wurde oder NULL ist
else
{
include 'startseite.php'
}
So einfach :) Aber tk hat recht wenn er schimpft. Sollte nur ein sample sein und keine Komplettlösung. Hätte ich aber auch bei schreiben können. Frisch bisschen dein PHP auf, du bist wohl ziemlich eingerostet ;D
Viel Spaß damit.
if(isset($_GET['action']))
{
switch($_GET['action'])
{
case 'impressum': include 'impressum.php'; break;
default: include 'startseite.php';
}
}
// Wenn kein Action übergeben wurde oder NULL ist
else
{
include 'startseite.php'
}
>
> So einfach :) Aber tk hat recht wenn er schimpft. Sollte nur ein sample sein und keine Komplettlösung. Hätte ich aber auch bei schreiben können. Frisch bisschen dein PHP auf, du bist wohl ziemlich eingerostet ;D
>
> Viel Spaß damit.
Ich konnte noch nie PHP, das Script hatte mir ein Kollege damals 2007 für meine Seite geschrieben und da bisher alles lief hab ich nie etwas daran verändert.
Es funktioniert so, allerdings hast du den ; hinter include 'startseite.php' vergessen ;)
Danke vielmals und viele Grüße,
Michael
Hm...
Der Code hat einige Unzulänglichkeiten hinsichtlich der Pflegbarkeit. Es müsste nämlich bei Einpflegen weiterer Seiten tief eingegriffen werden. Das ist unübersichtlich und gibt nur Ärger.
Alternierende Vorschlag ist ETWAS WIE:
// Konfiguration
$arZulaessigeSeiten = array(
'startseite'
'impressum',
'kontakt',
'seite_1'
);
if( isset($_GET['action']) )
if ( in_array($_GET['action'],$arZulaessigeSeiten) ) {
$zuLaden = './includes-enabled/' . $_GET['action'] . '.php';
include $zuLaden; // or Fehlerbehandlung (Datei $zuLaden nicht lesbar)
} else {
include './includes-errors/404-Not_Found.php'; // or Fehlerbehandlung
}
}
// Wenn kein Action übergeben wurde oder NULL ist
else {
include './includes-enabled/startseite.php'; // or Fehlerbehandlung
}
In der Konfiguration werden die zulässigen "Seiten" gelistet, damit es später keine Sicherheits-Probleme mit dem Include gibt. Diese sollte natürlich dort stehen, wo auch andere Dinge konfiguriert werden. Der Array kann auch durch Auslesen eines Verzeichnisses (hier './includes-enabled/') gebildet werden. Das schafft die Möglichkeit weitere Includes, z.B. in './includes-available/' oder './includes-admin/' vorzuhalten, aber nicht öffentlich zugänglich zu haben.
Wenn eine 'action' übertragen wurde, dann wird diese auf Gültigkeit überprüft und im Falle der positiven Übereinstimmung das Modul geladen. Im negativen Falle die passenden Fehlerseiten.
An Stelle der Konfiguration KÖNNTE ETWAS WIE folgendes treten:
function getZulaessigeSeiten( $verzeichnis ) {
// Gibt Array zulässiger Seiten zurück.
// Aufrufbeispiel: $arZulaessigeSeiten = getZulaessigeSeiten('./includes-enabled/');
if ($handle = opendir($verzeichnis)) {
$arZulaessigeSeiten=array();
while (false !== ($dateiname = readdir($handle))) {
if (0 != strpos($dateiname, '.') { // Ausschluss versteckter Dateien
if (is_file($verzeichnis . '/' . $dateiname) ) && (is_readable($verzeichnis . '/' . $dateiname) ) ) {
$arZulaessigeSeiten[] = $entry;
}
}
}
closedir($handle);
return $arZulaessigeSeiten;
} else {
// Hier Fehlerbehandlung ("Include-Verzeichnis $verzeichnis kann nicht geöffnet werden").
// ggf. return false oder exit...
}
}
Das wäre aber Unsinn, denn dann wäre ETWAS WIE
if( isset($_GET['action']) ) {
// Ausschluss unsichtbarer Dateien wie.z.B. '.htaccess':
// Ausschluss der Adressierung von Verzeichnissen '/' - z.B. '/etc/passwd':
if ( ( 0 === str_pos($_GET['action'], '.') ) || ( ! false === str_pos($_GET['action'], '/') ) ) {
$zuLaden = './includes-errors/403-Forbidden.php'; // or Fehlerbehandlung
} else {
$zuLaden = './includes-enabled/' . $_GET['action'] . '.php'; // or Fehlerbehandlung
}
if ( is_file($zuLaden) && is_readable($zuLaden) ) {
include $zuLaden; // or Fehlerbehandlung
else {
include './includes-errors/404-Not_Found.php'; // or Fehlerbehandlung
}
}
// Wenn kein Action übergeben wurde oder NULL ist
else {
include './includes-enabled/startseite.php'; // or Fehlerbehandlung
}
... einfacher und "kostengünstiger".
Alternierend könnte ein CMS den Array $arZulaessigeSeiten automatisch beim Anlegen neuer Seiten erzeugen und in einer zu lesenden Datei ablegen. Code wie oben. Das würde auch Sinn machen und wäre sehr "kostengünstig".
Der "PHP-Code" ist eine IDEE oder ein ENTWURF und nicht getestet.
Fred
Hi,
ich habe seit gestern die Möglichkeit PHP 5.4 zu nutzen, ...
das ist okay, aber wenn du selbst noch auf dem Stand von vor zehn Jahren bist, hilft das nicht wirklich viel.
if(isset($HTTP_GET_VARS['action'])){$action = $HTTP_GET_VARS['action'];}
Ich bin mir mit der Version nicht ganz sicher, aber AFAIK gilt $HTTP_GET_VARS schon seit PHP4 als veraltet. Verwende stattdessen das sinngemäß entsprechende superglobale Array $_GET.
So long,
Martin