PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Merkwürdiger Array-Fehler: Zwei Werte werden nicht ausgegeben


Blade II
2009-07-06, 14:16:01
Moin,

Das Script soll den passenden Monat über eine Get-Funktion und Array herausfischen. Das Abstruse ist, dass alle Monate bis auf August und September ausgegeben werden. Entweder bin ich blind oder sonstwas... jedenfalls finde ich den Fehler nicht.

Wo ist er? ;(

<?php

$month_name = array('Januar', 'Februar', 'M&auml;rz', 'April', 'Mai', 'Juni', 'July', 'August', 'September', 'Oktober', 'November', 'Dezember');

switch ($_GET['month']) {
case 'Jan':
$month = 01;
break;
case 'Feb':
$month = 02;
break;
case 'Mar':
$month = 03;
break;
case 'Apr':
$month = 04;
break;
case 'May':
$month = 05;
break;
case 'Jun':
$month = 06;
break;
case 'Jul':
$month = 07;
break;
case 'Aug':
$month = 08;
break;
case 'Sep':
$month = 09;
break;
case 'Oct':
$month = 10;
break;
case 'Nov':
$month = 11;
break;
case 'Dec':
$month = 12;
break;
default:
$month = date('m');
break;
}

echo '<h1 class="month">'.$month_name[($month-1)].'</h1>';

?>

Viele Grüße,
Blade II

Neomi
2009-07-06, 14:44:49
Mit PHP arbeite ich zwar nicht, aber u.a. in C/C++ (und daher sicherlich auch in PHP) und diversen anderen Sprachen sind Zahlen, die mit einer 0 beginnen, im Oktalsystem. Und in dem System sind, anders als im Dezimalsystem, die Ziffern 8 und 9 ungültig. Genau diese beiden funktionieren nicht. Die nachfolgenden sind ohne führende Null wieder im Dezimalsystem. Wenn du die führenden Nullen entfernst, sollte es also funktionieren.

Blade II
2009-07-06, 15:15:21
tatsache :-o
vielen dank!

Tommes
2009-07-06, 15:20:02
Dementsprechend dann auch:

default:
$month = date('n');
break;

rotalever
2009-07-06, 15:23:20
Warum machst du das eigentlich mit Switch-case? Ein Array mit Einträgen wie Nov=>November oder Nov=>11 würde das ganze etwas vereinfachen ;)

esistich
2009-07-06, 15:25:33
Anstelle des Switch/Case Konstrukts hätte ich hier ein assoziatives Array verwendet...


<?php

$month_name = array (

'Jan' => 'Januar',
'Feb' => 'Februar',
'Mar' => 'M&auml;rz',
'Apr' => 'April',
'May' => 'Mai',
'Jun' => 'Juni',
'Jul' => 'July',
'Aug' => 'August',
'Sep' => 'September',
'Oct' => 'Oktober',
'Nov' => 'November',
'Dec' => 'Dezember'

);

echo '<h1 class="month">' . ( ( !isset ( $_GET [ 'month' ], $month_name ) ) ? $month_name [ date ( 'M' ) ] : $month_name [ $_GET [ 'month' ] ] ) . '</h1>' ;

?>

Oder du übergibst anstelle eines alphanumerischen Wert einen numerischen, dann könntest du das Array direkt ansprechen.


Edit -> 2 Late

Tommes
2009-07-06, 15:28:07
( ( !isset ( $_GET [ 'month' ], $month_name ) ) ? $month_name [ date ( 'M' ) ] : $month_name [ $_GET [ 'month' ] ] )

Proggst du immer so? Finde das sehr unübersichtlich. Aber muss natürlich jeder selber wissen ;)

esistich
2009-07-06, 15:33:41
Proggst du immer so? Finde das sehr unübersichtlich. Aber muss natürlich jeder selber wissen ;)

Ja, ist reine Gewohnheit. :D

The_Invisible
2009-07-06, 16:31:46
Proggst du immer so? Finde das sehr unübersichtlich. Aber muss natürlich jeder selber wissen ;)

als C/C++ progger fällt einem sowas gar nicht mehr auf

außerdem wirds ja erst lustig wenn man die "short-ifs" weiter verschachtelt ;D

edit:
allerdings hab ichs eher gerne kompakter wie

echo '<h1 class="month">' . ((!isset($_GET['month'], $month_name)) ? $month_name[date('M')] : $month_name[$_GET['month']]) . '</h1>';


mfg

Blade II
2009-07-06, 17:16:56
whoooar, ihr seid unglaublich! :)
Besten Dank :biggrin:

rotalever
2009-07-06, 18:01:31
Noch was: Warum schreibst du "M&auml;rz" und nicht einfach "März"?

Blade II
2009-07-06, 20:42:51
Eigentlich damit es im Zweifelsfall immer richtig interpretiert wird und vom html-Parser kein Müll rauskommt. -etwa überflüssig?

rotalever
2009-07-06, 20:55:51
Eigentlich damit es im Zweifelsfall immer richtig interpretiert wird und vom html-Parser kein Müll rauskommt. -etwa überflüssig?
Ich würde sowas erst bei der Ausgabe umwandeln. Genauso wie man ja vor der Ausgabe von Variablen die Sonderzeichen usw. mit htmlspecialchars umwandelt.

The_Invisible
2009-07-06, 21:00:25
oder durchgehend utf8 verwenden und sich den "müll" gleich sparen.

mfg

Coda
2009-07-06, 23:10:06
Wollt ich auch gerade anmerken.

rotalever
2009-07-07, 00:52:53
oder durchgehend utf8 verwenden und sich den "müll" gleich sparen.
Jap. Allerding trotzdem htmlspecialchars immer verwenden... Sonst wird man bald Attacken ausgesetzt sein ;)

Blade II
2009-07-07, 23:56:22
Jap. Allerding trotzdem htmlspecialchars immer verwenden... Sonst wird man bald Attacken ausgesetzt sein ;)

deckt das auch solche sachen ab?
DATE_FORMAT(Date, '%b') = '".$_GET['month']."'
D.h.: brauch ich htmlspecialchars bei MySQLi noch?

Eure Tipps werde ich nach Möglichkeit alle mit einfließen lassen. Nochmals vielen vielen Dank :)
Morgen muss ich wohl zwangsweise noch nen Thread eröffnen... ich stoße bei meinem Vorhaben schon an meine Grenzen: ärgerlich.

Viele Grüße,
Blade II

rotalever
2009-07-08, 00:20:17
deckt das auch solche sachen ab?
DATE_FORMAT(Date, '%b') = '".$_GET['month']."'
D.h.: brauch ich htmlspecialchars bei MySQLi noch?

Eure Tipps werde ich nach Möglichkeit alle mit einfließen lassen. Nochmals vielen vielen Dank :)
Morgen muss ich wohl zwangsweise noch nen Thread eröffnen... ich stoße bei meinem Vorhaben schon an meine Grenzen: ärgerlich.

Viele Grüße,
Blade II
Also mit MySQLi und parametresierten / prepared statements wirst du wohl keine SQL-Attacken befürchten müssen, ansonsten müsstest du da auch dieses mysql_real_escape... (oder wie das heißt) nehmen.

Allerdings sind SQL-Attacken natürlich nicht alleine. Wenn du im Code

echo $_GET["bla"];

machst und jemand ruft index.php?bla=<script ...>mach was </script> auf oder ähnliches ist das nicht so gut. Deshalb halt immer alles was man aus Variablen ausgibt, die irgendwie vom Benutzer verändert werden können einmal durch htmlspecialchars jagen.