Witam.
Jestem początkującym w PHP i uczę się poprzez wykonywanie rozmaitych zadań.
W jednym z takich zadań natrafiłem na problem z którym nie potrafię sobie poradzić.
Chodzi mianowicie o następującą sprawę.
Tworzę formularz kontaktowy w którym CAPTCHA polega na przeczytaniu przez "usera" działania, wykonania go i wpisania w odpowiednie pole (http://www.dwr.net.pl/fkontakt/fkontakt.php).
Formularz waliduje mi się wg oczekiwań - oprócz pola w którym "user" wpisuję wynik.
Problem jest następujący: Losowane jest działanie i wyświetlane w formularzu, użytkownik wpisuję wynik i naciska wyślij wtedy znowu losowane jest działanie i dlatego wynik wcześniej wpisany przez użytkownika się nie zgadza.
W jaki sposób zatrzymać losowanie aby na nowo się już nie losowało.
Mam nadzieję że w miarę jasno wyjaśniłem o co mi chodzi.
Z góry dziękuję za odpowiedź.
Pozdrawiam
Darek.
Jednokrotne wywołanie losowania dla jednej sesji.
Re: Jednokrotne wywołanie losowania dla jednej sesji.
Cześć, próbowałem zrobić jak pisałeś, niestety jeśli przypisuję zmienną $wynik do zmiennej sesyjnej $_SESSION['wynik'] to nadal przy kolejnym losowaniu zmienna sesyjna zmienia się na bieżący wynik a nie na przedostatnie losowanie.
Wklejam cały kod - może ktoś znajdzie czas aby rzucić okiem. Pozdrawiam.
Wklejam cały kod - może ktoś znajdzie czas aby rzucić okiem. Pozdrawiam.
Kod: Zaznacz cały
<?php
session_start();
$_SESSION['nazwa']=''; //deklaracja pustych zmiennych
$_SESSION['email']='';
$_SESSION['temat']='';
$_SESSION['tresc']='';
$_SESSION['captcha']='';
$_SESSION['dzialanie_cap']='';
$_SEESION['walidacja']='';
$_SESSION['dzialaniesesji']='';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
<title>Formularz kontaktowy</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="style_fkontakt.css" />
<script type="text/javascript" src="scrypt.js"></script>
</head>
<body>
<?php
//=====================================================zadeklarowanie zmiennych z formularza (POST) do zmiennych sesyjnych
$nazwa=$_SESSION['nazwa']=$_POST['name'];
$email=$_SESSION['email']=$_POST['mail'];
$temat=$_SESSION['temat']=$_POST['topic'];
$tresc=$_SESSION['tresc']=$_POST['content_form'];
$captcha=$_SESSION['captcha']=$_POST['captcha'];
$dzialanie=$_SESSION['dzialanie_cap']=$_POST['dzialanie_cap'];
$walidacja=$_SEESION['walidacja']=$_POST['walidacja'];
//===============================================LOSOWANIE===========================================================================================
$pierwsza = array("zero","jeden","dwa","trzy","cztery","pięć","sześć","siedem","osiem","dziewięć","dziesięć"); //zadeklarowana tablica z możliwymi do wylosowania zmiennymi
$dzialanie = array("dodać","odjąć"); //zadeklarowana tablica z możliwymi do wylosowania działaniami
function losowanie_pierwsza() //losowanie pierwszej zmiennej oraz działania
{
global $losowanie_pierwsza, $losowanie_dzialanie, $losowanie_druga, $pierwsza, $dzialanie; //zadeklarowane zmienne globalne aby można je przetwarzać poza funkcją
$losowanie_pierwsza = array_rand($pierwsza); //losowanie pierwszej zmiennej
$losowanie_dzialanie = array_rand($dzialanie); //losowanie działania
}
function losowanie_druga() //losowanie drugiej zmiennej
{
global $losowanie_druga, $pierwsza; //zmienne globalne
$losowanie_druga = array_rand($pierwsza); //losowanie drugiej zmiennej
}
losowanie_pierwsza (); //zwracanie wartości funckji losowanie_pierwsza()
losowanie_druga (); //zwracanie wartości funckji losowanie_druga()
do{ //pętla, przeprowadzamy losowanie_druga() tak długo aż wynik zmiennej losowanie_pierwsza (nasza pierwsza liczba w działaniu) nie będzie większy od liczby drugiej
losowanie_druga ();
}
while ($losowanie_pierwsza < $losowanie_druga);
function dzialanie() //funkcja określa które działanie ma zostać wykonane
{
global $losowanie_dzialanie, $dzialanie_captcha, $losowanie_pierwsza, $losowanie_druga; //deklaracja zmiennych globalnych
if ($losowanie_dzialanie == 0){ //jesli w losowaniu wypadlo ze index 0 dla tablicy dzialanie - to wykonujemy dodawanie
$dzialanie_captcha = $losowanie_pierwsza + $losowanie_druga; //dodawanie dwóch zmiennych
}
else{ //jeśli inaczej to odejmowanie
$dzialanie_captcha = $losowanie_pierwsza - $losowanie_druga;
}
}
//dzialanie (); // zwracamy wartość funckji działanie
if (!isset($walidacja)){
dzialanie();
}
$wyniki = array("zero","jeden","dwa","trzy","cztery","pięć","sześć","siedem","osiem","dziewięć","dziesięć","jedenaście","dwanaście","trzynaście", "czternaście",
"piętnaście", "szesnaście", "siedemnaście", "osiemnaście", "dziewiętnaście", "dwadzieścia");
$wynik_slowny = $wyniki[$dzialanie_captcha];
$_SESSION['dzialaniesesji']=$dzialanie_captcha;
//============================================WALIDACJA DANYCH=======================================================================================
if ($walidacja == 1)
{
include 'fwalidacja.php';
}
//=============================================FORMULARZ HTML========================================================================================
echo ("<div id='screen'></div>
<div id='kontakt_interface'>
<fieldset id='box_kontakt'>
<legend>Formularz kontaktowy</legend>
<form id='kontakt_form' action='http://127.0.0.1/blog-php/fkontakt/fkontakt.php' method='post'>
<table id='tabela_kontaktu' cellspacing='0' cellpadding='0'>
<tr><td><input id='nazwa' name='name' type='text' size='30' maxlength='100' value='$nazwa' />$nazwaINFO</td></tr>
<tr><td><span class='form_txt'>imię i nazwisko</span></td></tr>
<tr><td><input id='e-mail' type='text' name='mail' size='30' maxlength='100' value='$email' />$emailINFO</td></tr>
<tr><td><span class='form_txt'>adres e-mail</span></td></tr>
<tr><td><input id='temat' name='topic' type='text' size='30' maxlength='100' value='$temat' />$tematINFO</td></tr>
<tr><td><span class='form_txt'>temat wiadomości</span></td></tr>
<tr><td><textarea id='wiadomosc' name='content_form' cols='55' rows='3'>$tresc</textarea>$trescINFO</td></tr>
<tr><td><span class='form_txt'>treść wiadomości (255 znaków)</span></td></tr>
<tr><td><span class='weryfikacja'>$walidacja, wykonaj działanie w celu weryfikacji: $pierwsza[$losowanie_pierwsza] $dzialanie[$losowanie_dzialanie] $pierwsza[$losowanie_druga] = </span> <input name='captcha' type='text' maxlength='20' size='8' value='$captcha' />* $captchaINFO</td></tr>
<tr><td><span class='form_txt'>*wynik przedstaw słownie $dzialniesesji</span></td></tr>
<tr><td style='padding-top: 10px'><input id='anuluj' name='anuluj' type='button' value='anuluj' />
<input name='walidacja' type='hidden' value='1' />
<input id='wyslij' name='wyslij' type='submit' value='wyślij' /></td></tr>
</table>
</form>
</fieldset>
</div>");
?>
</body>
</html>
-
www.skrypty.pro
- Nowy

- Posty: 128
- Rejestracja: czw lis 04, 2010 9:41 am
- Lokalizacja: www.skrypty.pro
- Kontakt:
Re: Jednokrotne wywołanie losowania dla jednej sesji.
Nie wiem czy by było to poprawnie ale może zapisać wylosowanego do zmiennej globalnej ?