Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Rozwiązany] Problem ze zmienną przy przeładowaniu strony - captcha przy formularzu
Forum PHP.pl > Forum > PHP
ats2008
Witajcie.

Postanowiłem wyrzeźbić prymitywną "captchę" przy formularzu kontaktowym, przy użyciu takiego kodu:

  1. //losowanie obrazka do captcha
  2. $kod = mt_rand(1,9);
  3.  
  4. for ($i = 0; $i<4; $i++)
  5. {
  6. $kod .= ' '.mt_rand(0,9);
  7. }
  8.  
  9. $contact_cat = str_replace(" ", "", $kod); //usuwanie spacji.


pole input:
  1. <div id="wpisz">Przepisz numer z obrazka:</div>
  2. <input id="obrazek" class="contact" type="text" name="obrazek" />
  3. <div id="span_captcha">'.$kod.'</div>


oraz warunku:
  1. if ($_POST['obrazek'] == $contact_cat ) {wyślij wiadomość}


(ma to tą zaletę, że obrazek ma spacje, a skrypt akceptuje liczby bez spacji, co trochę może utrudnić zycie robotom, hehe).

Problem polega na tym, że żeby wysłać formularz skrypt przeładowuje w tym czasie zmienną $contact_cat i wyświetlony jest błąd.

Konkretnie:

Pierwotnie wyświetlają się liczby np. 12345 w obrazku, wpisuję 12345 do input "obrazek" . Po naciśnięciu "wyślij"
$kat = 46785 a $_post['obrazek'] = 12345.

Stąd pojawia się błąd.

Poszukuję sposob, żeby zatrzymać wartość 12345 niezależnie od przeładowania. Wtedy będę w domu.

(mógłbym to zrobić na js, ale chcę tego uniknąć).

Znacie jakąś podpowiedź lub rozwiązanie?

z góry dzięki
nospor
sesja waćpanie.
ats2008
Waćmość,

próbowałem coś takiego:
  1. $_SESSION['contact'] = $contact_cat;


Wynik jest przewidywalny... bo $contact_cat zmienia się...

nospor
Waćpan, pomyśl trochę....

Kod do sesji masz zapisywać tylko i wyłącznie w momencie generowania formularza. Gdy ślesz forma do sprawdzenia, to już do sesji masz nic nie zapisywać. Wówczas z sesji masz odczytać i porównać z tym co ci w formie wpisali.
ats2008
no wiem, wiem.

Głowię się jak zapisać w sesji zmienną $contact_cat, żeby nie przeładowywała się.... przy wysyłaniu a z kolei była za każdym wyświetleniem formularza inna.

Wiem, że jestem noobem w php, lepiej mi wychodzi css smile.gif
nospor
Naprawdę nie jesteś w stanie określić czy jesteś na etapie sprawdzania formularza czy na etapie jego generowania?
ats2008
No powiem Ci szczerze, że mam problem.

Kod całego skryptu formularza jest trochę problematyczny (używam go, bo jest łatwo edytowalny, ale zaczęły roboty się aktywizować...):

Formularz jest generowany ze zmiennej $forma;

  1. <div id="formularz">
  2.  
  3. <?php
  4. //losowanie obrazka do captcha
  5. $kod = mt_rand(1,9);
  6.  
  7. for ($i = 0; $i<4; $i++)
  8. {
  9. $kod .= ' '.mt_rand(0,9);
  10. }
  11.  
  12. $contact_cat = str_replace(" ", "", $kod); //usuwanie spacji.
  13.  
  14.  
  15.  
  16. $forma = '
  17. <form method="post" action="" name="kontakt" id="contactform">
  18.  
  19. <div class="contact_email">
  20. <div id="contact_left">
  21. <input class="contact" type="text" name="name" value="Imię i nazwisko *" onfocus="if(this.value==this.defaultValue){this.value=\'\';}"/>
  22.  
  23. <input class="contact" type="text" name="phone" value="Twój numer telefonu *" maxlength="100" onfocus="if(this.value==this.defaultValue){this.value=\'\';}"/>
  24.  
  25. <input class="contact" type="text" name="email" value="Twój adres e-mail *" onfocus="if(this.value==this.defaultValue){this.value=\'\';}"/><br />
  26.  
  27. </div>
  28. <div id="contact_right">
  29. <textarea class="contact" name="text" value="" onfocus="if(this.value==this.defaultValue){this.value=\'\';}">Wiadomość...</textarea>
  30.  
  31. <div style="margin:4px 0;">
  32. <div id="wpisz">Przepisz numer z obrazka:</div>
  33. <input id="obrazek" class="contact" type="text" name="obrazek" />
  34. <div id="span_captcha">'.$kod.'</div>
  35.  
  36. <div class="clear"></div>
  37. </div>
  38.  
  39. <div id="restet_submit">
  40. <input class="reset" type="reset" value="Wyczyść">
  41. <button class="button" type="submit">Wyślij</button>
  42. <div class="clear"></div>
  43. </div>
  44. </div>
  45. </div>
  46. </form>
  47. ';
  48.  
  49. if (($_SERVER['REQUEST_METHOD'] == 'POST')) {
  50.  
  51. if (!$_POST['name'] || !$_POST['phone'] || !$_POST['email'])
  52. {
  53. print '<div style="padding-top:15px; color:#878787; font-weight:bold;" >Uzupełnij wymagane pola:<br /><div style="color:#878787; font-weight:bold;"> ';
  54. if ( !$_POST['name']) print '- imię i nazwisko <br />';
  55. if ( !$_POST['email']) print '- adres e-mail <br />';
  56. if ( !$_POST['phone']) print '- telefon kontaktowy <br /></div></div>';
  57.  
  58. print $forma;
  59.  
  60. }
  61.  
  62. $message = '<html>
  63. <head>
  64. <title>Wiadomość z www.123.pl</title>
  65. </head>
  66. <body>
  67. <p><b>Imię i nazwisko</b>: '.$_POST['name'].',</p>
  68. <p><b>telefon kontaktowy</b>: '.$_POST['phone'].',</p>
  69. <p><b>Adres e-mail</b>: '.$_POST['email'].',</p>
  70. <p><b>Treść wiadomości</b>: '.$_POST['text'].'.</p>
  71. </body>
  72. </html>'; //end of message
  73. $subject = "Wiadomość z formularza kontaktowego";
  74. $to = 'biuro@123.pl';
  75. $headers = 'MIME-Version: 1.0' . "\r\n";
  76. $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
  77.  
  78. // Dodatkowe nagłówki
  79. $headers .= 'To: www.123.pl <biuro@123.pl>' . "\r\n";
  80. $headers .= 'From: info@123.pl' . "\r\n";
  81. $headers .= 'Cc: '.$_POST['email'] . "\r\n";
  82. $headers .= 'Bcc: '.$_POST['email'] . "\r\n";
  83.  
  84.  
  85.  
  86. if ($_POST['name'] && $_POST['phone'] && $_POST['email'])
  87. {
  88.  
  89. if ($_POST['obrazek'] == $contact_cat )
  90. {mail($to, $subject, $message, $headers);
  91.  
  92. echo '<p class="message_confirmation">';
  93. echo '<br />Dziękujemy za wysłanie do nas pytania o treści:<br/><br />';
  94. echo '<b>Imię i nazwisko</b>: '.$_POST['name'].', <br />';
  95. echo '<b>Telefon kontaktowy</b>: '.$_POST['phone'].',<br />
  96. <b>Adres e-mail</b>: '.$_POST['email'].',<br />
  97. <b>Wiadomość</b>: '.$_POST['text'].'.<br />';
  98.  
  99. echo '<br/>Odpowiemy w najbliższym czasie.<br /> <br /> <a href="kontakt.html">Powrót</a>';
  100. echo '</p>';
  101. }
  102. else
  103. {print '<span style="color:#ff0000;"><b>Uwaga!</b></span> Kod odbrazka jest nieprawidłowy, spróbuj ponownie <br /> <br /> <a href="kontakt.html">Powrót</a>';}
  104. }
  105. }else{
  106. print $forma;
  107. }
  108. ?>
  109. </div>


Mam problem z tą sesją.

Po przerobieniu będzie cacy kod do formularza...
nospor
Nie:
if ($_POST['obrazek'] == $contact_cat )
a:
if ($_POST['obrazek'] == $_SESSION['kod'] )

Oraz wszedzie tam gdzie masz
print $forma;
zamien na
print $forma;
$_SESSION['kod'] = $contact_cat;
ats2008
Kolego jesteś wielki - browar leci smile.gif.

Dla każdego kto szuka formularza z prymitywnym captcha kod działający wygląda tak:

  1. <div id="formularz">
  2.  
  3. <?php
  4. //losowanie obrazka do captcha
  5. $kod = mt_rand(1,9);
  6.  
  7. for ($i = 0; $i<4; $i++)
  8. {
  9. $kod .= ' '.mt_rand(0,9);
  10. }
  11.  
  12. $contact_cat = str_replace(" ", "", $kod); //usuwanie spacji.
  13.  
  14.  
  15.  
  16. $forma = '
  17. <form method="post" action="" name="kontakt" id="contactform">
  18.  
  19. <div class="contact_email">
  20. <div id="contact_left">
  21. <input class="contact" type="text" name="name" value="Imię i nazwisko *" onfocus="if(this.value==this.defaultValue){this.value=\'\';}"/>
  22.  
  23. <input class="contact" type="text" name="phone" value="Twój numer telefonu *" maxlength="100" onfocus="if(this.value==this.defaultValue){this.value=\'\';}"/>
  24.  
  25. <input class="contact" type="text" name="email" value="Twój adres e-mail *" onfocus="if(this.value==this.defaultValue){this.value=\'\';}"/><br />
  26.  
  27. </div>
  28. <div id="contact_right">
  29. <textarea class="contact" name="text" value="" onfocus="if(this.value==this.defaultValue){this.value=\'\';}">Wiadomość...</textarea>
  30.  
  31. <div style="margin:4px 0;">
  32. <div id="wpisz">Przepisz numer z obrazka:</div>
  33. <input id="obrazek" class="contact" type="text" name="obrazek" />
  34. <div id="span_captcha">'.$kod.'</div>
  35.  
  36. <div class="clear"></div>
  37. </div>
  38.  
  39. <div id="restet_submit">
  40. <input class="reset" type="reset" value="Wyczyść">
  41. <button class="button" type="submit">Wyślij</button>
  42. <div class="clear"></div>
  43. </div>
  44. </div>
  45. </div>
  46. </form>
  47. ';
  48.  
  49. if (($_SERVER['REQUEST_METHOD'] == 'POST')) {
  50.  
  51. if (!$_POST['name'] || !$_POST['phone'] || !$_POST['email'])
  52. {
  53. print '<div style="padding-top:15px; color:#878787; font-weight:bold;" >Uzupełnij wymagane pola:<br /><div style="color:#878787; font-weight:bold;"> ';
  54. if ( !$_POST['name']) print '- imię i nazwisko <br />';
  55. if ( !$_POST['email']) print '- adres e-mail <br />';
  56. if ( !$_POST['phone']) print '- telefon kontaktowy <br /></div></div>';
  57.  
  58. print $forma;
  59. $_SESSION['kod'] = $contact_cat;
  60. }
  61.  
  62. $message = '<html>
  63. <head>
  64. <title>Wiadomość z www.123.pl</title>
  65. </head>
  66. <body>
  67. <p><b>Imię i nazwisko</b>: '.$_POST['name'].',</p>
  68. <p><b>telefon kontaktowy</b>: '.$_POST['phone'].',</p>
  69. <p><b>Adres e-mail</b>: '.$_POST['email'].',</p>
  70. <p><b>Treść wiadomości</b>: '.$_POST['text'].'.</p>
  71. </body>
  72. </html>'; //end of message
  73. $subject = "Wiadomość z formularza kontaktowego";
  74. $to = 'biuro@123.pl';
  75. $headers = 'MIME-Version: 1.0' . "\r\n";
  76. $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
  77.  
  78. // Dodatkowe nagłówki
  79. $headers .= 'To: www.123.pl <biuro@123.pl>' . "\r\n";
  80. $headers .= 'From: info@123.pl' . "\r\n";
  81. $headers .= 'Cc: '.$_POST['email'] . "\r\n";
  82. $headers .= 'Bcc: '.$_POST['email'] . "\r\n";
  83.  
  84.  
  85.  
  86. if ($_POST['name'] && $_POST['phone'] && $_POST['email'])
  87. {
  88.  
  89. if ($_POST['obrazek'] == $_SESSION['kod'] )
  90. {mail($to, $subject, $message, $headers);
  91.  
  92. echo '<p class="message_confirmation">';
  93. echo '<br />Dziękujemy za wysłanie do nas pytania o treści:<br/><br />';
  94. echo '<b>Imię i nazwisko</b>: '.$_POST['name'].', <br />';
  95. echo '<b>Telefon kontaktowy</b>: '.$_POST['phone'].',<br />
  96. <b>Adres e-mail</b>: '.$_POST['email'].',<br />
  97. <b>Wiadomość</b>: '.$_POST['text'].'.<br />';
  98.  
  99. echo '<br/>Odpowiemy w najbliższym czasie.<br /> <br /> <a href="kontakt.html">Powrót</a>';
  100. echo '</p>';
  101. }
  102. else
  103. {print '<span style="color:#ff0000;"><b>Uwaga!</b></span> Kod odbrazka jest nieprawidłowy, spróbuj ponownie <br /> <br /> <a href="kontakt.html">Powrót</a>';}
  104. }
  105. }else{
  106. print $forma;
  107. $_SESSION['kod'] = $contact_cat;
  108. }
  109. ?>
  110. </div>


a i dorzucę gotowca css (wystarczy zmienić kolory)
  1. /* contactform*/
  2. div#formularz {width:500px; margin:0 auto;}
  3. form#contactform {width:inherit; margin:0; padding:0; display:block;}
  4. form#contactform input, form#contactform textarea { width:486px; padding:6px; display:block; margin:6px 0 6px 0; border:1px solid #996b4d; color:#534942;}
  5. form#contactform textarea.contact {width:486px; margin: 0; color:#433a38 ; height:207px;}
  6. div#restet_submit {margin:6px 0 0 0; width:500px;}
  7. div#wpisz {width:50%; float:left; padding-top:9px;}
  8. input#obrazek {width:100px !important; display:block; float:right; margin-left:16px; }
  9.  
  10. div#span_captcha {width:100px; float:right; color:#fff; font-size: 16px; font-weight:bold; text-align:center; border:1px solid #fff; position:relative; left:-16px; top:6px; padding:5px 0; background:#996b4d;}
  11.  
  12. div#restet_submit input.reset, div#restet_submit button.button {float:left; border:none; width:76px; height:25px; color:#fdfcfb; font-size:11px; font-weight:bold; text-align:center; background:#996b4d;}
  13. div#restet_submit input.reset {margin:0;}
  14. div#restet_submit input.reset:hover, div#restet_submit button.button:hover {color:#e5ceb7;}
  15. div#restet_submit button.button { float:right; }


Zamykam wątek.
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.