Πρόβλημα με φόρμα επικοινωνίας και reCAPTCHA

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
bios21
Δημοσιεύσεις: 89
Εγγραφή: 22 Μάιος 2006 19:35

Πρόβλημα με φόρμα επικοινωνίας και reCAPTCHA

Δημοσίευση από bios21 » 22 Ιαν 2011 17:57

Καλησπέρα !
Έχω ένα πρόβλημα και θα ήθελα τη βοήθεια σας. Έχω βρει μια φόρμα και την έχω διαμορφώσει όπως θέλω. Σε δεύτερη φάση έβαλα το reCAPTCHA. ΤΟ πρόβλημα μου είναι ότι έχω πρόβλημα με τους ελέγχους. Η φόρμα μέχρι τώρα τσέκαρε κάποια πεδία αν είναι συμπληρωμένα.
Τώρα έβαλα το recaptcha και ουσιαστικά ο μόνος έλεγχος είναι αν έχεις βάλει τον σωστό κωδικό. Οπότε πετάει μήνυμα ότι η φόρμα εστάλη ακόμα και άδεια αρκεί να έχεις συμπληρωθεί ο κωδικός.

Παραθέτω το κώδικα της φόρμας:

Κώδικας: Επιλογή όλων

<head>
<?php
if &#40;array_key_exists&#40;'send', $_POST&#41;&#41; &#123;
  // mail processing script
  // remove escape characters from POST array
  if &#40;PHP_VERSION < 6 && get_magic_quotes_gpc&#40;&#41;&#41; &#123;
    function stripslashes_deep&#40;$value&#41; &#123;
	  $value = is_array&#40;$value&#41; ? array_map&#40;'stripslashes_deep', $value&#41; &#58; stripslashes&#40;$value&#41;;
	  return $value;
	&#125;
    $_POST = array_map&#40;'stripslashes_deep', $_POST&#41;;
  &#125;

  $to = 'info@yoursite.gr'; // use your own email address
  $subject = 'EPIKOINWNIA';
  
  // list expected fields
  $expected = array&#40;'name', 'surname', 'address', 'town','postal_code', 'country', 'telephone', 'cellphone', 'email', 'comments'&#41;;
  // set required fields
 $required = array&#40;'name' , 'surname', 'telephone','email'&#41;; !!!!!!!!!!!!!!!!!!!!!!! ΤΑ REQUIRED FIELDS
  // create empty array for any missing fields
  $missing = array&#40;&#41;;
  // set default values for variables that might not exist
  /*if &#40;!isset&#40;$_POST&#91;'interests'&#93;&#41;&#41; &#123;
    $_POST&#91;'interests'&#93; = array&#40;&#41;;
  &#125;
  if &#40;!isset&#40;$_POST&#91;'views'&#93;&#41;&#41; &#123;
    $_POST&#91;'views'&#93; = array&#40;&#41;;
  &#125;
   minimum number of required checkboxes
  $minCheckboxes = 2;
   if fewer than required, add to $missing array
  if &#40;count&#40;$_POST&#91;'interests'&#93;&#41; < $minCheckboxes&#41; &#123;
	$missing&#91;&#93; = 'interests';
  &#125;
*/
  // assume that there is nothing suspect
  $suspect = false;
  // create a pattern to locate suspect phrases
  $pattern = '/Content-Type&#58;|Bcc&#58;|Cc&#58;/i';
  
  // function to check for suspect phrases
  function isSuspect&#40;$val, $pattern, &$suspect&#41; &#123;
    // if the variable is an array, loop through each element
    // and pass it recursively back to the same function
    if &#40;is_array&#40;$val&#41;&#41; &#123;
      foreach &#40;$val as $item&#41; &#123;
         isSuspect&#40;$item, $pattern, $suspect&#41;;
      &#125;
    &#125; else &#123;
      // if one of the suspect phrases is found, set Boolean to true
      if &#40;preg_match&#40;$pattern, $val&#41;&#41; &#123;
        $suspect = true;
      &#125;
    &#125;
  &#125;

  // check the $_POST array and any subarrays for suspect content
  isSuspect&#40;$_POST, $pattern, $suspect&#41;;

  if &#40;$suspect&#41; &#123;
    $mailSent = false;
    unset&#40;$missing&#41;;
  &#125; else &#123;
    // process the $_POST variables
    foreach &#40;$_POST as $key => $value&#41; &#123;
      // assign to temporary variable and strip whitespace if not an array
      $temp = is_array&#40;$value&#41; ? $value &#58; trim&#40;$value&#41;;
      // if empty and required, add to $missing array
      if &#40;empty&#40;$temp&#41; && in_array&#40;$key, $required&#41;&#41; &#123;
        array_push&#40;$missing, $key&#41;;
      &#125; elseif &#40;in_array&#40;$key, $expected&#41;&#41; &#123;
	    // otherwise, assign to a variable of the same name as $key
        $&#123;$key&#125; = $temp;
      &#125;
    &#125;
  &#125;
  
  // validate the email address
  if &#40;!empty&#40;$email&#41;&#41; &#123;
    // regex to identify illegal characters in email address
    $checkEmail = '/^&#91;^@&#93;+@&#91;^\s\r\n\'";,@%&#93;+$/';
	// reject the email address if it doesn't match
    if &#40;!preg_match&#40;$checkEmail, $email&#41;&#41; &#123;
      $suspect = true;
      $mailSent = false;
      unset&#40;$missing&#41;;
    &#125;
  &#125;

  
  // go ahead only if not suspect and all required fields OK
  if &#40;!$suspect && empty&#40;$missing&#41;&#41; &#123;
  
    // build the message
    $message .= "Όνομα&#58; $name\n";
    $message .= "Επώνυμο&#58; $surname\n";
	$message .= "Διεύθυνση&#58; $address\n";
	$message .= "Πόλη&#58; $town\n";
	$message .= "Ταχυδρομικός Κώδικας&#58; $postal_code\n";
	$message .= "Χώρα&#58; $country\n";
	$message .= "Τηλέφωνο&#58; $telephone\n";
	$message .= "Κινητό&#58; $cellphone\n";
	
    $message .= "Email&#58; $email\n";
    $message .= "Σχόλια&#58; $comments\n\n";


    // limit line length to 70 characters
    $message = wordwrap&#40;$message, 70&#41;;

     // create additional headers
     $headers = "From&#58; Mysite\r\n";
	 $headers .= 'Content-Type&#58; text/plain; charset=utf-8';
     if &#40;!empty&#40;$email&#41;&#41; &#123;
       $headers .= "\r\nReply-To&#58; $email";
     &#125;

	 
    // send it   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  $mailSent = mail&#40;$to, $subject, $message, $headers&#41;;
    if &#40;$mailSent&#41; &#123;
	header&#40;'Location&#58; http&#58;//www.mysite/thanks.php'&#41;;
exit;
      // $missing is no longer needed if the email is sent, so unset it
      unset&#40;$missing&#41;;
    &#125;
  &#125;
&#125;



?>


</head>





και το κομμάτι στο body

Κώδικας: Επιλογή όλων





<?php
if &#40;$_POST && isset&#40;$missing&#41; && !empty&#40;$missing&#41;&#41; &#123;
?>
  <p class="warning">Παρακαλώ συμπληρώστε τα στοιχεία με αστερίσκο</p>
<?php
&#125; elseif &#40;$_POST && !$mailSent&#41; &#123;
?>
  <p class="warning">Κάποιο πρόβλημα παρουσιάστηκε. Παρακαλώ προσπαθήστε ξανά.</p>
<?php
&#125; elseif &#40;$_POST && $mailSent&#41; &#123;
?>
  <p><strong>Το μήνυμα σας στάλθηκε. </strong></p>
<?php &#125; ?>


<form id="form1" name="form1" method="post" action="<?php echo $_SERVER&#91;'PHP_SELF'&#93; ?>"> 
 
<h4> συμπληρώστε τα στοιχεία σας</h4>	
	       
      <label for="name" class="text_label"><span class="style1">*</span>Όνομα&#58; 
      <?php
      if &#40;isset&#40;$missing&#41; && in_array&#40;'name', $missing&#41;&#41; &#123; ?>
      <?php &#125; ?>
      </label>
      <input name="name" type="text" class="textInput" id="name" 
      <?php if &#40;isset&#40;$missing&#41;&#41; &#123;
		echo 'value="' . htmlentities&#40;$_POST&#91;'name'&#93;, ENT_COMPAT, 'UTF-8'&#41; . '"';
	  &#125; ?>
      />
       <br />
       
 	<label for="surname" class="text_label"><span class="style1">*</span>Επώνυμο&#58;<?php
      if &#40;isset&#40;$missing&#41; && in_array&#40;'surname', $missing&#41;&#41; &#123; ?>
     <?php &#125; ?>
      </label><input type="text" name="surname" id="surname" class="textInput"<?php if &#40;isset&#40;$missing&#41;&#41; &#123;
		echo 'value="' . htmlentities&#40;$_POST&#91;'surname'&#93;, ENT_COMPAT, 'UTF-8'&#41; . '"';
	  &#125; ?>
      /> 
      <br />
       <label for="address" class="text_label">Διεύθυνση&#58;</label>
  	   <input type="text" name="address" id="address" class="textInput"/>
        <br />
        
       <label for="town" class="text_label">Πόλη&#58;</label>
  	   <input type="text" name="town" id="town" class="textInput"/>
        <br />
        
         <label for="postal_code" class="text_label">Τ.Κ.&#58;</label>
  <input type="text" name="postal_code" id="postal_code"class="textInput" />
   <br />
   
   <label for="country" class="text_label">Xώρα&#58;</label>
  <input type="text" name="country" id="country" class="textInput" />
   <br />
   
    <h4>Συμπληρώστε το email και τα τηλέφωνα επικοινωνίας</h4>
      <label for="telephone" class="text_label"><span class="style1">*</span>Τηλέφωνο&#58; <?php
      if &#40;isset&#40;$missing&#41; && in_array&#40;'telephone', $missing&#41;&#41; &#123; ?>
     <?php &#125; ?>
      </label>
      <input name="telephone" type="text" class="textInput" id="telephone" 
      <?php if &#40;isset&#40;$missing&#41;&#41; &#123;
		echo 'value="' . htmlentities&#40;$_POST&#91;'telephone'&#93;, ENT_COMPAT, 'UTF-8'&#41; . '"';
	  &#125; ?>
      />
      <br />
         
       <label for="cellphone" class="text_label">Κινητό&#58;</label>
  <input type="text" name="cellphone" id="cellphone" class="textInput"/>
   <br />
   
     <label for="email" class="text_label"><span class="style1">*</span>Email&#58; <?php
      if &#40;isset&#40;$missing&#41; && in_array&#40;'email', $missing&#41;&#41; &#123; ?>
     <?php &#125; ?>
      </label>
      <input name="email" type="text" class="textInput" id="email" 
      <?php if &#40;isset&#40;$missing&#41;&#41; &#123;
		echo 'value="' . htmlentities&#40;$_POST&#91;'email'&#93;, ENT_COMPAT, 'UTF-8'&#41; . '"';
	  &#125; ?>
      />
	    <br />
       				   
<!-- CAPTCHA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
  <?php  require_once&#40;'recaptchalib.php'&#41;;
  $publickey = "PUBLIC KEY"; // you got this from the signup page
  echo recaptcha_get_html&#40;$publickey&#41;;
 ?>



    


      <label for="comments">Σχόλια&#58;</label>
      <textarea name="comments" id="comments" cols="45" rows="5"></textarea>
    </p>
    
      </p>
    <p class="clearIt">
      <input name="send" type="submit" id="send" value="ΑΠΟΣΤΟΛΗ >" class="send_button" />
    </p>
  
</form>


για να δουλέψει το recaptcha δημιουργείς και ένα αρχείο verify.php με τον ακόλουθο κώδικα:

Κώδικας: Επιλογή όλων

<?php
  require_once&#40;'recaptchalib.php'&#41;;
  $privatekey = "your_private_key";
  $resp = recaptcha_check_answer &#40;$privatekey,
                                $_SERVER&#91;"REMOTE_ADDR"&#93;,
                                $_POST&#91;"recaptcha_challenge_field"&#93;,
                                $_POST&#91;"recaptcha_response_field"&#93;&#41;;

  if &#40;!$resp->is_valid&#41; &#123;
    // What happens when the CAPTCHA was entered incorrectly
    die &#40;"The reCAPTCHA wasn't entered correctly. Go back and try it again." .
         "&#40;reCAPTCHA said&#58; " . $resp->error . "&#41;"&#41;;
  &#125; else &#123;
    header&#40; 'Location&#58; http&#58;//www.yoursite/welldone.php' &#41; ; Σε στέλνει στην ανάλογη σελίδα αν αποσταλεί σωστά
  &#125;
  ?>

Τέλος σου λέει να αλλάξεις το action στη form και από

Κώδικας: Επιλογή όλων

<form id="form1" name="form1" method="post" action="<?php echo $_SERVER&#91;'PHP_SELF'&#93; ?>"
να το κάνεις

Κώδικας: Επιλογή όλων

<form id="form1" name="form1" method="post" action="verify.php">


Αυτό που θέλω είναι να ελέγχει πρώτα αν είναι συμπληρωμένα τα required fields και να πετάει τα ανάλογα warning messages που έχω ορίσει και μετά να γίνεται ο έλεγχος του captcha. Και να σου πετάει το message ότι δεν έχει γραφεί σωστά ο captcha ή αντιθέτως να σου λέει ότι το μήνυμα έφυγε (αυτά στο verify.php γίνονται)

Ευχαριστώ πολύ !!!!!!
(και συγνώμη για το μέγεθος του μηνύματος)

bios21
Δημοσιεύσεις: 89
Εγγραφή: 22 Μάιος 2006 19:35

Πρόβλημα με φόρμα επικοινωνίας και reCAPTCHA

Δημοσίευση από bios21 » 25 Ιαν 2011 18:21

Λίγη βοήθεια παιδιά.....

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με φόρμα επικοινωνίας και reCAPTCHA

Δημοσίευση από Apostolis_38 » 25 Ιαν 2011 20:35

Μάζεψε σε ένα σημείο της μεταβλητές σου και κάνε require το captcha μόνο εαν και εφόσον συμπληρωθούν όλες οι μεταβλητές.
Κάτι σαν αυτό:

Κώδικας: Επιλογή όλων

if&#40;!empty&#40;$_POST"μεταβλητή1"&#93;&#41; && !empty&#40;$_POST"μεταβλητή2"&#93;&#41; && !empty&#40;$_POST"μεταβλητή3"&#93;&#41; &#41; &#123;require_once &#40;"verify.php"&#41; &#125; 
.

Αλλος τρόπος είναι να βάλεις exit μετά από κάθε έλεγχο για το αν έχουν έρθει οι μεταβλητές, ώστε αν δεν γίνει αυτό να κόβεται το script.
π.χ.

Κώδικας: Επιλογή όλων

if&#40;empty &#40;$_POST&#91;"μεταβλητή"&#93;&#41; &#41; &#123; echo "Κάτι ξέχασες!"; exit;&#125;

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες