Jednokrotne wywołanie losowania dla jednej sesji.

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
darek_w
Nowy
Nowy
Posty: 41
Rejestracja: sob lip 31, 2010 8:48 am

Jednokrotne wywołanie losowania dla jednej sesji.

Post autor: darek_w »

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.
darek_w
Nowy
Nowy
Posty: 41
Rejestracja: sob lip 31, 2010 8:48 am

Re: Jednokrotne wywołanie losowania dla jednej sesji.

Post autor: darek_w »

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.

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
Nowy
Posty: 128
Rejestracja: czw lis 04, 2010 9:41 am
Lokalizacja: www.skrypty.pro
Kontakt:

Re: Jednokrotne wywołanie losowania dla jednej sesji.

Post autor: www.skrypty.pro »

Nie wiem czy by było to poprawnie ale może zapisać wylosowanego do zmiennej globalnej ?
ODPOWIEDZ