Variable nicht definiert - Kleines Problem bei Funktion

kalterjava

Erfahrenes Mitglied
Hi,

ich versuch mich nun ein wenig an PHP um meine einfache HTML-Seite etwas dynamischer zu machen, um nicht ständig Änderungen in jeder einzelnen Seite wenn es um die Navi geht vornehmen zu müssen. Meine PHP-Kenntnisse: Anfängerstatus :)

Was geht ist mein Code:

PHP:
<li><a href="index.php" title="Home"
<?php 
if ($page == 'index.php') { 
?>
class="active"
<?php } ?>
>Home</a></li>

Die Seitenbezeichnung bekomme ich über:
PHP:
$page = basename($_SERVER['SCRIPT_NAME']);

Da dies sehr zerfranst ausschaut, würde ich diesen Code gerne kompakter in einer Funktion unterbringen.
Dieser Versuch scheitert jedoch:
PHP:
<?php
$navilink = "";
$titellink = "";
$linkbezeichnung = "";
$status = "";
?>

<?php 
function navigation($navilink, $titellink, $linkbezeichnung, $status){
$page = basename($_SERVER['SCRIPT_NAME']);
echo ("<li><a href="+$navilink+" title="+$titellink+"");
if ($page == $navilink){ 
echo ("class =" + $status +"" + ">"+$linkbezeichnung+"</a></li>>");
}//end if
}//end function navigation
?>
<?php
navigation("index.php", "Home", "Home", "active"); 
?>

Wenn ich nicht noch einmal die Zeile
$page = basename($_SERVER['SCRIPT_NAME']);

in die Funktion lege, bekomme ich einen Fehler, dass die Variable page unbekannt ist.
Wenn ich diese Zeile wie oben zusätzlich in die Funktion lege, dann bekomme ich keinen Fehler mehr. Als Ausgabe steht dort jedoch nicht der Link sondern 00


Wer hat mir einen Tipp?
EDIT: Danke, habe es selbst herausgefunden - es waren zu viele "" gesetzt.
 
Zuletzt bearbeitet:
item: Tu dir selber ein Gefallen und formatiere den Code.
a) Eintrücken bei jeder klammer
b) Funktionen nicht mitten im Code, sondern am Ende oder am Anfang

item: String zusammensetzen geht in PHP mit einem Punkt, nicht mit +. Mit + Werden Zahel gerechnet. Oder du arbeitest gleich mit geparsten Strings
PHP:
//Die folgenden Zeilen geben alle dasselbe aus:

//Normal geparster String
echo ("<li><a href=$navilink title=$titellink");
//geparster String mit der Curly-Syntax (mMn der beste)
echo ("<li><a href={$navilink} title={$titellink}");
//Strings zusammensetzen mit .
echo ("<li><a href=" . $navilink . " title=" . $titellink);
//Ungeparste Strings zusammensetzen mit .
echo ('<li><a href=' . $navilink . ' title=' . $titellink);

Für $page:
Du hast mehrere Möglichkeiten. Grundsätzlich kennt eine Funktion die Variablen von Ausserhalb nicht.
PHP:
$page = 'index.php';

//die folgende Funktion gibt nix aus
function f(){
    echo $page;
}

//die folgenden Funktionen geben $page aus
//$page als Funktionsargument mitgeben
function f($page){
    echo $page;
}

//über die Superglobale $GLOBALS zugreiffen
function f(){
    echo $GLOBALS['page'];
}

//$page als global deklarieren
function f(){
    global $pages;
    echo $page;
}
 
Du könntest dir $page auch global machen, da die Variablen welche ausserhalb von Funktionen definiert wurden, nicht innerhalb von Funktionen gültig sind:

PHP:
$page = "datei.php";

function testFunction(){
     global $page;

   return $page;
}

Noch dazu werden in PHP Zeichenketten nicht mit einem "+" zusammengesetzt sondern mit einem Punkt ".".
PHP:
$var1 = "foo";
$var2 = "bar";

echo $var2 . $var2;
 
Hi Yaslaw,

danke für die Infos. Oh, das habe ich verwechselt mit dem zusammensetzen von Strings. Und ja, ich rücke normalerweise alles sauber ein, aber hab schon oft gelesen und auch selbst erlebt, dass manchmal ein Fehler ausgegeben wird bzw. eine Code-Zeile falsch in HTML angezeigt wird, wenn TABs oder sonstige unnötige Leerzeichen und Zeilenumbrüche im Code sind.
Hast du da auch schon schlechte Erfahrung gemacht.

Das mit der Page-Variablen muss ich mir nochmal anschauen - vielen Dank!
 
Hi Yaslaw,
danke für die Infos. Oh, das habe ich verwechselt mit dem zusammensetzen von Strings. Und ja, ich rücke normalerweise alles sauber ein, aber hab schon oft gelesen und auch selbst erlebt, dass manchmal ein Fehler ausgegeben wird bzw. eine Code-Zeile falsch in HTML angezeigt wird, wenn TABs oder sonstige unnötige Leerzeichen und Zeilenumbrüche im Code sind.
Hast du da auch schon schlechte Erfahrung gemacht.
Nein, das habe ich nicht. Ich füge Tabs, Leerzeichen und Zeilenumbrüche im HTML-, PHP- und SQL-Code ein. Bisher ohne Verzerrungen im generierten HTML-Code. Auch eine saubere HTML-Seite hat sauber formatierten Code (schau nur mal den Source-Code dieser Seite an. Ist nicht perfekt, aber lesbar mit Eingerückten Elementen)).
 
OK, dann kann ich das bedenkenlos auch so machen.
Bei deinen Beispielen oben gibt es jedoch ein Problem. Wie setzt du die Anführungszeichen bei z.B. title "Home"?

Ich bekomme das nur hin, wenn ich diese mit einem \ escape
also so class=\"$status\";
 
Nachteile? Nein, hat sie nicht.
Vorteile: Meiner Meinung nach besser lesbar. Und du brauchst weniger Zeichen :P

Vielleicht noch als Randbemerkung: echo ist keine PHP-Funktion im eigentlichen Sinne und benötigt keine Klammern (die sind optional):
PHP:
$welt = 'Welt';
echo "Hallo {$welt}"; //doppelte Anführungszeichen mit Variablen
echo 'Hallo Welt'; //einfache Anführungszeichen ohne Variablen (schneller)
//ist das gleiche wie
echo ("Hallo {$welt}");
echo ('Hallo Welt');
 
Zuletzt bearbeitet:
So, jetzt gibt es doch noch einen Schönheitsfehler. Wie kann ich denn prüfen ob der Rückgabewert von $page im Dateinamen enthalten ist?

Ich habe nämlich 2 Menüpunkte mit Untermenüs. Somit kann ich die oben geschriebene Funktion

if ($page == 'index.php') {

nicht verwenden, da ich auf mehrere Seiten überprüfen muss.

Meine aktuell funktionierende Varianten schaut so aus:

PHP:
<?php 
	if ($page == 'aktuelles.php' || $page == 'aktuelles_a.php' || $page == 'aktuelles_b.php' || $page == 'aktuelles_c.php' || $page == 	'aktuelles_d.php' ){
		echo "class ='active'";
		echo "id='icon_aktuelles'"; 
	}

heißt, die Unterseiten beinhalten immer den Dateinamenteil "aktuelles" gefolgt von einem Unerstrich + Unterseitenbezeichnung (hier a,b,c,d).

Also ich suche so etwas:
PHP:
<?php 
	if ($page enthält 'aktuelles''){ //Sry, LOL
		echo "class ='active'";
		echo "id='icon_aktuelles'"; 
	}
 
Zurück