js function lässt sich nur einmal ausführen. Hilfe!

benjaminbih

Mitglied
Hallo Leute,

ich hab hier mal eine Javascript Funktion die ein CaptchaImage regenerieren soll.

PHP:
<script type="text/javascript">
<!--
function regenerateCaptcha()
{
	if (document.images)
		document.images.captcha_hash.src = 'image.php?imagehash=<?php echo regenerate_image_code(); ?>';

}
-->
</script>

das CaptchaImage wird beim Seitenaufbau bereits generiert:
PHP:
<td><?="<img id=\"captcha_hash\" border=0 src=\"$BASEURL/image.php?imagehash=$imagehash\" border=\"0\">"?></td>

und mit dieser Link soll es regeneriert und angezeigt werden:
PHP:
<a href="javascript:void(0)" onclick="regenerateCaptcha(); return false;">Regenerate image</a>

Funktioniert auch soweit ohne Fehlermeldung, jedoch wird/kann die regenerierung nur einmal ausgeführt werden.
Und ich weis nicht wieso, da auch keine Fehler ausgegeben werden.
Ich bitte um hilfe.
 
Moin Benjamin,

der Hash wird ja mit PHP erzeugt.
Dieser ändert sich also nicht mehr bei erneutem Funktionsaufruf...es gibt somit nichts zum Neu laden, weil die src gleich bleibt.

Lösung:
Erzeuge (zusätzlich) einen Zufallswert mit JS, bspw. über einen Timestamp:

Code:
<script type="text/javascript">
<!--
function regenerateCaptcha()
{
    if (document.images)
        document.images.captcha_hash.src 
          = 'image.php?imagehash=<?php echo regenerate_image_code(); ?>&'+new Date().getTime();

}
-->
</script>
 
Vielen Dank Sven,

ich habe es mal abgeändert und kann jetzt das Image durch die JS Funktion des öfteren neu laden.
Aber der String bleibt nach dem ersten regenerieren immer der gleiche somit auch die Buchstabenkombination im Bild. Nur das aussehen verändert sich.
Also z.B. beim Setienaufbau string: AbcDeH
und beim ersten und jedem weiteren aufruf der JS Funktion: GuJKlm

Die php funktion zum regenerieren sieht so aus:
PHP:
function regenerate_image_code(){
			$randomstr = random_str();
			$imagehash = md5($randomstr);
			$dateline = time();		
			$sql = 'INSERT INTO `captcha_images` (`imagehash`, `imagestring`, `dateline`) VALUES (\''.$imagehash.'\', \''.$randomstr.'\', \''.$dateline.'\');';
			mysql_query($sql) or die(mysql_error());
			return $imagehash;
}

Was muß ich noch ändern?
 
OK, wenn der String im Bild so erzeugt wird, ändert er sich natürlich nicht.

Ich bevorzuge da eine Session-basierte Lösung.

Das Skript, welches das Bild selbst erzeugt, generiert einen Zufallsstring, welchen du als Session-Variable speicherst.
Beim Prüfen musst du dann nur nachschauen, ob jener String existiert.

Da es multitaskingfähige User geben soll :)(welche möglicherweise mehrere Formulare simultan nutzen) empfiehlt sich noch folgendes:
Erzeuge für jedes Formular, wo du Captchas benötigst, ein verstecktes Input mit einem Zufallshash.

Diesen Hash (und die Session-ID) übermittelst du per GET an das Skript, welches das Captcha ausgibt.


sinngemässer Aufbau der Session-Variable, um den Zufallsstring zu speichern:
Code:
$_SESSION=[
          'captchas'=>[
                       'zufälligerHashAusFormular'      =>'ZufallsStringImCaptcha',
                      'andererZufälligerHashAusFormular'=>'andererZufallsStringInAnderemCaptcha',
                      ]
          ];

So weisst du beim Prüfen der Formulareingaben, welchen String du prüfen musst, nämlich
Code:
if(isset($_SESSION['captchas']) 
    && isset($_SESSION['captchas']['wertDesVerstecktenFeldes']) 
        && $_POST['EingabeFeldFürString']==$_SESSION['captchas']['wertDesVerstecktenFeldes'])
        {
          //alles in Butter
        }
 
Zurück