Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Riempimento form da DB

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    53

    Riempimento form da DB

    Ciao a tutti!

    Probabile che i miei 2 problemi si siano presentati già piu' volte, ma facendo una ricerca nel forum non ho trovato niente...
    Magari qualcuno puo' reindirizzarmi al 3d giusto o a qualche altro sito...

    1) Devo prendere dei dati (cognome, nome, cell e altri) da un DB (uso PHP per questo) e vorrei che nel riempire i campi text ci fosse una sorta di facilitazione nell'inserimento. Ossia se scrivo "Ro" nel campo cognome e c'e' un Rossi Mario con Telefono 320100000 mi suggerisca questi dati negli altri campi ed io possa confermare che quello che vedo è corretto premendo TAB (oppure se ci fosse anche un Rossi Luca potrei voler passare al campo nome, premere L ed avere automaticamente il nome Luca oltre al telefono e agli altri dati di questo utente)... Io ho relizzato un completamento automatico in JS ma solo per i campi Cognome e Nome che vengono estratti dal DB e messi su un 2 diversi array col risultato che i nomi ed i cognomi sono 2 insiemi "disgiunti" (quindi se uno inserisce Rossi Stefano perchè magari c'e' un'altra persona il cui nome è stefano non ottengo alcun avviso in questo senso). Insomma non so come "spalmare" un record su piu' textfields...
    Nota: Questa applicazione non è per funzionare su un server remoto quindi per ora anche se avro' molte persone nel DB non mi preoccupo dei tempi relativi al caricamento delle pagine...

    2) Questo è più facile credo: Se scrivo qualcosa in un textfield vorrei che questo valore fosse copiato in altri campi automaticamente...


    Vi ringrazio in anticipo (come al solito)!
    A presto!

    -----------------
    Federico - www.cyranonline.net

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Per il primo problema c'e` stato qualche intervento, ma per campi di tipo select.
    Per i text, da un lato potrebbe essere piu` semplice (avendo il database in una matrice sul client), ma forse non ci sono thread che lo trattano.

    Magari posta alcuni elementi in piu`, tipo la struttura della matrice e i due campi testo.

    ---
    Per il sercondo problema non hai cercato bene: ci sono molti interventi.
    <input type="text" ... onchange="this.form.NOMEALTROCAMPO.value = this.value;">

    dove NOMEALTROCAMPO e` di tipo text, hidden o textarea.
    Al posto di onchange puoi usare anche onkeyup.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    53
    Originariamente inviato da Mich_
    Magari posta alcuni elementi in piu`, tipo la struttura della matrice e i due campi testo.
    Ciao! Intanto grazie per la risposta!
    Allora.. A questo punto entro un po' piu' nel dettaglio...
    In pratica un record diciamo che contiene questi campi (poi alla fine quelli che voglio lo decido quando faccio la query sql): nome, cognome, gruppo (anche questo contiene stringhe), telefono, orariofine (è un datetime), benefici (è praticamente un bool). Io associo i dati al form in questo modo:

    nome,cognome,telefono vanno su text
    gruppo va in una select (c'è un controllo sul valore del db per decidere se è selected o meno) perche' nel caso in cui la persona non sia gia' nel DB l'operatore deve poter scegliere il gruppo rapidamente.
    orariofine viene diviso in ora - minuti (che vanno su 2 text) e giorno - mese - anno che invece sono su 3 select distinte.
    benefici è associato ad una checkbox che e' spuntata se il valore nel DB==1

    Ora, senza impazzire con tutti questi campi, mi basterebbe capire anche semplicemente come fare a fare questo lavoro:
    "presa la seguente tupla:
    <Rossi Mario 3281234567 Gruppo A> (lasciamo perdere orafine ecc tanto capito il meccanismo dovrei cavarmela da solo spero! )vorrei che quando uno inizia a digitare Ro in cognome il sistema suggerisse i dati della tupla negli opportuni campi".
    E' possibile una cosa del genere?
    Siccome temo di essere stato poco chiaro ho messo online un fac-simile del form, anche se ovviamente la pagina originale è in php ed in questo fac simile i nomi dei campi sono messi proprio a caso...

    http://www.bukowski-show.it/facsimileform.html
    ---
    Per il sercondo problema non hai cercato bene: ci sono molti interventi.
    <input type="text" ... onchange="this.form.NOMEALTROCAMPO.value = this.value;">
    dove NOMEALTROCAMPO e` di tipo text, hidden o textarea.
    Al posto di onchange puoi usare anche onkeyup. [/QUOTE]

    I campi da copiare sono tutti i campi ora_fine e min_fine che vedi nel facsimile. mi conviene fare una funzione di questo tipo:

    this.form.ora_fine_autista.value = this.value;
    this.form.ora_fine_navig.value = this.value;
    ecc

    e poi richiamarla nel onchange no?

    Grazie ancora per la disponibilita'! spero di non stressarti!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Manca ancora la struttura del database sul client.

    Per fare tutto lato client (con JS), il database DEVE essere tutto riportato sul client. Il browser non e` in grado di andare a leggere info dal server.

    Ad esempio potresti avere una cosa del genere:
    var persone = new Array();
    persone[persone.length] = new Array("Rossi", "Mariano", "Gruppo A" "0123 456789", 1, ..... );
    persone[persone.length] = new Array("Rossi", "Mario", "Gruppo A" "0123 456987", 1, ..... );

    Questa e` la sintassi che deve arrivare al client; come programmare il server perche` arrivi questo e` un problema del programma lato server (e DB). Nota che i campi alfabetici devono essere racchiusi da apici o virgolette, i campi numerici no. I campi datetime non esistono in JS (sono del tuo database), per cui conviene vedere come scriverli, ma questo e` un problema diverso (che eventualmente affrontiamo in seguito).

    Se l'ordine e` gia` alfabetico, la cosa e` piu` semplice, altrimenti occorre ordinare alfabeticamente (per accelerare la ricerca).

    Poi in ogni campo ci dovra` essere una chiamata ad una funzione ad ogni onkeyup:
    <input type="text" name="XXXYYY" onkeyup="completa(this);">
    I nomi che hai dato ai vari campi vanno quasi bene, ma per far fuznionare la meglio lo script deve esserci una parte che individua esattamente la riga ed una la colonna.
    Quindi "cogn_navig" mi va bene, mentre "tel_autista2" non mi piace (autista2 non individua una riga).

    Anche ora_fine_autista potrebbe dare problemi: preferirei oraFine_autista. In questo modo poi individuo la riga e la colonna con sicurezza solo facendo uno .split(/_/);

    Nota che devi usare onkeyup, non onkeupress: l'up scatta dopo che il carattere e` stato premuto e salvato, il press dipende dal browser

    ... alla prossima puntata ... intanto vedi se queste considerazioni ti possono andare

    ---
    Per la copia, ora ho capito: vuoi copiare un dato in tutti i campi uguali. Allora va bene fare una funzione; pero` anche questo lo farei dopo.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    53
    Ri-Ciao!

    Allora, innanzi tutto ho ristemato il codice del form (che avevo scritto al volo dato che il codice originale è tutto PHP ed era un casino pulirlo.. Ho copiato direttamente l'html generato) ed è sempre sul link di prima.

    Poi, per generare l'array dinamico ho scritto questo codice:

    codice:
    require_once('../Connections/connessioneDB.php'); 
    require_once('estrai_datetime.php'); 
    
    mysql_select_db($database_connessioneDB, $connessioneDB);
    $query_tutti_dati_volontari = "SELECT * FROM volontari V, gruppi G WHERE V.GruppoID=G.GruppoID ORDER BY Cognome ASC";
    $tutti_dati_volontari = mysql_query($query_tutti_dati_volontari, $connessioneDB) or die(mysql_error());
    $row_tutti_dati_volontari = mysql_fetch_assoc($tutti_dati_volontari);
    $totalRows_tutti_dati_volontari = mysql_num_rows($tutti_dati_volontari);
    
    
    echo "<SCRIPT language=\"JavaScript\">
    var persone = new Array();\n";
    do 
    {
    echo "persone[persone.length] = new Array(";
    echo '"'.$row_tutti_dati_volontari['Cognome'].'",';  
    echo '"'.$row_tutti_dati_volontari['Nome'].'",';  
    echo '"'.$row_tutti_dati_volontari['Gruppo'].'",';  
    echo '"'.$row_tutti_dati_volontari['Telefono'].'",';  
    
        $data = $row_tutti_dati_volontari['FineDisp'];  
    	$gg = estrai_gg ($data);
    	$mm = estrai_mm ($data);
    	$aa = estrai_aa ($data);
    	$min = estrai_min ($data);
    	$ora = estrai_ora ($data);
    
    echo "\"$gg\",\"$mm\",\"$aa\",\"$min\",\"$ora\",";	
    echo $row_tutti_dati_volontari['BeneficiDiLegge']."); \n"; 
    }
    while ($row_tutti_dati_volontari = mysql_fetch_assoc($tutti_dati_volontari)) ;
    echo "</SCRIPT>";
    
    mysql_free_result($tutti_dati_volontari);
    
    ?>
    ovviamente estrai_gg ecc sono funzioni che ho scritto per estrarre giorno mese anno ecc da un datetime. Li ho messi come stringa in JS perchè tanto si tratta di lavorare con delle stringhe no?

    Ho visto che il codice funziona e mi produce un output del genere:
    codice:
    <SCRIPT language=JavaScript>
    var persone = new Array();
    persone[persone.length] = new Array("carloni","federico","Roma Nord","3288789895","","","","","",0); 
    persone[persone.length] = new Array("De Luca","Marina","Anguillara","3402588954","","","","","",0); 
    persone[persone.length] = new Array("petriachi","valerio","Roma Sud","32012345","20","03","2006","14","12",1); 
    persone[persone.length] = new Array("rossi","mario","Roma Sud","3288888888","","","","","",1); 
    </SCRIPT>
    Come vedi alcune date sono null, il che accadra' spesso.

    A questo punto la domanda sorge spontanea: come fare l'autocompletamento su un'intera riga? Come avrai capito la mia competenza JS e' pressoche' nulla, mentre lato server me la cavicchio..

    A presto ciao!

    PS: ovviamente ancora grazie 1000000!

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ok, perfetto. Vedo che mi stai seguendo (e` una buona cosa, che non succede sempre in questo forum).
    Vedo anche che con la programmazine te la cavi, ma non consci JS. Allora ti lascio un reference, che io trovo molto utile: http://www.devguru.com/technologies/...ipt_index.html .

    Spero che quelli non siano numeri di telefono reali: non si devono pubblicare al mondo. Potrebbero restare vittima di spammatori telefonici o SMS (per entrare nel forum non e` necessario registrarsi).

    Per le date null (stringhe vuote) non ci sono problemi.
    Quindi qui consideriamo le date come stringhe. Si possono anche trasformare in oggetto Date(), ma solo se necessario.
    Invece mi chiedo perche` fai tre campi: non starebbe meglio un campo unico del tipo 24.02.2005 oppure 24/02/2005 o sim? Se serve ci sono le istruzioni per spezzare. Ma questo e` un problema secondario.

    Tieni presente che io non conosco PHP (lato server lavoro in Perl); comunque per i problemi JS tutto quel codice PHP crea confusione e non serve (sul client non arriva).

    Torniamo alla routine di completamento.



    Ma prima dovresti rispondermi sui nomi dei campi: e` ragionevole (dal punto di vista del server) avere i nomi formati da due parti una (sempre la stessa) per la riga ed una per la colonna? Perche` questo semplifica lo script sul client.

    Inizio ad impostare la routine:
    codice:
    var row_prec="", col_prec="";    // valori precedenti
    var pos_mat = 0;                 // posizione nella matrice
    var cont_prec="";                // contenuto precedente
    var cont_digit = '';             // contenuto digitato
    
    function completa(ogg) {
      var rc = ogg.name.split(/_/);    // decodifica riga e col
      var row = rc[1];
      var col = rc[0];
      var cont = ogg.value;
      alert("riga:"+row+"  colonna:"+col);
    
      if(row != row_prec) { // riga diversa: azzera i puntatori
        cont_prec = "";
        pos_mat = 0;
      }
    
      var agg = substr(cont, cont.length-1); // carattere aggiunto
      cont_digit += agg;
    
    switch (col) {
      case 'cognome':
        while(persone[pos_mat][0].indexOf(cont_digit) < 0) {
          pos_mat++;
        }
        if(pos_mat > persone.length) {
          alert("non nell'elenco")
          return false;
        }
        ogg.form.elements("cognome_"+row).value = persone[pos_mat][0];
        ogg.form.elements("nome_"+row).value = persone[pos_mat][1];
        //.....
      break;
    
      case 'nome':
        //qualcos di simile
      break;
      // ecc
    }
    E` solo una bozza. Ma credo che puoi iniziare a lavorarci. Cerca di capire la struttura, controlla se ho fatto errori e prova ad implementare la ricerca solo per cognome.

    Naturalmente una parte di quanto ho scritto dentro lo switch andra` messo in una funzione a parte (si ripete molto simile per tutti/molti campi).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    53
    ciao di nuovo!
    Allora, ho risitemato il codice anche aiutandomi con l'ottimo reference che hai linkato ed è uscito quanto riporto in basso. Ho lavorato solo per il campo cogn visto che alla fine non funziona. Ho commentato il codice sia per aver conferma se ho capito quello che fa il programma sia per scrivere dubbi su alcune cose.
    Come da te suggerito ho lasciato perdere la parte PHP tanto una volta che i dati arrivano sul client nella forma da noi voluta il lato server non c'interessa piu'...

    codice:
    <html>
    <head>
    <title>xxx</title>
    <SCRIPT language=JavaScript>
    var persone = new Array();
    persone[persone.length] = new Array("cxxxxxxxx","federico","Roma Nord","328xxxxxxx","","","","","",0); 
    persone[persone.length] = new Array("De xxxx","Marina","Anguillara","340xxxxxxx","","","","","",0); 
    persone[persone.length] = new Array("pxxxxxxxx","valerio","Roma Sud","320xxxxxxx","20","03","2006","14","12",1); 
    persone[persone.length] = new Array("rossi","mario","Roma Sud","328xxxxxxx","","","","","",1); 
    
    
    var row_prec="", col_prec="";    // valori precedenti
    var pos_mat = 0;                 // posizione nella matrice
    var cont_prec="";                // contenuto precedente
    var cont_digit = '';             // contenuto digitato
    
    function completa(ogg) 
    {
      var rc = ogg.name.split(/_/);    // decodifica riga e col - Es: cogn autista
      var row = rc[1]; //ES: autista
      var col = rc[0]; //ES: cogn
      var cont = ogg.value; //ES: carloni
      //alert("riga: "+row+"  colonna: "+col); //stampa un promemoria della colonna che sta scandendo ES: autista cogn
    
      if(row != row_prec) // riga diversa: azzera i puntatori
      { 
        cont_prec = "";
        pos_mat = 0;
      }
    
    //Qui mi da' errore: per come è stato definito, cont è un'oggetto? L'errore è "Previsto oggetto"
    
      var agg = substr(cont, cont.length-1); // carattere aggiunto - Estrae i caratteri di ciò che è scritto nel textfield..
      cont_digit += agg; //..e li mette in cont_digit. ES: Scrivo "c" e cont_digit diventa "c", scrivo poi "a" e cont_digit="ca" ecc.
    
     switch (col) //NOTA: LA matrice. Diciamo: persone[record][campo] 
     {
       case 'cogn':
        while(persone[pos_mat][0].indexOf(cont_digit) < 0) 
    	//Scandisco la matrice sulla colonna relativa al cognome. Parto dalla prima riga e finchè non c'e' un matching tra le lettere
    	//digitate dall'utente nel textfield e quello che è scritto nella matrice, passo alla riga successiva
    	{
          pos_mat++;
        }
          if(pos_mat > persone.length) 
    	  {
          alert("non nell'elenco")//Se arrivo alla fine dell'array ovviamente sta digitando i dati di una persona ancora non registrata nel DB
    
          return false;
          }
    	  //SE invece riscontra un matching del 100% compila gli altri campi del form con i dati della riga in esame.
    	ogg.form.elements("cogn_"+row).value = persone[pos_mat][0];
        ogg.form.elements("nome_"+row).value = persone[pos_mat][1];
    	ogg.form.elements("gruppo_"+row).value = persone[pos_mat][2];//Attenzione: e' una select!
    	ogg.form.elements("tel_"+row).value = persone[pos_mat][3];
    	ogg.form.elements("ggFine_"+row).value = persone[pos_mat][4];
    	ogg.form.elements("mmFine_"+row).value = persone[pos_mat][5];
    	ogg.form.elements("aaFine_"+row).value = persone[pos_mat][6];
    	ogg.form.elements("oraFine_"+row).value = persone[pos_mat][7];
    	ogg.form.elements("minFine_"+row).value = persone[pos_mat][8];
    	if ( persone[pos_mat][9]==1 ) 
    	 ogg.form.elements("benefici_"+row).value = "checked";// Funziona così?
       
         break;
    
       case 'nome':
        //qualcos di simile
        break;
       // ecc
     }//chiude switch
    }//chiude function
    </SCRIPT>
    Il form ha un codice piu' lungo e riporto sotto solo quello relativo all'autista...
    Non sapendo bene come funziona JS, non so se quando scrivo ogg.form.elements("gruppo_"+row).value = persone[pos_mat][2]; vada bene dal momento che i values di gruppo sono numeri mentre in persone ho riportato i nomi per esteso (ovviamente eventualmente la conversione è molto rapida). Idem per mmFine_ (values numerici ed etichette in stringhe)...
    Il file completo è su www.bukowski-show.it/autocompletamento2.htm


    codice:
    <META content="MSHTML 6.00.2800.1106" name=GENERATOR></head>
    
    <body>
    <table width="95%" border="1">
      <tr> 
        <td width="10%"><h3>Ruolo</h3></td>
        <td width="11%"><h3>Cognome</h3></td>
        <td width="11%"><h3>Nome</h3></td>
        <td width="12%"><h3>Gruppo</h3></td>
        <td width="11%"><h3>Telefono</h3></td>
        <td width="18%"><h3>Fine</h3></td>
        <td width="11%"><h3>Benefici</h3></td>
      </tr>
      <tr> 
        <td> <h4>Autista</h4></td>
        <td><input name="cogn_autista" type="text" id="cogn_autista"   value="" size="15" onkeyup="completa(this);" ></td>
        <td><input name="nome_autista" type="text" id="nome_autista" value="" size="15" onkeyup="completa(this);"> </td>
        <td><select name="gruppo_autista">
           <option value=""></option><option value="5">Anguillara</option>
    <option value="4">Civitavecchia</option><option value="8">corleone</option><option value="3">Ramazzini</option>
    <option value="1">Roma Nord</option>
    <option value="2">Roma Sud</option><option value="7">Viterbo</option></select></td>
        <td><input name="tel_autista" type="text" value="" size="13" onkeyup="completa(this);" ></td>
        <td> <h4> 
            <input name="oraFine_autista" type="text" size="2" maxlength="2" value="" onkeyup="completa(this);" >
            : 
            <input name="minFine_autista" type="text" size="2" maxlength="2" value="" onkeyup="completa(this);" >
            del
    
            <select name="ggFine_autista" id="ggFine_autista">
              <option value="01">01</option><option value="02">02</option>
    <option value="03">03</option>
    <option value="04">04</option>
    <option value="05">05</option>
    <option value="06">06</option>
    <option value="07">07</option>
    <option value="08">08</option>
    <option value="09">09</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
    <option value="13">13</option>
    <option value="14">14</option>
    <option value="15">15</option>
    <option value="16">16</option>
    <option value="17">17</option>
    <option value="18">18</option>
    <option value="19">19</option>
    <option value="20">20</option>
    <option value="21">21</option>
    <option value="22">22</option>
    <option value="23">23</option>
    <option value="24">24</option>
    <option value="25">25</option>
    <option value="26">26</option>
    <option value="27">27</option>
    <option value="28">28</option>
    <option value="29">29</option>
    <option value="30">30</option>
    <option value="31">31</option> 
    </select>
            <select name="mmFine_autista" id="mmFine_autista">
              <option value="01">Gen</option><option value="02"SELECTED>Feb</option>
    <option value="03">Mar</option>
    <option value="04">Apr</option>
    <option value="05">Mag</option>
    <option value="06">Giu</option>
    <option value="07">Lug</option>
    <option value="08">Ago</option>
    <option value="09">Set</option>
    <option value="10">Ott</option>
    <option value="11">Nov</option>
    <option value="12">Dic</option>      
    </select>
           <select name="aaFine_autista" id="aaFine_autista">
             <option value="2005"SELECTED>2005</option>
    <option value="2006">2006</option>
    <option value="2007">2007</option>
    <option value="2008">2008</option>
    <option value="2009">2009</option>
    <option value="2010">2010</option>       
     </select>
          </h4></td>
        <td><div align="center">
            
              
            <input name="benefici_autista" type="checkbox"  value="1" onkeyup="completa(this);"  ></div> 
    	</td>
      </tr>
     </table> 
    </body>
    </html>
    Spero che riuscirai a scovare l'errore!

    Grazio ancora, stavolta 10^10!

    PS: Tranquillo, i cell sono fasulli, almeno spero!

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Allora. Ora ho un po' di fretta, magari pom torno a guardarci.

    Mi pare che hai capito.

    cont e` una variabile che contiene una stringa. Non cpaisco il "previsto oggetto".

    Sei sicuro che l'errore lo da` su quella riga? Tieni presente che il browser non vede il sorgente PHP, vede solo quello che gli arriva e conta le righe del fiel arrivato.

    Puoi inserire altri alert, per vedere come procede il programma (io ti ho messo un esempio, che tu hai interpretato correttamente e poi opportunamente commentato).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    53
    ciao! per ora ho eliminato completamente il codice php quindi l'errore dovrebbe essere per forza a riga 32...

    :master:

    a dopo!
    ciao

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Ho trovato: sbagliato sintassi.
    Il substr e` metodo di stringa, non funzione. La sintassi e`:
    var agg = cont.substr(cont.length-1);

    [ho fatto confusione con altri linguaggi, che ultimamente ho usato]

    Se ancora non funziona, occorre verificare cosa contiene la variabile cont quando arriva li`:
    Quindi prima della riga prova a metterci:
    alert("test1 - cont="+cont+" lung.="+cont.length);
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.