Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowanie liczb
Forum PHP.pl > Forum > Przedszkole
adrianozo
Witam.
Chciałbym trochę zabezpieczyć skrypt wysyłający mail'a ze strony i wymyśliłem skrypt, ale nie wiem jak się za niego zabrać. Chciałbym wylosować trzy cyfry(zakres od 0 do 9) czyli np 029 i prosiłbym o wpisanie pierwszej i ostatniej czyli wyglądało by to tak: 09. Jeśli taką liczbę wpisałbym użytkownik email zostałby wysłany, a jak nie zgadzałyby się to pokazałby się komunikat:

Komunikat napisałem:

  1. elseif($_POST['liczba']!=$liczby)
  2. {
  3. echo '<div align="center"><font color="red"><b>Podany kod jest nieprawidłowy!</b></font></div><br />';
  4. }


W formularzu zrobiłem tak:

  1. echo 'Przepisz pierwszą i ostatnią liczbe:<br />';
  2. echo rand() . "\n";
  3. echo '<br /><input type="text" name="liczba" /><br /><br />


Ale rand losuje długie liczby, a poza tym nie wiem jak sprawdzić czy to co wpisze użytkownik to jest pierwsza i ostatnia wylosowana liczba.
Mam nadzieje, że dobrze wyjaśniłem.
Proszę o pomoc smile.gif
Z góry dziękuje smile.gif

A i jeszcze, żeby liczby się nie powtarzały
Spawnm
rand zobacz jakie przyjmuje parametry.
Dodatkowo poczytaj o czymś takim jak captcha.
adrianozo
Ok zrobiłem:

  1. echo rand(0,9) . "\n";


Tylko to wyświetla jedną... czyli co mam zrobić trzy razy?

A po drugie nie chce captcha
zordon
  1. $cyfra1 = rand(0,9);
  2. $cyfra2 = rand(0,9);
  3. $cyfra3 = rand(0,9);


potem wyświetlasz do użytkownikowi:

  1. echo "Wprowadź pierwszą i ostatnią cyfrę z ciągu: " . $cyfra1 . $cyfra2 . $cyfra3;


A jak odbierzesz z posta i zapiszesz do zmiennej np $odebrane to sprawdzasz:

  1. if($odebrane[0] == $cyfra1 && $odebrane[1] == $cyfra3){
  2. // ok
  3. }


oczywiście musisz mieć STARE wartości zmiennych $cyfra... (żebyś przypadkiem nie wygenerował nowych i nie porównywał z postem), $odebrane to musi być string o długości 2 itd -> ale to mam nadzieję już sobie dopiszesz


jajcarzd1
Może tak:

  1.  
  2. $array = array();
  3.  
  4.  
  5. for($i=0,$ii=3;$i<$ii;$i++) {
  6.  
  7.  
  8. do {
  9. $liczba = rand(0,9);
  10. } while(in_array($liczba,$array));
  11.  
  12. $array[$i] = $liczba;
  13.  
  14. }
  15.  
  16.  
  17. if(($array[0] == $liczbaUsera_1) and ($array[2] == $liczbaUsera_2)) {
  18. echo "jest ok";
  19. } else {
  20. echo "spadaj";
  21. }
  22.  


Tylko tu oczywiscie masz w jednym miejscu tablicę z wylosowanymi liczbami i etap sprawdzania, a normalnie to będzie tak że gdzieś te wyniki randa będziesz musiał sobie zapisać i potem po zatwierdzeniu przez użytkownika sprawdzać.
adrianozo
Mam takie coś:

  1. $kod='';
  2. for($i=0;$i<3;$i++)
  3. {
  4. $kod.=rand(0,9);
  5. }
  6. echo $kod;
  7. $pomoc = $kod[0].$kod[2];
  8. elseif($_POST['liczba']!=$pomoc)
  9. {
  10. echo '<div align="center"><font color="red"><b>Podany kod jest nieprawidłowy!</b></font></div><br />';
  11. }



I gdy wpisze prawidłowe liczby to pokazuje mi, że są błędne nawet wyświetliłem $pomoc i jest to pierwsza i ostatnia, ale skrypt tego nie przyjmuje
jajcarzd1
No bo jak użytkownik kliknie to masz ponowne losowanie liczb przecież, poza tym w tym losowaniu co zastoswałeś mogą Ci się liczby powtarzać, więc czemu nie wykorzystasz mojego rozwiązania gdzie masz to sprawdzane
adrianozo
Kit z powtarzanie teraz. Chodzi mi o to co mam zrobić, żeby liczby były prawidłowe smile.gif
zordon
dokładnie to o czym pisałem -> generujesz liczby na stronie -> wpisujesz je w formularz -> wysylasz -> strona sie przeladowuje -> znów generujesz -> porównujesz "nowe" wygenerowane liczby ze "starymi" przesłanymi przez formularz

Aby zrobić to, o co Ci chodzi, musisz liczby wygenerowane zapisać do sesji i jak wykryjesz posta z nimi porównać, lub po wygenerowaniu zapisać do inputa o typie "hidden" i po odebraniu posta porównać te wartości (nie generować nowych)

PS. Nie zauważyłem w pierwszym poscie ze liczby maja sie nie powtarzać więc napisałem cos takiego:

  1. $cyfry = array();
  2. for($i = 0 ; $i < 3 ; $i++){
  3.  
  4. do{
  5. $wylosowana = rand(0 , 9);
  6. }while(array_search($wylosowana, $cyfry) !== false);
  7.  
  8. $cyfry[] = $wylosowana;
  9.  
  10. }


inne nazwy ale z tym sobie mam nadzieje już dasz radę.

Pozdrawiam i powodzenia
jajcarzd1
Pisane z palca to ale chyba już powinieneś zakumać idee

  1.  
  2.  
  3. /* gdy normalnie odpalana jest strona generowane są liczby*/
  4. if(!isset($_POST)) {
  5. $array = array();
  6.  
  7. /* losowanie */
  8. for($i=0,$ii=3;$i<$ii;$i++) {
  9.  
  10. do {
  11. $liczba = rand(0,9);
  12. } while(in_array($liczba,$array));
  13.  
  14. $array[$i] = $liczba;
  15.  
  16. }
  17.  
  18. $_SESSION['liczby'] = $array;
  19.  
  20. echo 'Wylosowane liczby to '.$array[0].$array[2];
  21.  
  22. } else {
  23.  
  24. /* jak kliknie to robimy sprawdzenie*/
  25.  
  26. if($_SESSION['liczby'][0].$_SESSION['liczby'][2] == $_POST['cyfry']) {
  27. echo "jest ok";
  28. } else {
  29. echo "spadaj";
  30. }
  31. }
  32.  
Fifi209
a to w rand nie można podać 0,999 ? tylko trzeba trzy razy losować? haha.gif
Kokohelp
Cytat(fifi209 @ 11.06.2010, 17:17:31 ) *
a to w rand nie można podać 0,999 ? tylko trzeba trzy razy losować? haha.gif

W funkcji rand pierwszy argument określa od jakiej liczby ma się zacząć losowanie, a drugi do jakiej liczby. Taki zapis nie gwarantuje wylosowania 3 liczb.
Jeśli się uprzeć to taki zapis będzie poprawny:
  1. rand(100,999)
bastard13
Tak naprawdę, to lepiej jakbyś to wyświetlał w formie rysunku, ponieważ normalny tekst programy potrafią sobie przeczytać, więc jeżeli ktoś się naprawdę uprze to i tak będzie w stanie coś takiego napisać. Jeżeli chodzi ci o to, żeby ktoś nie wysyłał spamu przez twoją stronę, to lepiej niech skrypt blokuje zbyt szybkie maile np. z danego ip można wysłać maila po x sekundach.
adrianozo
Oczywiście później dodam cookies i czasowe blokowanie wysyłania maila przez x sekund, ale na razie chcę to zrobić smile.gif
Ja zwykle mam problem z sesjami ;]
bastard13
Jeżeli już koniecznie chcesz mieć coś takiego to mogę zaproponować:
  1. <?php
  2. if($_POST && $_POST['cyfra']==$_SESSION['cyfry'][$_SESSION['ktora_cyfra']])
  3. { //działanie jeżeli się zgadza
  4. }
  5. else
  6. {
  7. //ilość cyfr: 5-10
  8. $ile=rand(5,10);
  9. for($i=0;$i<$ile;$i++)
  10. $_SESSION['cyfry'][$i]=rand(0,9);
  11.  
  12. //którą cyfrę chcemy dostać w poście
  13. $_SESSION['ktora_cyfra']=rand(1,$ile);
  14.  
  15. echo 'Napisz cyfrę '.$_SESSION['ktora_cyfra'].' z podane ciągu: ';
  16. foreach($_SESSION['cyfry'] as $cyfra)
  17. echo $cyfra.',';
  18. ?>
  19. <form method="post" action="">
  20. <input type="text" name="cyfra" />
  21. <input type="submit" value="wyślij" />
  22. </form>
  23. <?php } ?>

Ale to już takie kombinowanie:P
Szunaj85
Ja jeszcze proponuję sprawdzić ilość wpisanych cyfr.
Często jak użytkownik widzi captcha to po prostu ją przepisuje, często nie zwracając uwagi na tekst typu
"Przepisz tekst z obrazka od tyłu", "Przepisz tekst z obrazka dużymi literami", itp
Jak użytkownik wpisze dwie i poprawne cyfry to ok, ale jeśli trzy to nie wyświetlaj komunikatu typu
"Podany kod jest nieprawidłowy!", tylko np. "Przepisz pierwszą i ostatnią cyfrę!".
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.