Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Losowanie liczb
adrianozo
post 11.06.2010, 14:12:00
Post #1





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Spawnm
post 11.06.2010, 14:16:54
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




rand zobacz jakie przyjmuje parametry.
Dodatkowo poczytaj o czymś takim jak captcha.
Go to the top of the page
+Quote Post
adrianozo
post 11.06.2010, 14:22:23
Post #3





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
zordon
post 11.06.2010, 14:32:59
Post #4





Grupa: Zarejestrowani
Postów: 358
Pomógł: 78
Dołączył: 4.11.2008
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  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


Go to the top of the page
+Quote Post
jajcarzd1
post 11.06.2010, 14:34:52
Post #5





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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ć.


--------------------
My mind is glowing ...
Jeśli pomogłem push the button :)
Go to the top of the page
+Quote Post
adrianozo
post 11.06.2010, 14:41:39
Post #6





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
jajcarzd1
post 11.06.2010, 14:48:13
Post #7





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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


--------------------
My mind is glowing ...
Jeśli pomogłem push the button :)
Go to the top of the page
+Quote Post
adrianozo
post 11.06.2010, 14:49:46
Post #8





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

Ostrzeżenie: (0%)
-----


Kit z powtarzanie teraz. Chodzi mi o to co mam zrobić, żeby liczby były prawidłowe smile.gif


--------------------
Go to the top of the page
+Quote Post
zordon
post 11.06.2010, 14:49:47
Post #9





Grupa: Zarejestrowani
Postów: 358
Pomógł: 78
Dołączył: 4.11.2008
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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

Ten post edytował zordon 11.06.2010, 14:50:59
Go to the top of the page
+Quote Post
jajcarzd1
post 11.06.2010, 14:57:07
Post #10





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

Ostrzeżenie: (0%)
-----


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.  


Ten post edytował jajcarzd1 11.06.2010, 14:57:34


--------------------
My mind is glowing ...
Jeśli pomogłem push the button :)
Go to the top of the page
+Quote Post
Fifi209
post 11.06.2010, 16:17:31
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


a to w rand nie można podać 0,999 ? tylko trzeba trzy razy losować? haha.gif


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Kokohelp
post 11.06.2010, 17:06:50
Post #12





Grupa: Zarejestrowani
Postów: 20
Pomógł: 1
Dołączył: 7.06.2010

Ostrzeżenie: (0%)
-----


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)


Ten post edytował Kokohelp 11.06.2010, 17:08:23
Go to the top of the page
+Quote Post
bastard13
post 11.06.2010, 17:56:23
Post #13





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
adrianozo
post 11.06.2010, 19:35:45
Post #14





Grupa: Zarejestrowani
Postów: 733
Pomógł: 4
Dołączył: 11.11.2009

Ostrzeżenie: (0%)
-----


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 ;]


--------------------
Go to the top of the page
+Quote Post
bastard13
post 11.06.2010, 19:56:49
Post #15





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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

Ten post edytował bastard13 11.06.2010, 19:57:48


--------------------
Go to the top of the page
+Quote Post
Szunaj85
post 12.06.2010, 17:34:03
Post #16





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


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ę!".

Ten post edytował Szunaj85 12.06.2010, 17:56:20


--------------------
Jeśli Ci pomogłem wciśnij Jeśli mi pomożesz wcisnę
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.06.2025 - 03:45