Convalida form

Salve ragazzi, sto cercando di far funzionare questo segmento di codice preso da un libro php, ma non ne vuole di funzionare. La convalida dei dati non funziona e dopo il submit viene sempre visualizzato solo il form.

html>
<head><title></title></head>
<body bgcolor="#FFFFFF">
<?php
if (isset($submit)) {
    echo "ciao";
   //make an array of field names and data types

   $field_names = array("first_name" => "string",
            "last_name" => "string",
            "birth_date" => "date",
            "phone" => "string",
            "age" => "integer",
            "address" => "string",
            "city" => "string",
            "state" => "string",
            "postal_code" => "string");

   //try checking the data type of each submitted value based on the name of the field

   function form_validate($fns) {

      foreach ($fns as $key => $value) {

         $field_value = $key;

         global $$field_value;

         echo "actual field value is " . $$field_value . "<br>";    

         switch ($value) {

            Case "string";

               if ((strlen($$field_value) < 1) or (strlen($$field_value) > 99)) {
                  throw new Exception("Please enter a string value between 1 and 100 characters in the <b>$key</b> field");
               }
            
               break;

            Case "date";

               if (!ereg("^[0-9]{4}\-([1-9]|(0[1-9])|(1[0-2]))\-([1-9]|(0[1-9])|([1-2][0-9])|3[0-1])$",$$field_value)) {

                  throw new Exception("Please enter a valid date formatted as YYYY-MM-DD in the <b>$key</b> field");
               }

               break;

            Case "integer";

               if (!is_numeric($$field_value)) {

                  throw new Exception("Please enter a number without decimal places or alphabetical characters in the <b>$key</b> field.");
               }

               break;

            default;

               break;

         }
      }      
   }

   //catch the exception and produce an error message

   try
   {
      form_validate($field_names); 
   }

   catch (Exception $e)
   {
      echo $e -> getMessage();
      echo "<br>";
   }

}

//if no errors thank the user
 if (!is_object($e) and isset($submit)) {

   echo "Thanks for your entry. We'll be in touch.";
} else {

//return the filled out form to the user and ask them to try again

?> 

<form action="index.php" method="post">
  
<!-- TUTTI I CAMPI DEL FORM -->

 <input type="submit" value="Send Info" name="submit">
</form>
<?php
}
?>

</body>
</html>
inviato 8 anni fa
whitewolf11
X 0 X

prima cosa devi verificare se nel tuo server web è dissattivato la variabile di sistema "register global"

In caso positivo, allora questa istruzione non va bene

if (isset($submit)) {

   echo ' ciao'

ma dovresti recuperare la variabile $submit dal vettore $_POST (ti consiglio di leggerti un pò di documentazione a riguardo)

Tutti i valori che l'utente passa attraverso una form vengono memorizzati nel vettore $_POST o $_GET (dipende dal tipo di metodo usato nella form), e quindi per utilizzarli bisogna estrarli.

Morale della favola prova a mettere questa istruzione all'inizio:

$submit=$_POST['submit'];

(immagino che nei campi nella form avrai inserito un campo di tipo 'hidden' e con il nome submit)

Lo stesso discorso dovresti farlo per tutte le altre variabili che passi dalla form.

Ciao

Giuseppe

risposto 8 anni fa
Toto007
modificato 8 anni fa
X 0 X

Ciao Giuseppe, ho preso il codice da un libro e avendo dato per scontato che fosse completo non mi sono accorto che mancava tutta la parte relativa alla cattura dei valori... :buck:

Grazie comunque per la risposta.

risposto 8 anni fa
whitewolf11
X 0 X

Ciao ragazzi, desidero avere un vostro parere sulla seguente "struttura" per la convalida di un form. Non badate ai criteri di convalida, me basta solo sapere se la struttura va bene...ed eventualmente migliorarla.

Il form si appoggia sulla seguente classe: validate.class.php

<?php

class Validate {

public function form_validate() 
{

 // validiamo il nome
 if (!$this->validateNome($_POST['first_name']))
 {
  throw new Exception("Il nome deve essere almeno di due lettere ed inferiore a 50 caratteri");
 }
 // validiamo la data 
 if (!$this->validateData($_POST['data_nascita'])) {
   throw new Exception("La data non è corretta. Utilizzare il formato DD/MM/ANNO");
 }
   
}

private function validateNome($valore) {
 if ((strlen($valore) < 2) or (strlen($valore) > 99))
   return 0;
 else 
   return 1;
 }

private function validateData($valore) {
 if (!ereg("^([1-9]|(0[1-9])|([1-2][0-9])|3[0-1])/([1-9]|(0[1-9])|(1[0-2]))\/[0-9]{4}\$",$valore)) 
   return 0;
 else 
   return 1;
}

} 
?>

mentre il form è nel file: index.php:

<html>
<body>
<?php
require_once ('validate.class.php');

if (isset($_POST['posted'])) {
  
  try {
      $validazione = new Validate;
      $validazione->form_validate();
  }

  catch (Exception $e) {
    echo $e -> getMessage();
  }

}

//se non ci sono errori 
if (!is_object($e) and isset($posted)) {
  echo "Grazie per esserti registrato.";
} 
else 
{

?> 
<form action="index.php" method=post>
  <input type="hidden" name="posted" value="true">

  <!-- Tutti campi del form -->

  <input type="submit" value="Send Info" name="submit">
</form>
<?php
}
?>

</body>
</html>
risposto 8 anni fa
whitewolf11
modificato 8 anni fa
X 0 X

La classe Validate contiene sia metodi per validare un particolare form, sia medoti per controlli generici. Questo implica che per ciascun form dovrai creare una nuova classe Validate nella quale ricopiare questi ultimi metodi, cosa che ovviamente è sbagliata.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Quindi devo creare una classe Validate che sia indipendente dai dati provenienti dai form ? Cioè una classe di validazione che posso applicare a tutti i tipi di form ?

risposto 8 anni fa
whitewolf11
modificato 8 anni fa
X 0 X

Potresti creare una classe contenente diversi metodi statici utili alla validazione di numeri, stringhe, nomi, email, ecc. e poi una classe per ciascun form che sfrutta i metodi della classe di prima.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Scusa Gianni, fatti chiedere una cosa: il metodo da te indicato è quello che normalmente si adotta per una convalida di un form ?  Oppure esiste un tipo di approccio completamente diverso da questo ? No perchè sto cercando di capire qual'è la struttura migliore (o comunque buona) da adottare per una convalida di un form.

Grazie mille.

risposto 8 anni fa
whitewolf11
X 0 X

Intanto ho modificato la struttura nel modo seguente:

1) La classe relativa al form da convalidare: validate.class.php

<?php
require_once('metodi.class.php');

class Validate {

public function form_validate() 
{
 
 // validiamo il nome
 if (!Metodi::validateNome($_POST['first_name']))
 {
   throw new Exception("Il nome deve essere almeno di due lettere ed inferiore a 50 caratteri");
 }
 
 // validiamo la data 
 if (!Metodi::validateData($_POST['data_nascita'])) 
 {
   throw new Exception("La data non è corretta. Utilizzare il formato DD/MM/ANNO");
 }
   
}

} 
?>

2) I metodi statici per la convalida dei dati: metodi.class.php

<?php

class Metodi {

public static function validateNome($valore) {
 if ((strlen($valore) < 2) or (strlen($valore) > 99))
   return 0;
 else 
   return 1;
}

public static function validateData($valore) {
 if (!ereg("^([1-9]|(0[1-9])|([1-2][0-9])|3[0-1])/([1-9]|(0[1-9])|(1[0-2]))\/[0-9]{4}\$",$valore)) 
   return 0;
 else 
   return 1;
}

} 
?>

Mentre index.php riportato sopra rimane invariato.

Comunque, come riportato nel post precedente, ho qualche dubbio su questa tipologia di struttura:

Ossia:  Form (index.php) ---> Classe Legata al form (validate.class.php) ---> richiamo dei metodi statici di convalida (metodi.class.php)

Che ne pensate ?  :-\

risposto 8 anni fa
whitewolf11
X 0 X

Non esistono tecniche ufficiali o "definitive" per implementare i controlli in un form. Molto dipende dalla struttura dell'applicazione nella quale stai implementando queste classi, in altre parole dipende dal contorno. Inoltre le soluzioni possono variare anche in base agli scopi che ci si prefigge, alla flessibilità che si vuole garantire, ecc. Se vuoi qualche spunto puoi sbirciare nei diversi framework per PHP in circolazione, es.: Zend Framework, CakePHP, ecc. Troverai soluzioni molto elaborate che potrebbero essere eccessive per i tuoi scopi.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda