Variable speichern
Peter
- php
HI!
Ich versuche gerade ein(e) sogenannt(es) Captcha zu basteln.
Die Basics wären soweit funktionsfähig, wäre da nicht ein Logikproblem.
1. Beim Aufruf der Seite erzeuge ich eine Zufallszahl und schreibe diese in einer Variablen in die Session.
2. Diese Zufallszahl schreibe ich auch in ein image, welches ich anzeige.
3. Jetzt soll der user die Zahl aus dem Bild in ein Inputfeld schreiben und das Formular absenden.
So und hier ist nun mein Problem, da das ganze Spiel wieder von vorne beginnt und eine neue Zufallszahl berechnet wird :-(
Kann mir zufällig jemand einen Tipp geben wie man solche Probleme in PHP behandeln kann???
Zum besseren Verständnis ein wenig Code:
<html>
<head></head>
<body>
<form method="POST" name="test" action="<?php echo $PHP_SELF?>">
<img src="image.jpg">
<input type="text" name="testid">
<input type="submit" name="valid" value="Abschicken">
</form>
</body>
</html>
<?PHP
@session_start ();
$vari = strval(rand());
$image = imagecreate(100, 55);
$farbe_body=imagecolorallocate($image,243,243,243);
$farbe_b = imagecolorallocate($image,10,36,106);
imagestring ($image, 5,0, 0, $vari, $farbe_b);
imagejpeg($image,"image.jpg",100);
$_SESSION['vari'] = $vari;
if(isset($_POST['valid']))
{ $temp = $_SESSION['vari'];
if($_POST['testid'] == $temp )
echo " gut" ;
else
{
echo " schlechter";
$vari = strval(rand());
$image = imagecreate(100, 55);
$farbe_body=imagecolorallocate($image,243,243,243);
$farbe_b = imagecolorallocate($image,10,36,106);
imagestring ($image, 5,0, 0, $vari, $farbe_b);
imagejpeg($image,"image.jpg",100);
$_SESSION['vari'] = $vari;
}
}
?>
Danke für evtl. Hilfe
Peter
Beim Aufruf der Seite erzeuge ich eine Zufallszahl und schreibe diese in einer Variablen in die Session.
Diese Zufallszahl schreibe ich auch in ein image, welches ich anzeige.
Jetzt soll der user die Zahl aus dem Bild in ein Inputfeld schreiben und das Formular absenden.
So und hier ist nun mein Problem, da das ganze Spiel wieder von vorne beginnt und eine neue Zufallszahl berechnet wird :-(
Wieso bitte berechnest Du eine neue Zufallszahl, wenn Du a) schon eine gespeichert hast und b) der Benutzer Dir ein Formular mit der Antwort schickt. Das ist ungefähr so schlau wie Milch holen zu fahren und anschließend zu Hause im Kühlschrank zu schauen, ob noch welche da ist (Achtung, Zaunpfahl).
imagestring ($image, 5,0, 0, $vari, $farbe_b);
Nicht, dass ich Dir den Spaß am Basteln nehmen möchte, aber sowas ist für den realen Einsatz wertlos.
Wie bitte kann man soviele Wörter verwenden und dabei nicht mit einem der vielen Wörter eine Antwort auf die Frage geben???
Über Sinn und Unsinn lässt sich bekanntlich streiten :-p
MFG
Peter
echo $begrüßung;
Wie bitte kann man soviele Wörter verwenden und dabei nicht mit einem der vielen Wörter eine Antwort auf die Frage geben???
Es ist im Allgemeinen nicht besonders clever, einer offensichtlich ernst gemeinten Antwort mit einer Kritik zu antworten, wenn man selbst der Fragende ist. Die Chancen auch von weiteren Leuten eine hilfreiche Antwort zu bekommen sinken damit ebenfalls, wenn man befürchten muss, beim Versuch, helfend die Hand auszustrecken, gebissen zu werden.
Über Sinn und Unsinn lässt sich bekanntlich streiten :-p
Man kann auch freundlicher zum Ausdruck bringen, dass man die Antwort nicht verstanden hat.
Denk doch nochmal über deinen bisherigen Script-Ablauf nach. Zu erzeugst bedingungslos eine Zufallszahl, brauchst sie aber eigentlich nur, wenn das Formular das erste Mal aufgerufen wurde. Du brauchst sie nicht noch einmal zu erzeugen, wenn Das Formular ausgefüllt abgesendet wurde, du also auch kein neues Bild erstellen musst.
echo "$verabschiedung $name";
HI @ll!!
Danke für die Hinweise, aber wie es theoretisch funktionieren muss ist mir schon klar, deswegen war mein erster Ansatz auch der nachfolgend aufgeführte, der aber leider auch nicht funktioniert :-(
MFG
Peter
<html>
<head></head>
<body>
<form method="POST" name="test" action="<?php echo $PHP_SELF?>">
<img src="image.jpg">
<input type="text" name="testid">
<input type="submit" name="valid" value="Abschicken">
</form>
</body>
</html>
<?PHP
@session_start ();
if(!isset($_POST['valid']))
{
$vari = strval(rand());
$image = imagecreate(100, 55);
$farbe_body=imagecolorallocate($image,243,243,243);
$farbe_b = imagecolorallocate($image,10,36,106);
imagestring ($image, 5,0, 0, $vari, $farbe_b);
imagejpeg($image,"image.jpg",100);
$_SESSION['vari'] = $vari;
}
if(isset($_POST['valid']))
{ $temp = $_SESSION['vari'];
if($_POST['testid'] == $temp )
echo " gut" ;
else
{
echo " schlechter";
$vari = strval(rand());
$image = imagecreate(100, 55);
$farbe_body=imagecolorallocate($image,243,243,243);
$farbe_b = imagecolorallocate($image,10,36,106);
imagestring ($image, 5,0, 0, $vari, $farbe_b);
imagejpeg($image,"image.jpg",100);
$_SESSION['vari'] = $vari;
}
}
?>
echo $begrüßung;
Danke für die Hinweise, aber wie es theoretisch funktionieren muss ist mir schon klar, deswegen war mein erster Ansatz auch der nachfolgend aufgeführte, der aber leider auch nicht funktioniert :-(
Tut mir leid, aber mit dem angegebenen Code kann ich dein Problem nicht wirklich nachvollziehen. Da es sehr viele Arten von "funktioniert nicht" gibt, wäre es gut, wenn du deine genauer beschreiben könntest. So kann ich nur ein paar allgemeine Anmerkungen geben.
<form method="POST" name="test" action="<?php echo $PHP_SELF?>">
$PHP_SELF ist nur dann eine vorhandene Variable, wenn register_globals eingeschaltet ist. Das ist schon seit langer Zeit nicht mehr die Standardeinstellung und das sollte auch ausgeschaltet bleiben. Zugriffe auf nicht vorhandene Variablen werden dir von PHP angezeigt, wenn du das error_reporting zumindest beim Entwickeln auf E_ALL stellst. Wenn ein Formular an selbst gesendet werden soll, kann das action-Attribut auch leer bleiben (action="").
@session_start ();
Fehler mittels @ auszublenden ist beim Entwickeln ebenfalls nicht immer hilfreich.
imagejpeg($image,"image.jpg",100);
[...]
<img src="image.jpg">
Das funktioniert zwar so in deiner Testumgebung und vermutlich auch in den meisten Fällen in deiner Produktivumgebung, hat aber ein Nebenläufigkeitsproblem. Der Request von User A erzeugt ein Bild. Bevor der A-Browser in der Lage war, das Bild abzufragen kommt ein Request von User B daher und erzeugt ein neues Bild in die selbe Datei. User A kommt nun dazu, die Bildressource abzufragen und bekommt das von B überschriebene Bild ausgeliefert. Dieses Problem lässt sich umgehen, indem du statt des Bildes ein Bild-Script einbindest. Dieses schaut in der Session nach, welche Nummer angezeigt werden soll, erzeugt das Bild und liefert es mit passendem HTTP-Header (Stichwort: Content-Type) aus, ohne es zwischenzuspeichern. Damit spart man sich auch schreibende Zugriffe nebst Schreibzugriffsberechtigung für das öffentliche Verzeichnis.
echo "$verabschiedung $name";
Wieso bitte berechnest Du eine neue Zufallszahl, wenn Du a) schon eine gespeichert hast und b) der Benutzer Dir ein Formular mit der Antwort schickt.
Wie bitte kann man soviele Wörter verwenden und dabei nicht mit einem der vielen Wörter eine Antwort auf die Frage geben???
Da es offenbar schon zuviel von _Dir_ verlangt ist, eine im Grunde einfache Frage betreffs der Hintergedanken, die zu Deinem vorgestellten Code geführt haben, zu beantworten, wird es von Dir vermutlich auch als eine maßlose Unverschämtheit angesehen, Dich dahingehend anzuregen, den Ablauf des besagten Codes und insbesondere die Werte bei jenen if-Abfragen, die augenscheinlich in die falsche Richtung abzweigen, selbst anhand einiger Debugausgaben zu beobachten und daraus eigene Schlüsse zu ziehen, etwa, dass die Generierung des "Passwortes" an dieser Stelle möglicherweise schlecht gewählt ist, weil sie zu einer sogenannten Race Condition zwischen Browser und Skript bzw. Webserver führen könnte, welche allesamt in einer bestimmten Reihenfolge auf eine Resource (das Bild) zugreifen müssen, wobei jedoch diese Reihenfolge im vorliegenden Ablaufplan nicht wirklich synchronisiert wird, was zu einem unglücklichen, weil unerwünschten Ergebnis führen könnte - aber das ist nur eine wage Vermutung und es gibt für den tatsächlichen Einsatz noch weitere Schwierigkeiten, die allesamt in der von Dir gewählten Trennung von Passworterzeugung und Passwortanzeige ihre Ursache haben.
Ich hoffe, mit diesem Satz Dein geistiges Fassungsvermögen abermals gesprengt zu haben und dass auch diesmal der Zaunpfahl, den ich zwecks Anregung geistiger Eigenleistung Deinerseits wieder trickreich versteckt habe, von Dir unentdeckt bleibt.
hi,
So und hier ist nun mein Problem, da das ganze Spiel wieder von vorne beginnt und eine neue Zufallszahl berechnet wird :-(
Kann mir zufällig jemand einen Tipp geben wie man solche Probleme in PHP behandeln kann???
Man unterlässt das erneute Berechnen einer Zufallszahl einfach, wenn man merkt, dass man bereits Daten aus einem abgeschickten Formular erhalten hat ...?
Slave: "Mighty Pharaoh, it hurts when I breathe!"
Pharaoh Bender: "Well then, whaddo you think you should stop doing ...?"
(Futurama: A Pharaoh to Remember)
gruß,
wahsaga