Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57

    Trova il bug: Form -> DB

    Dunque, ho un problema che non capisco come risolvere.
    In sostanza ho un form "dinamico" che viene creato leggendo una tabella del DB e che si occupa di modificare la stessa.

    Parto subito dal codice:

    codice:
    While recordset.EOF = False
    %>
    
    <tr>
    <td><%=recordset("Nome")%></td>
    <td><%=recordset("Email")%></td>
    <td>
    <input type="checkbox" name="<%=recordset("Id")%>" value="yes" <%if recordset("Riceve")="yes" then%>checked<%end if%>>
    </td>
    </tr>
    
    <%
    recordset.MoveNext
    Wend
    End If
    %>
    
    </table>
    <input type="submit" name="provola" value="Fatto">
    </form>
    Quindi come vedete il form è una tabella così fatta:
    Nome e cognome che sono campi della tabella e un bottone, di nome "Id" (ovvero un numero che corrisponde all'Id del record in questione) che è checked se il campo "Riceve" del record è "yes".

    Ovviamente l'applicazione si occupa di mettere a "no" i campi che il form restituirà non checckati e di passare a "yes" quelli checked.

    Per fare questo chiama questa pagina:

    codice:
    If recordset.EOF = True Then
    Response.Redirect ...
    Else
    
    While recordset.EOF = False
    
    Id_record = recordset("Id")
    
    If Request.Form(Id_record) = "yes" then
    SQL = ""
    SQL = SQL & "UPDATE "
    SQL = SQL & scelta
    SQL = SQL & " SET Riceve='yes' "
    SQL = SQL & "WHERE "
    SQL = SQL & "Id = " & Id_record
    prova = prova & " Id " & Id_record & "uguale " & Request.Form(Id_record)
    
    else
    If Request.Form(Id_record) = "" then
    SQL = ""
    SQL = SQL & "UPDATE "
    SQL = SQL & scelta
    SQL = SQL & " SET Riceve='no' "
    SQL = SQL & "WHERE "
    SQL = SQL & "Id = " & Id_record
    prova = prova & " Id " & Id_record & " uguale a " & Request.Form(Id_record)
    
    End if
    End if
    
    conn.Execute(SQL)
    
    recordset.MoveNext
    Wend
    End If
    
    recordset.Close
    Set recordset = Nothing
    conn.Close
    Set conn = Nothing
    Quindi a seconda del valore di ogni bottone, cambia il campo "Riceve" del record relativo (facendo un confronto tra il nome del bottone e l'Id del record).
    La stringa prova l'ho inserita per cercare di capire cosa sta succedendo.



    Ora il problema:

    Sto facendo una prova con una semplice tabella che contiene solo tre righe.

    Se spunto tutti e tre i bottoni, prova ha questo valore:
    Id 1 uguale yes Id 2 uguale yes Id 3 uguale yes
    Ed è ok.

    Se spunto solo i primi due:
    Id 1 uguale yes Id 2 uguale yes
    Niente info sul terzo bottone.
    In più il valore "Riceve" con Id "3" viene cmq messo a "yes", quando dovrebbe essere a "no"

    Se spunto solo il primo bottone:
    crasha.
    Il valore dell'indice di una matrice non è compreso nell'intervallo consentito.
    A questa riga
    If Request.Form(Id_record) = "yes" then



    Ho provato ad eliminare questo controllo nell'else:
    If Request.Form(Id_record) = "" then
    Pensando che fosse superfluo, in quanto cmq è giusto che entri nell'else se l'if (bottone = yes) da falso.
    Non solo i problemi restano, ma arrivano anche risultati più strani:

    Se spunto il secondo e il terzo bottone e lascio unchecked il primo, prova diventa:
    Id 1 uguale yes Id 2 uguale yes Id 3 uguale a Fatto
    (Fatto è il valore del bottone di submit o_O )
    e vengono messi a yes i campi "Riceve" con Id 1 e 2, mentre viene messo a no il campo con Id 3.

    Stessa cosa se spunto primo e terzo bottone o secondo e terzo.
    Insomma, se solo un bottone non è checked succede quello.

    Se invece due bottoni non sono checked, crasha.



    Se riuscite a darmi una mano a capire che cosa ho combinato vi sarò infinitamente grato!

  2. #2
    Moderatore di ASP e MS Server L'avatar di Roby_72
    Registrato dal
    Aug 2001
    Messaggi
    19,559
    Secondo me dovresti aggiornare solo i record non rileggere di nuovo la tabella ed in più fare un update record per record. E' un doppio lavoro.
    Insieme al check passati anche l'id corispondente ed in base a quello e al valore del campo checkbox fai l'update.

    Roby

  3. #3
    [OT]
    il titolo è spettacolare, si dovrebbe fare un concorso o una gara a riguardo
    [/OT]

    se tu dai ai check lo stesso nome (esempio ID) e come value metti l'id del record, quando fai il request.form("ID") otterrai una stringa del tipo:

    1,4,2

    dove i numeri sono gli id dei campi checcati. Ottenuta questa stringa splitti sulla virgola e per ogni record aggiorni la tabella nel db. Per settare a no i record nella tabella che non sono stati checcati basta che fai un update con clausola where id not in (" & request.form("ID") & ")
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57
    Originariamente inviato da Roby_72
    Insieme al check passati anche l'id corispondente ed in base a quello e al valore del campo checkbox fai l'update.
    Roby
    Uhm ma in realtà è quello che cerco di fare... Prendendo gli id come campi del form. Quindi forse non ho capito bene cosa intendi. In che senso "aggiornare solo i record"?



    Originariamente inviato da Santino83_02
    se tu dai ai check lo stesso nome (esempio ID) e come value metti l'id del record, quando fai il request.form("ID") otterrai una stringa del tipo:

    1,4,2

    dove i numeri sono gli id dei campi checcati. Ottenuta questa stringa splitti sulla virgola e per ogni record aggiorni la tabella nel db. Per settare a no i record nella tabella che non sono stati checcati basta che fai un update con clausola where id not in (" & request.form("ID") & ")
    Ah ho capito. Anche questa mi pare una soluzione valida.
    Forse è questo che intendeva anche Roby?
    Però scusami io non so a priori da quanti numeri sarà composta la stringa (ovvero quante righe ha la tabella), come dici di strutturare il ciclo che ne setta i valori partendo da una stringa di dimensione random contenente numeri a saltare?

  5. #5
    
    codice:
    ids = request.form("ids") 'ids è il nome dato alle checkbox
    
    'ora in ids avrò tutti gli id dei record a cui ho deciso di cambiare il valore da non ceccato a ceccato
    
    'aggiorno gli id checcati nel database
    
    if len(trim(ids))>0 then
    sql ="Update tabella set Riceve='yes' where id in (" & ids & ")"
    conn.execute(sql)
    
    'aggiorno gli id non checcati
    sql="Update tabella set Riceve='no' where id not in (" & ids & ")"
    conn.execute...
    
    else 'se ids=0 vuol dire che voglio mettere a no tutti i Riceve
    sql="Update tabella set Riceve='no'"
    conn.execute...
    end if
    insomma una cosa del genere, con le dovute attenzioni
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    57
    Ah ok perfetto.
    Ti ringrazio moltissimo per l'aiuto provo subito.
    Ho un solo dubbio, visto che conosco poco approfonditamente sql: quando uso
    where id in (" & ids & ")
    Se in "ids" c'è ad esempio "53", non è che mi modifica anche i record con id 3 e 5?
    Probabilmente no - forse perchè ci saran le virgole -, ma visto che ormai sto replicando, chiedere per sicurezza non mi costa nulla, quindi... ^^;

  7. #7
    no se in ids c'è 53 modifica solo il campo con id=53

    se c'è 53,45,3 modifica i campi con id 53, 45 e 3


    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

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.