Fehlermeldung bei Array

Hallo PHP Experten!

Bei folgendem Code, den ich nach Anleitung eines PHP-Buches fabriziert habe, bringt mir der Browser folgende Fehlermeldung: Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ‚)‘ in /var/www/web573/html/php/menue.inc on line 5 Ich habe Zeile 5 fett markiert.
Mein Verdacht ist, dass er die schließenden Klammern in der gleichen Zeile haben möchte, wie den anderen Code. Liege ich da richtig?

<?php $menue = array (<br /> array (
 "Punkt" =\> "HOME"
**"URL" =\> "start.html"**
 ),
 array (
 "Punkt" =\> "SPIELANLEITUNG"
 "URL =\> "texte/regeln.html"
 ),
 array (
 "Punkt" =\> "REGELN"
 "URL" =\> "texte/turnierregeln.html"
 ),
 array (
 "Punkt" =\> "TURNIERZEITEN"
 "URL" =\> "texte/zeiten.html"
 ),
 array (
 "Punkt" =\> "TURNIERGEWINNER"
 "URL" =\> "texte/turniergewinner.php"
 ),
 array (
 "Punkt" =\> "RANGLISTE"
 "URL" =\> "texte/rangliste.php"
 ),
 array (
 "Punkt" =\> "SPIELER"
 "URL" =\> "texte/spieler.html"
 )
 array (
 "Punkt" =\> "KONTAKT"
 "URL" =\> "texte/kontakt.html"
 ),
 array (
 "Punkt" =\> "TLs"
 "URL" =\> "intern/login.html"
 ),
 )

 echo "

";
$Max = count($menue)-1;
for ($i = 0; $i ";
echo „“;
echo „$punkt“;
echo „“
} else {
echo „“;
echo „“;
echo „$punkt“;
echo „“
}
echo „“;
?>

Solltet ihr noch andere Fehler im Code finden, sagt mir die auch, ich bin kompletter Anfänger, was PHP angeht, ich hab nur mal dieses Buch durchgemacht und probiere das jetzt zum ersten mal für eine Website aus. Ziel ist es, ein Menüsystem zu bauen, das den aktiven Link nicht klickbar macht, die anderen hingegen schon.

Vielen Dank für die Hilfe und Gruß
Alex

Hallo,

du hast überall das abschließende Komma vergessen. array(„blubb“, „blarg“); Also hier konkret erstmal das Komma nach „HOME“, aber es fehlt auch bei den anderen Einträgen.

Darüber hinaus solltest du, wenn du einen assoziativen Key verwendest, Anführungszeichen benutzen. Also wird
$URL = $menue[$i][URL];
zu
$URL = $menue[$i][‚URL‘];

Bei echo „$punkt“; benötigst du die Anführungszeichen dagegen nicht, hier reicht echo $punkt;

Viele Grüße

Hallo!

Danke dir für die schnelle und kompetente Hilfe! Ich hab den Code mit dem Parser nochmal überflogen und noch einige Fehler selber rausgefunden und verbessert. Beim (hoffentlich) letzten Fehler steh ich aber komplett auf dem Schlauch:

Parse error: syntax error, unexpected $end in /var/www/web573/html/php/menue.inc on line 59

Und hier die in Frage kommenden Zeilen des Codes:

echo „“;
?>

Gruß Alex

Hallo!

Parse error: syntax error, unexpected $end in
/var/www/web573/html/php/menue.inc on line 59

echo „“;

Hast Du überall die abschließenden Semikola gesetzt?

Grüße

CMБ

Hallo!

Hast Du überall die abschließenden Semikola gesetzt?

Ja, das hab ich mit dem Parser kontrolliert, er zeigt mir nur noch in dieser einen Zeile den Fehler an. Hätte ich diese Semikola nicht gesetzt, würde er doch die auch anzeigen. Ich kann dir aber gerne den Code schicken.

Gruß Alex

Hallo!

kann dir aber gerne den Code schicken.

Poste ihn doch hier (wie im Eingangsposting),
und zwar am besten in pre> … /pre>-Tags.

Grüße

CMБ

Hi Semjon!

Die Zeile, bei der der Parser meckert hab ich fett markiert, aber es könnte durchaus sein, dass sonst noch irgendwo ein Fehler drin ist.

<?php $menue = array (<br /> array (
 "Punkt" =\> "HOME",
 "URL" =\> "start.html",
 ),
 array (
 "Punkt" =\> "SPIELANLEITUNG",
 "URL" =\> "texte/regeln.html",
 ),
 array (
 "Punkt" =\> "REGELN",
 "URL" =\> "texte/turnierregeln.html",
 ),
 array (
 "Punkt" =\> "TURNIERZEITEN",
 "URL" =\> "texte/zeiten.html",
 ),
 array (
 "Punkt" =\> "TURNIERGEWINNER",
 "URL" =\> "texte/turniergewinner.php",
 ),
 array (
 "Punkt" =\> "RANGLISTE",
 "URL" =\> "texte/rangliste.php",
 ),
 array (
 "Punkt" =\> "SPIELER",
 "URL" =\> "texte/spieler.html",
 ),
 array (
 "Punkt" =\> "KONTAKT",
 "URL" =\> "texte/kontakt.html",
 ),
 array (
 "Punkt" =\> "TLs",
 "URL" =\> "intern/login.html",
 ));

 echo "

";
$Max = count($menue)-1;
for ($i = 0; $i „;
echo „“;
echo „$punkt“;
echo „“;
} else {
echo „“;
echo „“;
echo „$punkt“;
echo „“;
};
echo "“;
?>

Gruß Alex

Hallo

Die Zeile, bei der der Parser meckert hab ich fett markiert,
aber es könnte durchaus sein, dass sonst noch irgendwo ein
Fehler drin ist.

<?php : ...
for ($i = 0; $i \<= $Max; $i++) { ... ?\>

Alles klar :wink:
Aber ich würde das Programm ein wenig kürzer fassen, z.B. so:

<?php $menutext = '<br /> HOME start.html
 SPIELANLEITUNG texte/regeln.html
 REGELN texte/turnierregeln.html
 TURNIERZEITEN texte/zeiten.html
 TURNIERGEWINNER texte/turniergewinner.php
 RANGLISTE texte/rangliste.php
 SPIELER texte/spieler.html
 KONTAKT texte/kontakt.html
 TLs intern/login.html
';

echo '

‚;
preg_match_all(‘/(\S+)\s+(\S+)[\r\n]+/’, $menutext, $menu, PREG_SET_ORDER);
$datei = basename($PHP_SELF);
foreach($menu AS $item) {
list($punkt, $URL) = array($item[1], $item[2]);
$tpl = ‚%s‘."\n";
$lnk = ’ href="%s">%s’;
if($datei == $URL) {
printf($tpl, ‚aktiv‘, $punkt);
}
else {
$link = sprintf($lnk, $URL, $punkt);
printf($tpl, ‚normal‘, $link);
}
}
echo ‚‘;
?>

Grüße

CMБ

Der Fehler liegt einfach daran, dass die schließende Klammer um das FOR fehlt. Am einfachsten sieht man soetwas, wenn man bei jede Klammer eine Ebene weiter einrückt, zu empfehlen ist eine Mindesteinrückung von 2 Leerzeichen oder mehr (man kann aber auch mit Tabs arbeiten):

if ($test === TRUE)
{
 for ($i = 0; $i 

Wenn dann irgendwo eine schließende Klammer fehlt kann man den Fehler ziemlich schnell finden.

Btw: Nach abgeschlossenen IF-Bedingungen usw. benötigst du nicht zwangsläufig ein Semikolon.

Moin moin!

Parse error: syntax error, unexpected $end in
/var/www/web573/html/php/menue.inc on line 59

Zunächst mal zur Fehlermeldung: Der Fehler liegt entweder direkt in dieser Zeile oder aber - wie in deinem Fall - unmittelbar davor. Hier wird halt wie bereits beschrieben das Ende der FOR-Schleife erwartet, jedoch nicht gefunden.

Aber weshalb ich hier nochmal zitiere ist ein anderer Grund:

/var/www/web573/html/php/menue.inc on line 59

Du scheinst - und das meine ich nicht böse - noch sehr neu im Umgang mit PHP zu sein. Entsprechend rate ich dir hier davon ab, PHP-Dokumente mit der Endung .inc zu verwenden und alle Scripte auf .php enden zu lassen. Du kannst gerne .inc.php nehmen, aber einfach nur .inc könnte große Sicherheitslücken in deiner Software leichter erkennbar machen. Grund hierfür:
Standardmäßig wird auf dem Webserver anhand der Dateiendung die aufzurufende Datei durch einen Parser gejagt - hier: PHP. Wenn also eine Datei zum Beispiel index.php aufgerufen wird, erkennt der Browser die Endung .php und weiß dann, dass diese Datei vor der Ausgabe durch den PHP-Parser muss. Dieser interpretiert dann die PHP-Befehle und gibt nurnoch das als Text zurück, was entweder außerhalb von PHP-Klammern (<?php und ?>) steht oder mittels Ausgabeanweisungen (echo, print, usw.) ausgegeben wurde. Das sind dann die Daten, die der Webserver an den Browser schickt - der PHP-Code ist dann bereits „verschwunden“.
Wenn du nun eine Datei in der index.php einbindest (z.B. mit include()), ist PHP die Dateiendung egal, es interpretiert einfach das, was in der Datei steht. Aber: Sollte mal - aufgrund welchen Umstandes auch immer - ein Fehler in deinen Scripten auftreten (wie z.B. hier gerade), bekommt jeder auf deiner Seite die Fehlermeldung angezeigt, so denn der Webserver dies durch seine Konfiguration nicht verhindert - und standardmäßig werden solche Informationen eben oft angezeigt. Jeder, der diese Fehlermeldung sehen kann könnte nun die Datei menue.inc direkt in den Webbrowser eingeben und würde dann den PHP-Code der Datei angezeigt bekommen, weil der Webserver die Datei nicht durch den PHP-Parser haut, da die Dateiendung nicht erkannt wurde.

Warum ist das nun so ein Problem? Stell dir mal vor, du hast Zugangsdaten zum Datenbank-Server in der Datei config.inc hinterlegt. Zusätzlich dazu baust du in dieser Datei die Datenbank-Verbindung auf, damit du das nicht in jedem Script wieder tun musst. Wenn nun z.B. die Verbindung zur Datenbank nicht funktioniert, weil der Server überlastet ist oder was auch immer, folgt eine Fehlermeldung, in der die Datei config.inc angezeigt wird (nämlich in der Zeile, in der du die Verbindung aufbauen willst). Ruft jetzt einer die Datei config.inc direkt mit dem Browser ab, erhält er alle Informationen, die sonst durch PHP „versteckt“ sind im Klartext. Bei diesem Beispiel also auch Benutzername und Kennwort zur Datenbank. Wenn dein Datenbank-Server dann eine Verbindung zu dem angegebenen Benutzer von „außen“ zulässt und hierfür das gleiche Kennwort verwendet, dann kann derjenige direkt auf deine Datenbank zugreifen.

Ich erzähle das hier nicht, weil ich Spaß am Schreiben habe, sondern weil ein Bekannter von mir mit seiner damals stark frequentierten Single-Community eben genau dieses Problem hatte und dadurch Leute auf die Datenbank zugreifen konnten, in denen dann die Kennwörter alle angemeldeten Benutzer im Klartext zu sehen waren.

Bitte nimm dies also als gut gemeinten Ratschlag!

Im Übrigen kann man sicher auch auf die Faulheit mancher Webmaster setzen, die für den FTP-Zugang dann auch noch das gleiche Kennwort verwenden - oder für ihren E-Mail-Account oder was auch immer.

Aber eines noch ergänzend dazu: Man könnte den Server auch auf andere Weise absichern, indem man den Zugriff auf Dateien mit der Endung .inc generell verwehrt oder diese auch durch den Parser schicken lässt oder oder oder. Es gibt viele Wege nach Rom, aber als Anfänger sollte man lieber die einfachste Variante nutzen und die Dateiendung immer mit .php aufhören lassen.

MfG
Lutz

1 Like

Hallo Lutz!

Ja, du hast recht, ich bin kompletter Neuling. Ich weiß zwar ungefähr, was die PHP-Datei macht, wenn ich eine vor mir habe, aber selber hab ich noch keine programmiert bisher. Deshalb danke ich dir für deine Informationen und Tipps, ich bin sehr froh drüber.

Groß Alex

Hallo Semjon!

Dein Skript funktioniert tadellos, danke für deine Mühe.

Gruß Alex

Hallo

Dein Skript funktioniert tadellos, danke für deine Mühe.

Ich muß gestehen, daß das keine Mühe ist, sondern
eine Art „Pausenerholung“ :wink:

Wie Mr. NiceGuy gesagt hat solltest Du unbedingt
ein paar Lerneinheiten PHP einschieben, ehe Du an
„echten Systemen“ arbeitest. Es gibt ja eine
ganze Reihe brauchbarer Bücher, als Beispiel
sei eines genannt:
http://www.amazon.de/PHP-5-3-MySQL-5-1-Programmierun…

Zu meiner Quelltextvariante: Der reguläre Ausdruck
unter dem Menütext ist nicht robust, d.h. er würde
nicht funktionieren, wenn Du Menüpunkte mit
„Leer zei chen“ hast.

Diesen Menütext würde man ausserdem besser in
einer Datei vorhalten, die man unabhängig vom
PHP-File editiert (menue.txt oder so) und
dann im Programm mit z.B.

$mtext = file\_get\_contents('menue.txt')

einliest.

Ansonsten glaube ich, daß Du in einem halben Jahr -
bei regelmäßiger Beschäftigung - schon ganz gut
mit PHP zurechtkommen wirst.

Weiterhin empfiehlt es sich, bei der Gestaltung
der Tabellen auf „CSS“ zurückzugreifen, d.h. die
Tabelle bekommt eine Klasse z.B. class="myTable"
zugewiesen - und in einer „projektweiten“ .css-Datei
steht dann z.B.:
[winter.css]

 ...

 table.myTable {
 margin-left:0.5em;
 margin-right:0.5em;
 border-collapse:collapse;
 width:95%;
 }
 ...

wodurch die Tabelle formatiert werden kann.

Hier eine „robustere Version“ vom Programm:

[menue.txt]

HOME | start.html
SPIELANLEITUNG | texte/regeln.html
REGELN | texte/turnierregeln.html
TURNIERZEITEN | texte/zeiten.html
TURNIERGEWINNER | texte/turniergewinner.php
RANGLISTE | texte/rangliste.php
SPIELER | texte/spieler.html
KONTAKT | texte/kontakt.html
TLs | intern/login.html

[menue.php]

<?php $datei = basename($PHP_SELF);<br />$mtext = file\_get\_contents('menue.txt');

$muster\_robust = '/(\w[^\|]\*)\b[\s\|]+([^\r\n]+)\b/';
preg\_match\_all($muster\_robust, $mtext, $menu, PREG\_SET\_ORDER);

print '

';
foreach($menu AS $item) {
list($punkt, $URL) = array_slice($item, 1);
$html = ‚%s‘;
$link = ‚href="%s">%s‘;
if($datei == $URL) {
printf($html, ‚aktiv‘, $punkt);
}
else {
$href = sprintf($link, $URL, $punkt);
printf($html, ‚normal‘, $href);
}
}
print ‚‘;
?>

Grüße

CMБ