• User

    La prima cosa che dovresti fare e' quella di SETTARE LE VARIABILI in PHP prima di passare in HTML, ma questo vuol dire RESETTARE la variabile ogni volta che passi nella routine in PHP (ma c'e' un sistema per risolvere il problema).
    La seconda cosa che mi viene in mente e' quella di utilizzare i COOKIE o le SESSION

    ....ma la cosa che penso sia la migliore e' quella di inserire delle routine in JAVASCRIPT che controllano loro il corretto inserimento dei dati.
    Fammi sapere se cio e' sufficiente... ciaooo


  • User Attivo

    La prima opzione non l'ho capita 😄
    I campi sono davvero tanti, quindi trasformarli in session sarebbe un po' problematico, anche perché in questo forum Thedarkita
    me lo aveva fortemente sconsigliato. Per quanto riguarda i cookies si potrebbe fare, ma ho una domanda: non è che ogni qual volta ritorno su questa pagina per inserire nuovi dati ritrovo già inseriti quelli vecchi??
    La terza -che effettivamente sarebbe la più semplice- non la posso utilizzare perché molti campi sono ipotetici (cioè sono obbligatori ma solo a certe condizioni, quindi dovrei fare dei javascript particolari e non sono capace).
    Te come faresti? 🙂


  • User

    DOMANDONA: quanti sono i campi che devi compilare? TANTI QUANTI? 10 mila? 🙂
    bhe io nel mio sito ho diverse variabili $_SESSION (penso oltre 30) che girano tranquillamente (almeno a me pare di si).. quindi.. non vedo l'enorme problema..(ma sappi che non sono cosi esperto in PHP ehehe).
    intanto rispondi a questa cosa poi vediamo come risolvere il problema almeno a modo mio 🙂
    Ciaooo


  • User Attivo

    Sono 185 campi, alcuni con menù a tendina! Io sarei propenso per i cookies o le session (coll'opzione distruggi session alla fine, ma come si fa a dire distruggi tutte le session tranne alcune? es. l'id utente?). Poi non ho ben capito la tua prima opzione in cosa consisteva 🙂


  • ModSenior

    Ciao nofcfro,
    la pagina che elabora i dati è diversa da quella con il form?


  • User Attivo

    Ciao! 🙂
    No è la stessa! All'inizio c'è il ciclo if di controllo, sotto c'è il modulo con i vari form!


  • User

    @nofcfro said:

    Sono 185 campi, alcuni con menù a tendina! Io sarei propenso per i cookies o le session (coll'opzione distruggi session alla fine, ma come si fa a dire distruggi tutte le session tranne alcune? es. l'id utente?). Poi non ho ben capito la tua prima opzione in cosa consisteva 🙂

    Con 185 campi la mia prima ipotesi diciamo che non e' valida. Te la illustrero' nei prossimi casi eventualmente. Inoltre leggo dalla successiva domanda che tutto viene gestito in UN UNICA PAGINA (mentre io preferisco gestire i programmi in 2 parti = un file php e un file html, ma per farlo utilizzo un TEMPLATE ENGINE e mi trovo BENISSIMO).

    Comunque io personalmente farei tutto con SESSION e non credo che ci siano problemi (qualcuno mi corregga).
    Per quanto riguarda il cancellare alcune session e conservarne altre, anche io mi sono ritrovato in questo problema, ma proprio oggi ho scoperto che i comandi utilizzati in precedenza non vanno bene per la nuova versione di PHP (parlo di @session_start e @session_register). Penso comunque che puoi cancellare solo ALCUNE SESSION ma verifica che versione di PHP stai utilizzando.


  • ModSenior

    Allora basta fare:
    [php]
    <input name="mio_nome" value="<?php if(isset($_POST['mio_nome'])) echo $_POST['mio_nome']; ?>" />
    [/php]
    E te lo ritrovi nuovamente compilato, cosi come l'hai spedito.
    Puoi farlo anche sui select, in maniera un pò differente ovviamente.


  • User Attivo

    Per il principio di economicità userò il metodo consigliato da Thedarkita, ma ringrazio allo stesso modo entrambi per l'aiuto! Mi avete risolto un problema non da poco! Grazie 😄


  • User Attivo

    Se fai elaborare i dati ad uno script in una pagina esterna puoi "tornare indietro" e i campi già compilati rimangono.

    Esempio:
    [php]
    if (trim($_POST['nome'])=="") exit ("Campo nome non compilato! <a href="javascript:history.back()">Torna indietro</a>");
    [/php]


  • User Attivo

    Thedarkita perché il tuo metodo sul *select *non funziona? Avevi scritto che era leggermente diverso applicarlo a *input *e select, puoi cortesemente spiegarmi come applicarlo correttamente? 🙂

    
     <select name= "zz">
    <option value="<?php if(isset($_POST['zz'])) echo $_POST['zz']; ?>"></option>
    <option value="xx">xx</option>
    <option value="yy">yy</option>
    
    

    PS. Grazie Tigrone per la soluzione, mi tornerà sicuramente utile 🙂


  • ModSenior

    La via più veloce, che ripete però l'option 2 volte sarebbe cosi:
    [php]
    <option value="<?php if(isset($_POST['zz'])) echo $_POST['zz']; ?>"><?php if(isset($_POST['zz'])) echo $_POST['zz']; ?></option>[/php]
    Ovviamente è possibile solo nel caso in cui il value è pari al testo mostrato all'utente.
    Altrimenti bisognerebbe fare il conto di quale option impostare come selezionata.


  • User Attivo

    Sì certo 🙂
    E con ```
    <input type="checkbox" name="zz" id="zz" />


  • User

    Caro nofcfro, ehehe mi viene da sorridere perchè mi sembra di rivedere lo stesso mio problema che avevo tempo fa e che ora tu esponi in questa discussione. :bigsmile:
    Sottolineando nuovamente che io non sono un ESPERTO di PHP e che SICURAMENTE sul forum ci sono persone molto più in gamba di me, mi limito soltanto a dirti come io ho risolto un po di problemini ed ho fatto un buon sito (a mio avviso) in base alla mia poca esperienza.

    La prima cosa che ti consiglierei è quella di utilizzare appunto un TEMPLATE ENGINE (nel mio caso utilizzo TinyButStrong, praticamente e' una CLASSE che inserisci nella cartella CLASSES appunto e la richiami all'inizio del programma PHP con il comando: include_once("classes/tbs_class.php");). Lo trovi su internet ed e' GRATUITA e con tanto di esempi e manuale.

    Cosa ti permette di fare questa classe? SEMPLICISSIMO: Evitare di MISCHIARE 2 programmi di linguaggi diversi (un misto di HTML CON CODICE PHP per intenderci), come nell'esempio riportato da Thedarkita (a cui va tutta la mia stima si intende). Cosi facendo hai un codice PIU' LEGGIBILE e se leggerai sui vari forum ti accorgerai che questa tecnica e' molto apprezzata da chi fa programmi anche ad un certo livello, perchè permette a chi sviluppa le procedure PHP di non occuparsi piu di tanto di quello che sara' l'HTML (e viceversa).

    Esempio pratico:
    nella pagina PHP scrivo: $nome = "Gianni"; e STOP!!!
    nella pagina HTML invece richiamo questa variabile in questo modo ad esempio : [var.nome] e sicuramente li verra' scritto Gianni. Dovrai aggiungere un pochino di codice PRIMA di richiamare la pagina HTML, ma ne vale a mio avviso davvero la pena.

    Sono anche convinto che quando leggerai ENTRAMBI I FILES (php e html) saranno MOOOOLTO più leggibili (e quindi avrai anche una MAGGIORE MANUTENZIONE).
    Perdici un pochino di tempo dammi retta.. e poi capirai che e' una strada OTTIMA da seguire, specialmente per persone che come me e come te (immagino) non sono CAMPIONI in php.

    Poi ti parlavo di SETTARE LA VARIABILE prima di andare nella parte HTML (ma intendevo appunto utilizzare questo mio metodo), in parole povere e' l'esempio che ti ha fatto Tigrone e Thedarkita (ma un po diverso dal mio).

    Però ho un po di confusione quando mi dici che hai 185 campi da analizzare! E allora ti consiglierei di dare uno sguardo anche a JAVASCRIPT che con una piccola routine (troverai esempi su questo argomento) fa il CONTROLLO DEI 185 CAMPI (ad esempio con un ciclo for/next per intenderci) . Quindi spendi tempo anche per questo e al limite ti diro' io come ho risolto alcune cose con Javascript.

    Dicevo inizialmente che mi ricordi i miei problemi di una volta.. infatti, dovevo verificare il CHECK di un checkbox, ma questo mi si riazzerava ogni volta e poi ho capito appunto, che era un discorso di VARIABILI RIAZZERATE (vedi l'IF che ti ha fatto come esempio Thedarkita).

    Poi dici che vorresti LASCIARE SELEZIONATE le caselle ed in questo caso ti consiglierei di studiarti CHECKBOX e l'opzione CHECKED. Ora a mio avviso ci sono DIVERSI MODI per risolvere il tutto, bisogna solo capire quale e' il metodo MIGLIORE nel tuo caso. Faccio un esempio cosi ci capiamo: nel mio caso mi perdevo la variabile $per_pagina che veniva settata in HTML da un menu a tendina (5-10-20-50 nominativi per pagina) ma una volta settata ritornava al valore di default (5). In questo caso ho utilizzato la SESSION ed ho risolto il problema, ma se capirai meglio il TEMPLATE ENGINE allora ti faro' altri esempi eventualmente.

    Facci sapere. CIAOOO


  • User Attivo

    @criccroc said:

    Poi ti parlavo di SETTARE LA VARIABILE prima di andare nella parte HTML (ma intendevo appunto utilizzare questo mio metodo), in parole povere e' l'esempio che ti ha fatto Tigrone e Thedarkita (ma un po diverso dal mio).

    Non proprio... io intendevo sfruttare semplicemente il tasto "indietro" del browser tramite javascript....
    Per quanto riguarda i 185 campi... visto che l'array $_POST è appunto un array, si può ciclare con un semplice foreach al posto di scrivere 185 righe di codice di controllo...

    Ad esempio qui: http://www.tigrone.altervista.org/form/form.html c'è un semplice form html

    
    <form method="post" action="script.php">
    1 <input name="campo1" /><br />
    2 <input name="campo2" /><br />
    3 <input name="campo3" /><br />
    4 <input name="campo4" /><br />
    5 <input name="campo5" /><br />
    <input type="submit" value="vai" />
    </form>
    
    

    E questo è lo script che riceve e controlla i dati:
    [php]
    <?php
    foreach($_POST as $k => $v)
    {
    if (trim($v)=="") exit ("$k non compilato! <a href="javascript:history.back()">Torna indietro</a>");
    }
    echo 'Tutti i campi sono stati compilati!';
    ?>
    [/php]
    Sono 3 righe di codice per controllare tutti i campi... ovviamente, inserendo delle istruzioni if all'interno del ciclo foreach, si possono controllare diversamente alcuni campi (campi numerici ecc...).

    Volendo scrivere qualche riga di codice in più... http://www.tigrone.altervista.org/form/form2.html

    Il form è lo stesso ma lo script è più completo:
    [php]
    <?php
    $errori=array();
    foreach($_POST as $k => $v)
    {
    if (trim($v)=="") $errori[]=$k;
    }
    if ($errori)
    {
    echo 'Non sono stati compilati i seguenti campi:<br /><br />';
    foreach($errori as $v)
    {
    echo $v.'<br />';
    }
    unset($errori);
    exit ('<br /><a href="javascript:history.back()">Torna indietro</a>');
    }
    echo 'Tutti i campi sono stati compilati!';
    ?>
    [/php]
    Una variante che stampa a video, in una volta sola, tutti i campi che non sono stati compilati...


  • User Attivo

    @criccroc: grazie per la dritta, durante l'estate andrò sicuramente a studiarmi TEMPLATE ENGINE perché sembra molto efficace e come hai ben capito col PHP ho iniziato solo due mesi fa! ^^
    @tigrone: il tuo esempio è utilissimo e me lo sono appuntato perché tornerà sicuramente utile in altre pagine del sito 🙂

    Volevo in questa situazione particolare procedere col metodo dei if... proposto da @Thedarkita; dopo aver visto quelli per il campo input:

    [PHP]<input name= "xxx" type= "text" maxlength= "4" size= "5" value="<?php if(isset($_POST['xxx'])) echo $_POST['xxx']; ?>"/> [/PHP]

    e quelli per il campo select:

    [PHP]<select name= "yyy">
    <option value="<?php if(isset($_POST['yyy'])) echo $_POST['yyy']; ?>"><?php if(isset($_POST['yyy'])) echo $_POST['yyy']; ?></option> <option value="no">no</option>
    <option value="si">sì</option>
    </select>[/PHP]

    stavo cercando con la stessa logica di venire a capo del campo checkbox. Il principio è sempre lo stesso: in un'unica pagina ci sono dei campi che vanno validati da un ciclo if, se la validazione va male e compare il messaggio di errore i dati precedentemente inseriti non devono andare persi: neppure la casella spuntata della checkbox. Io mi sono fermato qui (di default la casella NON deve essere spuntata):

    [PHP]<input type="checkbox" name="r02" id="r02" unchecked="checked" value="<?php if(isset($_POST['r02'])) echo ' checked="checked"'; ?>">[/PHP]

    Ma non va 😞


  • User Attivo

    [PHP]<input type="checkbox" name="r02" id="r02" unchecked="checked" value="<?php if(isset($_POST['r02'])) echo ' checked="checked"'; ?>">[/PHP]

    Con questo metodo nessuno sa come si fa? 😞


  • ModSenior

    Dovresti studiare un pò meglio il codice html, si tratta solo di usare gli attributi giusti al momento giusto:
    [php]
    <input type="checkbox" name="r02" id="r02" value="mio_valore" <?php if(isset($_POST['r02']) && $_POST['r02'] == 'mio_valore') echo ' checked="checked"'; ?> />
    [/php]


  • User

    Ciao nofcfro, so che sono un po CAPOCCIONE (come diciamo noi a Roma .. e non solo) ma torno a battere il tasto sul TEMPLATE ENGINE (qualcuno dira': GRRRRR), ma continuo proprio perchè vedendo gli esempi io personalmente divento pazzo 🙂 e non solo, ma sono anche CONVINTO che risolverà la maggior parte dei tuoi problemi.

    Leggiamo questo codice come da tuo esempio:

    [HTML]<input type="checkbox" name="r02" id="r02" value="mio_valore" <?php if(isset($_POST['r02']) && $_POST['r02'] == 'mio_valore') echo ' checked="checked"'; ?> />[/HTML]

    Non ti sembra che questa cosa sia un BEL PO ILLEGIBILE? Scusate, ma per me SI!!

    questa per me e' una pagina HTML perchè vedo che fa parte di un FORM, ma dentro c'e' codice PHP e questo a me personalmente MI TURBA ! eheheheh
    Sarebbe molto piu carino E LEGGIBILE questo tipo di codice :
    [HTML]<input type="checkbox" name="r02" id="r02" value="mio_valore" [var.checked]>[/HTML]

    Come vedi ho impostato una VARIABILE che può assumere in questo caso solo 2 valori:
    $checked = ''; (il checkbox non e' attivo) oppure
    $checked = 'checked="checked"'; e questa variabile cambia in base alle istruzioni in PHP (i tuoi famosi If(isset) etc...). Andremo a vedere ora anche come il PHP sara' più leggibile.

    Sappi che per ottenere questi risultati, non devi ASSOLUTAMENTE STRAVOLGERE il tuo programma, ma semplicemente aggiungere qualche riga in piu'.
    Andiamo a vedere dunque come SVILUPPARE questa parte di programma:

    [PHP]//PRIMA PARTE (questa parte va caricata IN TUTTI I FILES PHP che usano il TEMPLATE ENGINE)
    include_once("classes/tbs_class.php"); // Carico la classe TEMPLATE ENGINE che ho salvato nella cartella situata in root del mio sito chiamata CLASSES che dovrai scaricare da internet.

    //SECONDA PARTE (questa parte cambia in base a quello che devi fare nel programma)
    $checked = '';
    if(isset($_POST['r02']) && $_POST['r02'] == 'mio_valore') $checked = 'checked="checked"';

    //TERZA PARTE (questa parte va caricata per richiamare il file HTML:
    $template = "modulo_inserimento.html"; //il nome del file html che vuoi caricare
    $TBS = new clsTinyButStrong; //lascia cosi come vedi
    $TBS->NoErr = true; //lascia cosi come vedi
    $TBS->LoadTemplate("$template"); //carica il template
    $TBS->Render = TBS_OUTPUT; //lascia cosi come vedi
    $TBS->Show(); //lascia cosi come vedi[/PHP]

    Ora, se hai capito come funziona (la prima volta ti puo sembrare molto piu confuso), potrai utilizzare questa tecnica per fare TUTTO QUELLO CHE VUOI. Cambierà semplicemente la SECONDA PARTE per fare altro.
    In questo caso il file modulo_inserimento.html conterrà semplicemente codice HTML (senza codice PHP) come da esempio precedente.
    Ti faccio un ultimo semplicissimo esempio per capire come visualizzare le variabili in php con questo metodo:

    [PHP]
    include_once("classes/tbs_class.php");

    $nome= 'Mario';
    $cognome = 'Rossi';
    $indirizzo = 'via Verdi, 12';

    $template = "visualizza_utente.html";
    $TBS = new clsTinyButStrong;
    $TBS->NoErr = true;
    $TBS->LoadTemplate("$template");
    $TBS->Render = TBS_OUTPUT;
    $TBS->Show(); [/PHP]

    ed ora il file .html (visualizza_utente.html):
    [HTML]<div>
    Ciao [var.nome] [var.cognome], il tuo indirizzo è: [var.indirizzo]
    NON E' TUTTO PIU' CHIARO E LEGGIBILE? Buon divertimento!!!
    </div>[/HTML]


  • User Attivo

    Io non riesco a capire perchè le cose facili bisogna farle diventare difficili!
    Qui si sta cercando solo di complicarsi la vita inutilmente... :arrabbiato: