State-machine

Alles, was PHP betrifft, kann hier besprochen werden.

State-machine

Postby spitzerer » 08. April 2009 10:31

Hallo Experten,

ich habe ein merkwürdiges Problem.
Online (d.h. im Web) habe ich sehr viele php-scripts laufen, die in Form einer State-machine funktionieren,

d.h.
print "<form action=\"$_SERVER['PHP_SELF']\" method \"post\">";
print "<input type \"hidden\" name=\"funktionsnummer\" value=\"3\"
....
print "<input type \"submit\" value = \"machwas\"> </form>";


wobei über den Wert von $_POST['funktionsnummer'] viele unterschiedliche "States" im script angesprungen werden.
Wie gesagt, auf "realen" Maschinen im Web funktioniert das hervorragend.

Und nun das Problem:

benutze ich dasselbe Script unter XAMPP (php 5.2.6) dann sind nach einem "submit"
ALLE Variablen gelöscht.

Dieses Verhalten macht absolut keine Sinn. Dummerweise finde ich auch nichts in der Doku, wie man
dieses Verhalten so modifizieren kann, das es dem Verhalten von PHP im Web entspricht.


Wer hat da was hilfreiches für mich ??
Eigentlich wollte ich XAMPP nutzen, um meine PHP-Programme schneller testen zu können, aber dieses Problem kostet mich mittlerweile immens Zeit.


Gruss
Wolfgang

PS: XAMPP ist unter Win-XP pro installiert.
spitzerer
 
Posts: 8
Joined: 25. August 2008 12:25

Re: State-machine

Postby Wiedmann » 08. April 2009 10:46

dann sind nach einem "submit" ALLE Variablen gelöscht.

Wie hast du das überprüft?
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: State-machine

Postby spitzerer » 08. April 2009 10:58

Mein Gott,

hat man Dutzende von Arrays mit Daten aus Mysql befüllt und nach dem "submit" sind alle Arrays LEER, dann braucht man nix mehr zu prüfen.

Vor allem dann nicht, wenn das Ganze im "real Web" sauber funktioniert.

bitte um was sinnvolles und hilfreiches

gruss
Wolfgang
spitzerer
 
Posts: 8
Joined: 25. August 2008 12:25

Re: State-machine

Postby Xardas der Dunkle » 08. April 2009 11:03

Logisch sind alle Variablen nach nem reload der Seite weg.
Dein PHP-Script wird schließlich immer komplett neu aufgerufen und läuft nicht wie ein C-Programm in einer Endlosschleife.
Mich wundert eher, das es auf dem Server funktionieren soll, hasst du die Daten vllt. in einer Session gespeichert!?
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: State-machine

Postby Wiedmann » 08. April 2009 11:06

hat man Dutzende von Arrays mit Daten aus Mysql befüllt und nach dem "submit" sind alle Arrays LEER

Welche Daten aus MySQL, und vor allem... welche Arrays?

In deinem Code von oben gäbe es erstmal genau 2 ~Variablen nach einem Post (oder genauer: 2 Keys im POST-Array). Wie hast du dann diese 2 überprüft ob diese ankommen?

(BTW: Das "$_SERVER['PHP_SELF']" /so/ in einem double quoted string falsch ist, ist dir bekannt?)
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: State-machine

Postby spitzerer » 08. April 2009 11:56

ja, der "schreibfehler" ist mir bekannt - ich wollte ja nur das Schema darstellen, nicht Kackerli`s zählen.


Normalerweise lassen sich die Daten halten - schlussendlich werden die mal unter
if (!isset($funktionsnr)) initialisiert - EIN mal.
denn nach
submit und $funktionsnr = $POST[funktionsnr];

sollte zumindest dieser Wert noch erhalten sein und verhindern, dass nochmal "initialisiert" wird.

(mit register_globals = ON geht das noch viel einfacher)


Gruss
Wolfgang
spitzerer
 
Posts: 8
Joined: 25. August 2008 12:25

Re: State-machine

Postby Xardas der Dunkle » 08. April 2009 12:17

Dir ist, aber schon bewusst das der Benutzer diese Daten auch wieder verändern kann?
Also sensible Daten würde ich nicht ins Formular packen. Bzw. man sollte dieses Verfahren eh nur für mehrseitige Formulare anwenden und nicht, damit man nicht mehrmals Daten aus der DB laden muss ... (Dafür ist die Datenbank schließlich da).

Bei mir ist zwar kein XAMPP drauf, sondern Apache und PHP sind einzeln installiert aber das hier funktioniert problemlos ...:
Code: Select all
<?php
error_reporting
(E_ALL E_STRICT);

$data    = Array();
$data[0] = (isset($_POST['foo']) ? $_POST['foo'] : null);
$data[1] = (isset($_POST['bar']) ? $_POST['bar'] : null);
// [...]
$step    = (isset($_POST['step']) ? $_POST['step'] : 1);

if(
$step == 1) {
    echo 
'  <form action="' $_SERVER['PHP_SELF'] . '" method="post">' "\n" .
         
'    <input type="hidden" name="step" value="2" />' "\n" .
         
'    <input type="text" name="foo" value="' $data[0] . '" />' "\n" .
         
'    <input type="submit" value="Absenden" />' "\n" .
         
'  </form>';
} elseif(
$step == 2) {
    echo 
'  <form action="' $_SERVER['PHP_SELF'] . '" method="post">' "\n" .
         
'    <input type="hidden" name="step" value="3" />' "\n" .
         
'    <input type="hidden" name="foo" value="' $data[0] . '" />' "\n" .
         
'    <input type="text" name="bar" value="' $data[1] . '" />' "\n" .
         
'    <input type="submit" value="Absenden" />' "\n" .
         
'  </form>';
} else {
    echo 
'<pre>'print_r($datatrue), '</pre>';
}
 
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: State-machine

Postby spitzerer » 08. April 2009 13:33

Das Verfahren verwende ich hauptsächlich, um

- nach der Eingabe sauber zu verifizieren und Daten könvertieren
(man versuche mal, 1.223e-2,123 als Ein- oder Ausgabe)

- man kann dem User nach dem Verifizieren ein fast fertig ausgefülltes Formular
zur Korrektur anbieten

und ähnliche Sachen mehr.
Dinge, die so selbstverständlich sind, dass ich mich immer wieder frage, warum das in PHP so saublöd getrickst werden muss.

ABER: im WEB geht das eben uns in XAMPP under Win-XP nicht - WARUM ?????
das ist nach wie vor die Frage - und nach wie vor ungelöst.

Gruss
Wolfgang

PS: so geht das normalerweise auch ...

$step = $_POST['astep'];

if (!isset $step))
{
$data = Array();
}

if($step == 1) {
echo ' <form action="' . $_SERVER['PHP_SELF'] . '" method="post">' . "\n" .
' <input type="hidden" name="astep" value="2" />' . "\n" .
' <input type="submit" value="Absenden" />' . "\n" .
' </form>';
} elseif($step == 2) {
echo ' <form action="' . $_SERVER['PHP_SELF'] . '" method="post">' . "\n" .
' <input type="hidden" name="astep" value="3" />' . "\n" .
' <input type="hidden" name="foo" value="' . $step . '" />' . "\n" .
' <input type="submit" value="Absenden" />' . "\n" .
' </form>';
} else {
echo '<pre>', print_r($data, true), '</pre>';
}
Last edited by spitzerer on 08. April 2009 13:41, edited 1 time in total.
spitzerer
 
Posts: 8
Joined: 25. August 2008 12:25

Re: State-machine

Postby Xardas der Dunkle » 08. April 2009 13:34

Zeig doch einfach mal deinen Code ...
Geht nicht gibts nicht. Du machst eindeutig was falsch.

/edit:
Dinge, die so selbstverständlich sind, dass ich mich immer wieder frage, warum das in PHP so saublöd getrickst werden muss.

Wenn man sauber programmiert, muss man nicht tricksen. Das verstehe ich auch bei CSS nicht. Wenn man sauber programmiert brauch man kaum Browserweichen (höchtens für den IE 6). Trotzdem sieht man immer wieder CSS-Files die fast nur aus Browserweichen bestehen. ...

/edit2:
PS: so geht das normalerweise auch ...

Schwachsin. Wie ich oben bereits geschrieben habe, kann das gar nicht funktionieren ...
Xardas der Dunkle wrote:Dein PHP-Script wird schließlich immer komplett neu aufgerufen und läuft nicht wie ein C-Programm in einer Endlosschleife.

Der PHP-Prozess wird komplett beendet. Das heißt, alle Daten werden aus dem Speicher gelöscht.
Und das hat nix mit PHP zutun, sondern mit dem Konzept des Internets.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: State-machine

Postby Wiedmann » 08. April 2009 13:46

Zeig doch einfach mal deinen Code ...

Gescheiter wäre vielleicht ein simples Testscript, mit dem sich das Verhalten reproduzieren lässt.
(Und natürlich 1:1 so, wie er es einsetzt, damit wir nicht rätseln müssen: Ist das jetzt nur ein "Schreibfehler", oder macht er es doch falsch.)
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Re: State-machine

Postby Xardas der Dunkle » 08. April 2009 13:53

@Wiedmann
Ist ja alles schon geschehen. Und was er da treibt ist eindeutig falsch. Bzw. sind schon wieder mehrere Fehler drin.

Wie soll DAS bitte funktionieren?
Code: Select all
<?php
$step 
= $_POST['astep']; 

if 
(!isset $step))
{
$data    = Array();
}

if(
$step == 1) {
    echo '  <form action="' . $_SERVER['PHP_SELF'] . '" method="post">' . "\n" .
         '    <input type="hidden" name="astep" value="2" />' . "\n" .
         '    <input type="submit" value="Absenden" />' . "\n" .
         '  </form>';
}
 elseif($step == 2) {
    echo '  <form action="' . $_SERVER['PHP_SELF'] . '" method="post">' . "\n" .
         '    <input type="hidden" name="astep" value="3" />' . "\n" .
         '    <input type="hidden" name="foo" value="' . $step . '" />' . "\n" .
         '    <input type="submit" value="Absenden" />' . "\n" .
         '  </form>';
}
 else {
    echo '<pre>', print_r($data, true), '</pre>';
}
 


Allein schon passen die Variablen nun absolut nicht mehr ...
Und was das Step jetzt da soll: ' <input type="hidden" name="foo" value="' . $step . '" />' . "\n" . wird mir auch nicht klar :roll:
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: State-machine

Postby spitzerer » 08. April 2009 14:49

@Xardas der Dunkle


da hat Du schon recht - es sei denn, das Gante ist ein FRAMESET und das ganze funzt in einem Frame ...
Dann geht das nämlich korrekt.


möchte echt mal wissen, wie Du mehrmals aus einem Formular Daten übernehmen willst ....

Schon mal sowas programmiert ??
Ich hab da mehr als 100 solche Dinger online -problemlos, funktioniert.

WIE OFT DENN NOCH :

MEINE CODES LAUFEN ALLE ONLINE IM WEB.

Das Zeugs funktioniert NICHT unter XAMPP / Win-XP

WO IST DER UNTERSCHIED ???????????????

Dazu braucht mir keiner meinen Codes zerpflücken. Was läuft, läuft.
Und jeder hat einen anderen Programmierstil.
(auch mit PHP5.x.x, nicht nur mit PHP4 und register_globals on)

sieht eher so aus, als muss ich dieses XAMPP in die Tonne treten.

Gruss
Wolfgang
spitzerer
 
Posts: 8
Joined: 25. August 2008 12:25

Re: State-machine

Postby Xardas der Dunkle » 08. April 2009 16:18

da hat Du schon recht - es sei denn, das Gante ist ein FRAMESET und das ganze funzt in einem Frame ...
Dann geht das nämlich korrekt.

Schwachsin. Auch bei einem Frameset wird jedes mal ne neue PHP-Instanz geladen :roll:.

möchte echt mal wissen, wie Du mehrmals aus einem Formular Daten übernehmen willst ....

Wie wers wenn du den Code mal ausprobieren würdest?

WO IST DER UNTERSCHIED ???????????????

Vermutlich laden die Daten durch das register_scheiße = on in der Session.

sieht eher so aus, als muss ich dieses XAMPP in die Tonne treten.

Du solltest eher diesen abgrund tief grausamen Programmierstiel in die Tonne tretten.
Das was du da machst ist absolut unlogisch und funktioniert höchst wahrscheinlich nur auf Grund eines Bugs.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: State-machine

Postby spitzerer » 14. April 2009 12:08

Gott seis gelobt und gedankt, dass es englisch-sprachige Foren gibt, welche nicht von selbsternannten Superschlauen dominiert werden.


Also - Die Lösung des Ganzen:

- es funktioniert unter jedem Unix-basierenden System.
- es funktioniert unter XAMPP für LINUX

- es funktioniert NICHT unter XAMPP für Windoof

- es wurde nicht auf dem MAC/Apple probiert.


So, und jetzt sucht mal schön die Lösung des Problems - bei Euerem oder meinem Programmierstil, natürlich ......
Auf jeden Fall kenne ich ein Forum mehr, welches es zu meiden gilt.

Gruss
Wolfgang
spitzerer
 
Posts: 8
Joined: 25. August 2008 12:25

Re: State-machine

Postby Xardas der Dunkle » 14. April 2009 12:36

XAMPP ist immer noch eine Sammlung von Paketen und hat daher herzlich wenig damit zu tun :roll:.

Mag sein das es funktioniert. Dein komischer Programmierstiel setzt darauf das die Daten im Speicher erhalten bleiben ... und das PHP durchweg im selben Speicherbereich läuft. Würde PHP nun als CGI ausgeführt werden, dürfte das ganze nicht mehr funktionieren.
Desweiteren hast du schon einmal über Sicherheit nach gedacht?
Greift nun eine Zweite Person auch auf dein Script zu könnte es passieren, das die andere Person plötzlich die Daten des anderen hat, weil seine überschrieben wurden.

Btw. änder mal das error_reporting auf E_ALL ..., mal sehen wie dann der Hase läuft :D. Das gehört nämlich auch zur Zukunft von PHP ...

Ich wünsche die viel Spaß mit einer Sicherheitslücke und vor allem in deinem Englisch sprachigen Forum!

/edit:
Btw. ... auf meinen Linux-Server funzt es nicht. Bei mir rennt PHP 5.2.9 als FastCGI ... (Das Script habe ich eben hingetippt, darum auch diese grausame Schreibweise :p)
Code: Select all
<?php
if(!isset($data)) {
    $data = Array();
}

$step = (isset($_POST['step']) ? intval($_POST['step']) : 0);
if(isset($_POST['foo'])) {
    $data['foo'] = $_POST['foo'];
}
if(isset($_POST['bar'])) {
    $data['bar'] = $_POST['bar'];
}
if(isset($_POST['baz'])) {
    $data['baz'] = $_POST['baz'];
}
?>
<pre><?php print_r($data) ?></pre>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
    <input type="hidden" name="step" value="<?php echo $step + 1 ?>" />
<?php
    if($step == 1):
?>
    <input type="text" name="foo" />
<?php
    elseif($step == 2):
?>
    <input type="text" name="bar" />
<?php
    else:
?>
    <input type="text" name="baz" />
<?php
    endif;
?>
    <input type="submit" />
</form>
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Next

Return to PHP

Who is online

Users browsing this forum: No registered users and 2 guests