Controllo form

Ciao a tutti,

ho realizzato un form con varie select/option.

Ha questo punto clikko su Avanti, che faccio?

Ho due idee:

1) vado alla pagina due.php controllo le scelte e ripropongo la pagina uno.php riazzerata(come?).

2) resto nella pagina(con action=""?) e scrivo un messaggio in rosso da qualche parte.

c'è anche la terza:

aprire un alert, ma non vorrei usare JS, perchè non lo conosco e dovrei  copiare del codice e basta.

GRazie a tutti  :bye:

inviato 10 anni fa
zr7s
zr7s
1
X 0 X

io normalmente tengo tutto il controllo del form nello stesso file (appunto con action=""):

al submit del form prima faccio i controlli più semplici con javascript per evitare all'utente di dover ricaricare la pagina (oppure AJAX/AHAH)

nel caso che i controlli vadano a buon fine allora si passa a ricontrollare tutto lato server, per evitare che gli utenti un pò più "giocherelloni" si siano divertiti ad eludere il controllo javascript.

Se il controllo è riuscito si eseguono le operazioni che devi fare (aggiornamento database, salvataggio file uploadato...ecc...) e si restituisce un messaggio di conferma ben evidente

in caso contrario si evidenziano i passaggi che non sono andati a buon fine riproponendo nel form i dati inseriti in precedenza dall'utente

io procedo così, poi ci sono vari modi di procedere fra cui molte classi per la validazione dei form (PEAR::HTML_Quick_Form, SmartyValidate, ecc...)

 :bye:

risposto 10 anni fa
Xscratch
X 0 X

Anch'io faccio così  :punk:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Dovresti evitare di usare javascript per i controlli, o meglio per renderli ridondanti rispetto a quelli sul server.

Insomma, va bene controllare lato client che un campo non sia vuoto, o anche che l'indirizzo email inserito sia giusto, ma poi questi controlli li devi necessariamente rifare lato server, se no rischi che per passare i tuoi controlli, basta disabilitare il javascript sul client e tutto se ne va in malora.

Quindi: sempre meglio fare due controlli, se tutto è giusto, il server procederà normale, se no ricaricherà la pagina; questo aumenta il livello di accessibilità della pagina ,perché anche chi non ha javascript comunque può accedere alla pagina ed utilizzarla, e tu aumenti comunque il livello di sicurezza del tuo script.

risposto 10 anni fa
Marco Grazia
X 0 X

Sto controllando lato server.

Ma ora mi chiedo,

ho tre pagine:

uno.php scelgo :Anno

due.php in base ad Anno creo un form

tre.php controllo il form:

se OK esegue una query sul DB, ma mi serve Anno devo fare una SESSION per forza?

se not OK scrivo messaggio errore e do la possibilità di tornare indietro con href='due.php'

posso prendere due.php da _POST , non ci riesco!!!

Ciao

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

ora,

il codice che posto sarà semplificato,

non testato (l'ho scritto in notepad in 10 minuti)

però è a grandi linee cm procederei io:

miofile.php

<?

if (isset($_REQUEST['step3'])) {
   // siamo allo step finale
   // controlla la validità dei dati
   if ($dati_validi) {
      // operazioni varie: aggiornamento DB ...invio mail...
      // insomma sai tu quel che devi fare...
      $display = 3;
   } else {
      $display = 2;
      $error = "c'è un errore!!";
   }
}
if (isset($_REQUEST['step2'])) {
   // significa che siamo già alla seconda fase, 
   // quindi controllo validità dell'anno e creo il secondo form
   // impostando anche un campo hidden
   // per ricordare l'anno
   $display = 2;
} else {
   // siamo al primo step del form
   // creo quindi il form per la selezione dell'anno
   $display = 1;
}


switch ($display) {
   case 2:
      if (!empty($error)) echo "<div> {$error} </div>";
   ?>
      <form method="post">
         <input type="hidden" value="<?=$_REQUEST['anno']?>" name="anno" />
         <!-- QUA GLI ALTRI CAMPI DEL FORM -->
         <input type="submit" name="step2" value"Invia" />
      </form>
   <?
      break;
      
   case 3:
   ?>
      <h1>OPERAZIONE COMPLETATA</h1>
   <?
      break;
      
   case 1:
   default:
      ?>
      <form method="post">
         <input type="text" value="Inserisci anno" name="anno" />
         <input type="submit" name="step1" value"Invia" />
      </form>
      <?

}
?>

spero ti possa essere utile  :bye:

risposto 10 anni fa
Xscratch
X 0 X

Grazie,

adesso me lo studio!

quindi mi consigli di fare un'unica pagina?

Ti farò sapere come è andata.

Ciao :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

Allora,

sto provando ad utilizzare l'esempio.

Quando carico la pagina $_REQUEST non ha niente quindi creo il primo form e display=1;

Entro nello switch con display=1 dovrei ricaricare il primo form?

Scusa ma sono una mezza s... , sto esercitandomi con php da molto poco!!

Ciao :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

scusami...

eh, te l'avevo detto che l'avevo scritto velocemente...

ho sbagliato io...

sostituisci

if (isset($_REQUEST['step3'])) {

con

if (isset($_REQUEST['step2'])) {

e

if (isset($_REQUEST['step2'])) {

con

if (isset($_REQUEST['step1'])) {

ora dovrebbe andare...

in teoria... :crazy:

risposto 10 anni fa
Xscratch
X 0 X

Ciao,

questo è il form per la scelta di anno:

<form method="post" action="">

         <input type="radio" name="anno" value="k1" > Anno1<br/>

         <input type="radio" name="anno" value="k2" > Anno2<br/>

<form>

Scelgo l'anno e quindi step1 è valorizzato, entra in isset($_REQUEST['step1']), ma non mi riconosce anno,

penso perchè in default: ho un'altro form, giusto?

Quindi .... inserisco avanti quando creo il form per la scelta dell'anno e in default: che faccio.

Spero di essere stato chiaro, l'esercizio è molto interessante e vorrei portarlo a termine, speriamo.

CIAO :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

Piuttosto perché il nome del modulo non è step1 ma anno.

risposto 10 anni fa
Marco Grazia
X 0 X

Nello switch ($display) c'è il submit step1, mi sto perdendo!!!!

<?php

if (isset($_REQUEST['step2'])) 
{
// siamo allo step finale
echo "<p>controllo dati</p>";
// controlla la validità dei dati
if ($dati_validi) {
// operazioni varie: aggiornamento DB ...invio mail...
// insomma sai tu quel che devi fare...
echo "<p>dati controllati</p>";
$display = 3;
} 
else 
{
$display = 2;
$error = "c'è un errore!!";
}
}
if (isset($_REQUEST['step1'])) 
{
// significa che siamo già alla seconda fase, 
// quindi controllo validità dell'anno e creo il secondo form
// impostando anche un campo hidden
// per ricordare l'anno

      $mysqli = new mysqli('localhost', 'root', 'xxxx', 'db1');
      $result2 = $mysqli->query("SELECT variabile FROM  tracciati where file='".$_REQUEST['anno']."' and tipo=2" ) ;
      $row_vara   = $result2->num_rows;
            
      echo "<form method='post' action='' >" ;
      
      
      echo "<input type='submit' name='step2' value='OK'>";
      echo "</form >";
      
$display = 2;
} 
else 
{
// siamo al primo step del form
// creo quindi il form per la selezione dell'anno
?>
      <p>Scegli l'anno (seleziona solo una ):</p>
      <form method="post" action="">
      
         <input type="radio" name="anno" value="a1961" > Anno61<br/>
         <input type="radio" name="anno" value="a1971" > Anno71<br/>
      
      </form >
<?php      
$display = 1;
}

switch ($display) 
{
case 2:
if (!empty($error)) echo "<div> {$error} </div>";
?>
<form method="post">
<input type="hidden" value="<?=$_REQUEST['anno']?>" name="anno" />
<!-- QUA GLI ALTRI CAMPI DEL FORM -->
<input type="submit" name="step2" value="Invia" />
</form>
<?php
break;
case 3:
?>
<h1>OPERAZIONE COMPLETATA</h1>
<?php
break;
case 1:
default:
?>
<form method="post">
<input type='submit' name="step1" value='Avanti'>-->
</form>
<?php
}
?>
risposto 10 anni fa
zr7s
zr7s
1
X 0 X

step1 equivale al tasto invio sul tuo modulo, mentre step2 al valore passato come anno, mentre ancora anno è il nome del campo nascosto (hidden)

un consiglio: keep it simple.

risposto 10 anni fa
Marco Grazia
X 0 X

Una cosa alla volta:

$_request registra tutte le variabile di tutti i form della pagina?

Se si quando sto nel default e digito su step1 vado su e isset(S_REQUEST['step1']) è true, ma l'anno?

Era meglio se stavo in ferie!!!

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

da manuale php...

$_REQUEST: Variables provided to the script via the GET, POST, and COOKIE input mechanisms, and which therefore cannot be trusted. The presence and order of variable inclusion in this array is defined according to the PHP variables_order configuration directive. This array has no direct analogue in versions of PHP prior to 4.1.0. See also import_request_variables().

poi...

posto di nuovo il codice, l'ho sistemato un pò...Leggi bene i commenti.

Lo scopo per cui ho usato la variabile display e il costrutto switch è per mantenere separati (per modo di dire) l'elaborazione dei dati dalla presentazione della pagina, quindi non serve utilizzare gli 'echo' all'interno degli if:

impostando $display = 1; verrà visualizzato il form per la selezione dell'anno

impostando $display = 2; verrà visualizzato il 2° form (con eventuali errori)

impostando $display = 3; verrà visualizzato il messaggio di conferma

spero di essere stato più chiaro ora...  8)

<?php

if (isset($_REQUEST['step2'])) {
   /* siamo allo step finale
   * controlla la validita' dei dati inseriti nel SECONDO modulo
   *
   * es: 
   */
   if (!empty($_REQUEST['nome']) && !empty($_REQUEST['anno'])) {
      /*
      * i 2 campi del form sono stati verificati, quindi si può procedere
      * a...boh... sai tu quel che deve fare sto from...
      */
      $display = 3;
   } else {
      $display = 2;
      $error = "non hai compilato tutti i campi!!";
   }
}
if (isset($_REQUEST['step1'])) {
   /* significa che siamo gia' alla seconda fase, 
   * quindi controllo validita' dell'anno
   */
   if (isset($_REQUEST['anno'])) {
      /*
      * l'anno e' stato scelto quindi ci sono le prime operazioni da effettuare:
      * ad esempio creare il secondo form ricordando pero' anke il valore dell'anno
      * e, per fare questo tengo l'anno in un campo hidden del secondo form
      */
      $display = 2;
      $mysqli = new mysqli('localhost', 'root', 'xxxx', 'db1');
      $result2 = $mysqli->query("SELECT variabile FROM  tracciati where file='".$_REQUEST['anno']."' and tipo=2" ) ;
      $row_vara   = $result2->num_rows;
   } else {
      $display = 1;
   }
} else {
   // siamo al primo step del form
   // creo quindi il form per la selezione dell'anno
   $display = 1;
}

switch ($display) {
   case 2:
      if (!empty($error)) echo "<div> {$error} </div>";
   ?>
      <form method="post">
         <input type="hidden" value="<?=$_REQUEST['anno']?>" name="anno" />
         <!-- QUA GLI ALTRI CAMPI DEL FORM -->
         <input type="text" name="nome" value="Inserisci il tuo nome" />
         <input type="submit" name="step2" value="Invia" />
      </form>
   <?php
      break;
   
   case 3:
   ?>
      <h1>OPERAZIONE COMPLETATA</h1>
   <?php
      break;
   
   case 1:
   default:
   ?>
      <p>Scegli l'anno (seleziona solo una ):</p>
      <form method="post" action="">
         <input type="radio" name="anno" value="a1961" /> Anno61<br/>
         <input type="radio" name="anno" value="a1971" /> Anno71<br/>
         <input type="submit" name="step1" value="Vai al secondo step" />
      </form >
   <?php
}
?>

 :bye:

risposto 10 anni fa
Xscratch
X 0 X

Ciao,

quindi il primo form, quello della scelta anno lo devo creare due volte.

una nel default

una nel' else di isset(SREQUEST['step1']

dimmi di SI!!!

Ciao :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

Credo di aver capito!

Funziona bene, ma quando sto in step2 ed è tutto OK metto display=3 e purtroppo mi fa rivedere il form iniziale

entra nel else di if step1.

Che faccio?

Vado a pagina nuova o metto un bel elseif

GRAzie :bye:

risposto 10 anni fa
zr7s
zr7s
1
X 0 X

ok, ho avuto solo ora il tempo di testarlo...

cmq vedo che hai capito!!  O0

sostituisci

}
if (isset($_REQUEST['step1'])) {

con

}elseif (isset($_REQUEST['step1'])) {

 :bye:

risposto 10 anni fa
Xscratch
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda