Visualizzazione risultati 1 fino 16 di 16

Discussione: update form

  1. #1
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Red face update form

    Salve a tutti.
    Per aggiornare un db metto a disposizione dell'utente un form da completare.
    Ovviamente l'utente inserisce o corregge, solo i campi utili, lasciando gli altri vuoti.
    Fin qui va tutto bene, il problema viene dopo.

    Con il comando update vado ad aggiornare il db, però i campi lasciati vuoti, nel db vengono cancellati.
    Invece vorrei che fossero semplicemente ignorati e non mi cancellasse i valori già presenti.
    Dev'essere un aggiornamento di dati, non un inserimento da zero. Come potrei fare ?

    I campi che devo verificare sono:
    Codice PHP:
    $cognome = htmlspecialchars ($_POST['cognome'], ENT_QUOTES);
    $nome =htmlspecialchars ($_POST['nome'], ENT_QUOTES);
    $tipoDoc = htmlspecialchars ($_POST['tipoDoc'], ENT_QUOTES);
    $nDoc = htmlspecialchars ($_POST['nDoc'], ENT_QUOTES);
    $rilasciato = htmlspecialchars ($_POST['rilasciato'], ENT_QUOTES);
    $da = htmlspecialchars ($_POST['da'], ENT_QUOTES);
    $luogo = htmlspecialchars ($_POST['luogo'], ENT_QUOTES);
    Grazie mille a tutti

  2. #2
    Guest

    Predefinito

    Maaaaa, teoricamente se è un form di Update non dovresti lasciare i campi vuoti, ovvero, se ho un form con le mie generalita (Luca Neri), e un giorno cambio il nome, da Luca a Andrea, sulla form comunque sul cognome ci sarà sempre il mio cognome (Neri) e non campo vuoto.

    Comunque per risolvere la cosa dei campi vuoti devi verificare che effettivamente ci sia qualcosa dentro la variaible, e poi componi la query, tipo:

    Codice PHP:


    $query
    = "";

    $cognome = htmlspecialchars ($_POST['cognome'], ENT_QUOTES);
    $nome =htmlspecialchars ($_POST['nome'], ENT_QUOTES);
    $tipoDoc = htmlspecialchars ($_POST['tipoDoc'], ENT_QUOTES);

    // controllo se effetivamente dentro le varibili ci sono almeno 2 caratteri
    if(strlen($cognome) > 2) {
    $query .= "cognome='".$cognome."', ";
    }
    if(
    strlen($nome) > 2) {
    $query .= "nome='".$nome."', ";
    }

    if(
    strlen($tipoDoc) > 2) {
    $query .= "tipoDoc='".$tipoDoc."', ";
    }

    // Tolgo l'ultimo spazio e la virgola dalla variabile $query
    $query = substr($query, 0, -2);


    //eseguo la query
    mysql_query("UPDATE {mia_tabella} SET ".$query." WHERE {condizione}");
    Ps, prova a rifare come esercizio la stessa cosa con un array al posto di una variabile/stringa, che viene esteticamente meglio, poi alla fine fai un foreach e componi la query li, se hai problemi posta pure sotto, che ora son di fretta ma una mano non si nega a nessuno :P
    Ultima modifica di pxy : 19-08-2014 alle ore 18.22.32

  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,650

    Predefinito

    Il modo più semplice penso sia quello di fare una query di SELECT, immettendo tutti i dati "vecchi" dentro le variabili $cognome, $nome, ....

    Poi, se empty(!$_POST[<campo>]), sostutuisci alla variabile $<campo> il nuovo valore, quindi vai la update di tutti i campi della riga.

    Il modo più efficiente, invece, penso sia quello di fare una unica query "dinamica", impostando solo i campi che l'utente ha immesso, del tipo:

    Codice PHP:
    <?php

    $query
    = 'UPDATE tabella SET ';

    foreach(
    $_POST as $campo=>$valore)
    {
    if(!empty(
    $valore))
    {
    if(
    $query != 'UPDATE tabella SET ') //se non siamo al primo giro, metto la virgola tra gli elementi
    $query .= ',';
    $query .= $campo.'='.$valore;
    }
    }
    ?>
    Ovviamente quest'ultimo è soltanto un esempio per far capire un minimo e non utilizzabile direttamente, ad esempio perché se ci sono altri campi in $_POST, la query specificherebbe campi che non esistono nella tabella. Inoltre i campi del database devono chiamarsi come quelli del form, etc...

    EDIT: ops anticipato

    Ciao!
    Ultima modifica di alemoppo : 19-08-2014 alle ore 18.22.06

  4. #4
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Grazie ad entrambi.
    Mi piace molto l'esempio della query dinamica.
    Però non ho capito come utilizzarla.
    Dal form ricevo questi 7 possibili valori: cognome, nome, tipoDoc, nDoc, rilasciato, da, luogo.

    La necessità viene dal fatto che un dato può essere stato inserito in precedenza sbagliato o può mancarne qualcuno.
    Questo per spiegarmi meglio anche con pxy, sul perchè ho bisogno di aggiornare solo alcuni campi.
    Se potessi usare UPDATE per tutti i campi non avrei questo problema.
    Al contrario è innutile che debba rifare digitare tutti i campi se già presenti.
    Se supponiamo dovessi correggere solo un nome (es. da Mara a Maria) perchè devo anche reinserire tutti gli altri dati che magari vanno già bene ?
    Purtroppo non posso sapere a priori quali e quanti campi saranno modificati. Cioè non so quale sia il valore eventualmente da correggere o da aggiungere. Per questo imposto un form di aggiornamento con tutti i campi del db. L'utente poi riempirà solo quelli che eventualmente servono.
    Tornando al discorso della query dinamica, potresti spiegarmela meglio.
    Dal form prelevo ad esempio il cognome, così:
    $cognome = htmlspecialchars ($_POST['cognome'], ENT_QUOTES);
    Come vedi assegno alla variabile $cognome il valore dal $_POST['cognome'], incorporando eventuali caratteri speciali.
    Però poi mi sono perso. Non ho capito come posso andare avanti.
    Grazie ancora a entrambi per l'aiuto.

  5. #5
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,650

    Predefinito

    la htmlspecialchars() puoi applicarla direttamente dentro al foeach:
    Codice PHP:
    $query = 'UPDATE tabella SET ';

    foreach(
    $_POST as $campo=>$valore)
    {
    if(!empty(
    $valore))
    {
    if(
    $query != 'UPDATE tabella SET ') //se non siamo al primo giro, metto la virgola tra gli elementi
    $query .= ',';
    $query .= $campo.'='.htmlspecialchars($valore, ENT_QUOTES);
    }
    }
    Quelle variabili intermedie ($cognome, etc) sono inutili.

    Comunuqe:

    Purtroppo non posso sapere a priori quali e quanti campi saranno modificati. Cioè non so quale sia il valore eventualmente da correggere o da aggiungere. Per questo imposto un form di aggiornamento con tutti i campi del db. L'utente poi riempirà solo quelli che eventualmente servono.
    Quando presenti il form all'utente, è bene che nei vari input ci siano i valori "vecchi", e che i campi non siano vuoti (altrimenti l'utente potrebbe pensare che quei campi siano realmente vuoti, e quindi li reimmetterebbe).
    Quindi probabilmente la cosa più semplice è quella di scrivere i vari input con i dati vecchi, poi l'utente li modifica e quindi fare una UPDATE di tutti i campi.
    Perché ri-aggiornare tutti i dati se ad esempio devo cambiare solo il nome?
    Perché in quest'ultimo caso è impossibile sapere quali sono i dati da cambiare o quali no (l'unico caso in cui si può sapere è se fai come dicevamo prima, ovvero che tutti gli input hanno i valori vuoti e non con i vecchi valori). Quindi non ti rimane altro che ri-aggiornare tutti i dati.... o almeno, potresti prima di fare la update guardare i dati vecchi con una SELECT, ma capisci che lo script si complica e inoltre fai una query in più inutilmente...

    Ciao!
    Ultima modifica di alemoppo : 19-08-2014 alle ore 22.44.47

  6. #6
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Sei molto gentile, ma non ci riesco. Ho provato così:
    Codice PHP:
    $query = 'UPDATE SalaStudio SET' ;
    foreach(
    $_POST as $cognome=>'cognome')
    {
    if(!empty(
    cognome))
    {
    if(
    $query != 'UPDATE SalaStudio SET ')
    $query .= ',';
    $query .= $cognome.'='.htmlspecialchars ('cognome', ENT_QUOTES);
    }
    }
    Però mi da syntax error, unexpected T_CONSTANT_ENCAPSED_STRING alla riga del foreach
    Abbi pazienza. E grazie ancora

  7. #7
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,650

    Predefinito

    Perché:
    Codice PHP:
    $cognome=>'cognome'
    ?

    Lascia le variabili che ho messo io, dovrebbe funzionare a occhio (non ho provato).

    Ciao!

  8. #8
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Perchè nella variabile $cognome metto il valore arrivato tramite POST del cognome.
    Cioè per un update senza condizioni così sarebbe stato giusto:
    Codice PHP:
    $query = "UPDATE SalaStudio SET cognome='$cognome', nome='$nome' ... ecc.
    Allora ho provato anche così:
    Codice PHP:
    $query = 'UPDATE SalaStudio SET' ;
    foreach(
    $_POST as $cognome=>$valore)
    {
    if(!empty(
    $valore))
    {
    if(
    $query != 'UPDATE SalaStudio SET ')
    $query .= ',';
    $query .= $cognome.'='.htmlspecialchars ($valore, ENT_QUOTES);
    }
    }
    Adesso non mi da errore, ma non modifica nemmeno il db.
    Ciao e grazie ancora

  9. #9
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,650

    Predefinito

    Effettivamente c'erano alcune imperfezioni:
    Codice PHP:
    $query = 'UPDATE SalaStudio SET ' ;
    foreach(
    $_POST as $cognome=>$valore)
    {
    if(!empty(
    $valore))
    {
    if(
    $query != 'UPDATE SalaStudio SET ')

    $query .= $cognome.'=\''.htmlspecialchars ($valore, ENT_QUOTES).'\'';
    }
    }
    La strada degli input "precompilati" non ti piace?

    Ciao!
    Ultima modifica di alemoppo : 20-08-2014 alle ore 11.58.18

  10. #10
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    In effetti i campi precompilati forse andrebbero ancora meglio, ma come li realizzo ?
    Non sono molto esperto.
    Immagino che nel form compariranno i dati già presenti nel db, facilitando così anche la modifica.
    Con UPDATE si andrà poi a sovrascrivere tutti i dati, ma a questo punto non ci saranno buchi pericolosi.
    Ma come si costruisce ?

    Grazie

  11. #11
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,650

    Predefinito

    Semplicemente, prima recuperi i dati con una SELECT, poi stampi il form con i valori e quando l'utente effettua l'invio del form, esegui la UPDATE:

    Codice PHP:
    <?php
    /*
    UPDATE
    */
    if(isset($_POST['aggiorna'])) //se ci son dei dati da aggiornare, si esegue la UPDATE
    {
    #query update di tutti i campi
    }


    /*
    SELECT
    ($nome, $cognome, $data....)
    */

    //---
    ?>
    <form ...>
    ...
    Nome: <input type="text" name="nome" value="<?= $nome ?>"><br>
    Cognome: <input type="text" name="cognome" value="<?= $cognome ?>"><br>
    Data: <input type="text" name="nome" value="<?= $data ?>"><br>
    ...
    <input type="submit" name="aggiorna">
    </form>
    Ciao!
    Ultima modifica di alemoppo : 20-08-2014 alle ore 16.29.54

  12. #12
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Grazie mille. Ho fatto come mi hai suggerito e come sistema mi sembra molto più comodo, però non mi funziona.
    Cioè, mi carica tutti i dati dalla SELECT, nel form correttamente. Quindi fino qui va bene, ma dopo aver scritto e dando l'INVIO dal bottone submit, non si aggiorna il db. Probabilmente sbaglio nell'impostare il form, con il method e l'action.

    Sotto posto il codice scritto.

    Codice PHP:
    /*
    UPDATE
    */
    if(isset($_POST['aggiorna'])) //se ci son dei dati da aggiornare, si esegue la UPDATE di tutti i campi
    {
    $query = "UPDATE SalaStudio SET cognome='$cognome', nome='$nome',tipoDoc='$tipoDoc',nDoc='$nDoc',rilasciato='$rilasciato',da='$da',luogo='$luogo' WHERE id_SalaStudio = '$id' ";
    }

    $query = mysql_query("SELECT * FROM SalaStudio WHERE id_SalaStudio = '$id'"); // mi carica solo i dati di una determinata riga
    $row = mysql_fetch_assoc($query);

    echo
    '

    <form method="post" action="modifica.php">
    <tr>
    <td style="border-color: #1e13b4; border-width: 1px; border-bottom: solid;" >'
    . $row['id_SalaStudio'].'</td>
    <td > <input type="text" name="cognome" value='
    . $row['cognome'] . '></td>
    <td > <input type="text" name="cognome" value='
    . $row['nome'] . '></td>
    <td > <input type="text" name="cognome" value='
    . $row['tipoDoc'] . '></td>
    <td > <input type="text" name="cognome" value='
    . $row['nDoc'] . '></td>
    <td > <input type="text" name="cognome" value='
    . $row['rilasciato'] . '></td>
    <td > <input type="text" name="cognome" value='
    . $row['da'] . '></td>
    <td > <input type="text" name="cognome" value='
    . $row['luogo'] . '></td>
    </tr> '
    ;
    }
    echo
    '</table>
    <input type="submit" name="aggiorna">
    </form>
    Ultima modifica di portier : 20-08-2014 alle ore 18.05.10

  13. #13
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,650

    Predefinito

    Devi ricavare $cognome, $nome, etc da $_POST['cognome'], $_POST['nome'], etc...
    Ti serve inoltre conoscere l'id della riga, ovvero (id_SalaStudio). Puoi fare un campo nascosto nel form (type="hidden") scrivendoci l'id.

    Se è la prima volta che apri la pagina (e quindi non hai alcun id), come inizializzi $id della select?

    Inoltre occhio che tutti i name degli input si chiamano "cognome".

    Ciao!
    Ultima modifica di alemoppo : 20-08-2014 alle ore 18.51.13

  14. #14
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Grazie dei preziosi suggerimenti.
    Infatti avevo ricopiato sempre la prima riga per questo i name degli input erano tutti "cognome".

    Per il resto è già a posto, nel senso che l'id della riga la ricavo prima e il form lo riempio dei dati senza problemi.
    Quindi il form riesco ad averlo già precompilato. Quello che non funziona e il passaggio dopo.
    Cioè non riesco a salvare i nuovi dati nel database. Praticamente non viene considerato l'UPDATE. Tutto rimane uguale.

  15. #15
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,650

    Predefinito

    Hai preso i dati di $cognome, $nome, etc da $_POST['nome'], $_POST['cognome'], etc... ?
    Semmai prova a stampare la query per vedere come è formata, tipo così:
    Codice PHP:
    echo $query;
    Ciao!

  16. #16
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Grazie per la pazienza e l'assistenza. Grazie al tuo competente aiuto ho risolto.
    Ho fatto in questo modo: ho tolto le condizioni inziali
    Codice PHP:
    /*
    UPDATE
    */
    if(isset($_POST['aggiorna'])) //se ci son dei dati da aggiornare, si esegue la UPDATE di tutti i campi
    {
    $query = "UPDATE SalaStudio SET cognome='$cognome', nome='$nome',tipoDoc='$tipoDoc',nDoc='$nDoc',rilasciato='$rilasciato',da='$da',luogo='$luogo' WHERE id_SalaStudio = '$id' ";
    }
    e mandato direttamente il form al file per l'aggiornamento, dove c'è solo l'UPDATE.
    Stavolta però, non crea buchi, avendo praticamente tutti i dati, quelli vecchi dal form precompilato e quelli eventualmente nuovi.
    Ho solo un paio di perplessità che non capisco. Forse tu sai darmi una spiegazione.

    1 - Nel bottone di invio dati ho scritto:
    Codice PHP:
    <input type="submit" name="modifica dati">
    </
    form>
    mentre a video invece mi compare la scritta "Invia richiesta".
    Ho provato a mettere anche: value="modifica dati", ma niente da fare.
    Il messaggio nel bottone sembra indipendente e non modificabile.
    Veramente strana questa cosa. Non è però un dramma. Può restare anche così.

    2 - Invece c'è quest'altra cosa poco simpatica e che vorrei aggiustare.
    Ho alcuni nomi e cognomi composti da più parole.
    Es. cognome = Bianchi Rossi
    Mentre dal form di ricerca mi mostra il cognome completo, dal form di modifica (quello precompilato) mi compare solo la prima parte.
    Cioè solo Bianchi. Andando poi all'UPDATE ovviamente il cognome rimane solo Bianchi.
    Perchè non mi carica il campo completo ?
    Come potrei intervenire ?
    Ciao e continuamente grazie
    Ultima modifica di portier : 21-08-2014 alle ore 06.50.41

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •