PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : foreach() verhält sich unterschiedlich auf zwei Servern



Andislack
26-05-2005, 09:53
Hi,

ich habe ein kleines Problem mit meinem PHP auf zwei Servern:

Ein produktiv Server:
Slackware 8.1, Kernel 2.4.26, Apache 1.3.33, PHP 4.3.11

Ein Entwicklungsserver:
Slackware 8.1, Kernel 2.4.21, Apache 1.3.27, PHP 4.3.11

Seit dem letzten Upgrade von PHP 4.2.3 auf 4.3.11 tritt auf dem produktiv Server folgendes Problem auf:
Eine foreach() Schleife kann nicht mehr wie folgt verwendet werden:

foreach( $array as $value )
{
echo $value;
}
Hier kommt dann immer als Ausgabe das Wort "Array" und nicht wie erwartet der Inhalt der Variable $value.
Ich muss die Schleife so schreiben:

foreach( $array as $key => $value )
{
echo $value;
}
dann gibt er mir alles korrekt und ohne meckern aus.
Das komische daran ist, dass das alles nur auf dem produktiv System ist. Auf meinem Entwicklungsserver, der bis auf die Versionen der verwendeten Software wie oben beschrieben, absolut identisch konfiguriert ist.
Hatte erst an eine Änderung in der PHP Version gedacht, doch auf meinem Entwicklersystem funktioniert die foreach Schleife ja wunderbar, egal wie ich sie verwende.

Es ist mir nur das Problem mit der foreach() Schleife aufgefallen, momentan noch nichts anderes.
Hab echt keine Ahnung wo ich zu suchen ansetzen soll.
Hat da jemand ne Idee woran das liegen könnte?

Vielen Dank für Eure Hilfe.
Gruss Andi

undefined
26-05-2005, 11:56
das hat weniger mit der Schleife sondern viel mehr mit dem was ankommt zu tun ;)
Ein var_dump wirkt wunder ;)


echo "<pre>";
var_dump( $array );
echo "</pre>";

Andislack
26-05-2005, 12:36
Hi undefined,

das ankommende Array hab ich natürlich als erstes überprüft.
Die Daten sind alle korrekt enthalten. Auf dem Produktivsystem und auf dem Entwicklersystem sind völlig identisch.
Ein var_dump liefert auch keine anderen Ergebnisse.


array(2) { [0]=> string(0) "" [1]=> string(2) "22" } => Entwicklersystem

array(2) { [0]=> string(0) "" [1]=> string(3) "283" } => Produktivsystem
Die enthaltenen Zahlen sind schon korrekt so wie sie drin stehen, das ist nicht das Problem.
Wenn ich das Array vor der foreach() anspreche mit z.B. echo $array[1] sind die Daten auch vorhanden. Nur foreach() will sie nicht...

Wäre ja schön, wenn es so eine Lapalie wäre...aber es tritt ja auch bei jedem Mal auf, wo die foreach() Schleife "falsch" verwendet wird.
Es liegt definitiv nicht an den ankommenden Daten.

Es hat vor dem Upgrade der PHP-Version von 4.2.3 auf 4.3.11 funktioniert auf dem Produktivsystem. Hab auch mal ein Downgrade wieder auf 4.2.3 probiert, aber es geht nicht mehr...
PHP.ini seitdem nicht angefasst. Server auch nicht umgebaut oder sowas...

Gruss Andi

elrond
26-05-2005, 14:47
vergleich mal die php.ini auf den beiden Systemen

Andislack
26-05-2005, 15:27
Wie oben schon geschrieben habe ich die PHP.ini nicht angefasst.
Habe aber trotzdem nochmal geschaut. Auf der Entwicklungsumgebung sind nur zwei zusätzliche Einträge die mit Interbase und Ming zu tun haben vorhanden und die Eintragungen vom Zend Debug-Server. Alle anderen Einstellungen sind komplett identisch.
Welche Einstellugen könnten denn in der php.ini für die Verwendung von Arrays wichtig sein? Ich hab da jetzt keinen Eintrag gesehen, der sich in die Richtung orientiert.

Gruss Andi

elrond
26-05-2005, 15:35
war nur so 'ne idee, wenn die selbe php-version auf zwei unterschiedlichen servern unterschiedliche ergebnisse liefert...

Andislack
27-05-2005, 01:58
Es geht wieder.
Auf beiden Systemen ist der Zend Optimizer installiert. Auf dem Entwicklersystem in der Version 2.5.8 und auf dem Produktivsystem 2.1.0. Das war wohl zu alt...Hab upgedatet auf die aktuelle Version 2.5.10 und nu geht foreach() wieder ganz normal :)

Danke für Eure Hilfe.
Gruss Andi

undefined
27-05-2005, 07:48
Wunderbar du hast ein Mehrdimensionale Array und auf dem "produktiv Server" wird die Schleife richtig behandelt! Damit du jetzt weiterhin falsch Programieren kannst updatest du den Send Optimizer den es für die Zukunft nicht mehr geben wird. Damit steht jetzt schon fest das dein Script keine Lange Laufzeit haben wird ;)


...Hab upgedatet auf die aktuelle Version 2.5.10 und nu geht foreach() wieder ganz normal

1) Definitiv ist die Darstellung von deinem "produktiv Server" richtig gewesen.
2) Dein Entwicklungsserver behandelt die Schleife falsch, könnte ein Bug sein ;)
3) Du solltest dir mal die Funktionsweise einer foreach Schleife in der Manual genauer ansehen!
mfg undefined

Andislack
27-05-2005, 10:57
Wunderbar du hast ein Mehrdimensionale Array
Wo verwende ich Deiner Meinung nach ein mehrdimensionales Array?


auf dem "produktiv Server" wird die Schleife richtig behandelt!
Wenn ich das vermeindliche "Array", welches mir auf dem Produktivsystem ausgegeben wird, als Array anspreche, meckert er, dass es kein Array ist.


Damit du jetzt weiterhin falsch Programieren kannst
http://de2.php.net/manual/de/control-structures.foreach.php
Es gibt zwei Syntaxformen; die zweite ist eine unbedeutende, aber sinnvolle Erweiterung der ersten Syntax:


foreach (array_expression as $value) Anweisung
foreach (array_expression as $key => $value) Anweisung


Damit steht jetzt schon fest das dein Script keine Lange Laufzeit haben wird
Ich wüsste nicht, warum meine Skripte nicht lange lauffähig sein sollten, wenn ich mich an die korrekte Syntax von PHP halte!?

Ob der Zend Optimizer installiert ist oder nicht, sollte im Normalefall keinen Funktionsunterschied in PHP machen. Meine Skripte laufen auch auf jedem System, wo der Zend Optimizer NICHT installiert ist. Woher Du allerdings weisst, dass es den Zend Optimizer in Zukunft nicht mehr geben wird, würde mich schon interessieren. Das der Zend Optimizer in dieser Version auf meinem System Probleme mit der genannten PHP-Version hat ist natürlich nicht normal.
Das Problem ist auch bekannt wie ich gerade gesehen habe:
http://www.zend.com/phorum/read.php?num=5&id=3357&loc=0&thread=3357


1) Definitiv ist die Darstellung von deinem "produktiv Server" richtig gewesen.
2) Dein Entwicklungsserver behandelt die Schleife falsch, könnte ein Bug sein
Na das musst Du mir mal genauer erklären, wie Du auf diesen Hund gekommen bist. Sind ja im Moment nur nichtssagende Behauptungen von Dir.


Du solltest dir mal die Funktionsweise einer foreach Schleife in der Manual genauer ansehen!
Irgendwie habe ich das Gefühl, dass Du Dir entweder die Problemstellung nicht richtig durchgelesen hast oder Dir ebenfalls ein paar Kapitel Manual fehlen.
Das was Du hier schreibst, hat ja weder Hand noch Fuß!

Naja trotzdem einen schönen Tag.
Gruss Andi

undefined
27-05-2005, 12:28
Sorry - ich habe dein Posting mit dem Code Arrays nicht richtig gelesen :(
Daher habe ich wohl etwas stark daneben gegriffen!
Man sollte doch wohl etwas genauer Lesen.
Nochmal Sorry ;)

Andislack
27-05-2005, 12:42
Kein Problem :)

Schönen Tag noch.
Gruss Andi

BlueJay
28-05-2005, 06:37
[0]=> string(0) ""
[1]=> string(2) "22"



Vermute mal sehr stark, dass so die Arrays aussehen, die bei foreach ins $value gestopft werden.
Is für mich 'ne Warnung, mich ganz weit weg von dieser wackeligen Syntax ohne $key zu halten, ob sie bei Zend/im Handbuch steht oder nicht.

(It's not a bug, it's a feature?)

so long,
BlueJay

Andislack
28-05-2005, 21:47
Hi BlueJay,

wieso meinst Du "wackelige Syntax" ?
So wie es im Handbuch auf php.net steht, ist ja eher die Variante MIT $key das Feature, wenn man das so sehen will.
http://de2.php.net/manual/de/contro...res.foreach.php
Es gibt zwei Syntaxformen; die zweite ist eine unbedeutende, aber sinnvolle Erweiterung der ersten Syntax:

foreach (array_expression as $value) Anweisung
foreach (array_expression as $key => $value) Anweisung

Also da beides ohne Einschränkung im Manual steht, ist die Form der Verwendung doch egal. Komisch ist nur, dass der ZendOptimizer das verhaun hat und dass das Problem irgendwie kaum bekannt zu sein scheint. Denke ich bin nicht der einzigste, der den ZendOptimizer einsetzt und mit diesem Problem konfrontiert war/ist.

Gruss Andi