14 messaggi dal 14 dicembre 2008
Salve a tutti, chiedo aiuto qui per un problema che non so risolvere da solo. Credo di avere capito la logica ma per l'esecuzione sono un pó lontano.

Mi spiego meglio.

Sto costruendo un applicazione basata su asp e database access che gestisce nominativi. Da un form inserisco i dati dei nuovi utenti. E fin qui nessun problema e niente di strano.

Poi ho un'altra pagina dalla quale attraverso l'id di ogni record, posso richiamare un utente e popolare i campi di un form per poter poi aggiornare i dati degli utenti. E anche qui nessun problema e niente di strano.

Il fatto é che io ho stabilito che email e username debbano essere univoci.

Quindi se l'utente si cambia email e username, e uno di questi due o entrambi sono giá presenti nel database perché inseriti da altri utenti, lo script asp deve farlo presente.

E questo non sarebbe neanche un problema...

Il problema nasce dal fatto che un utente se NON si cambia la sua email o il suo username, la query sql che dovrebbe trovare doppioni, troverebbe giá l'email e l'username lasciati inalterati dallo stesso utente e lo segnalerebbe come giá presente nel database, quindi rs.eof sarebbe sempre false.

Come potrei risolvere il problema?

Grazie mille
Surya
Modificato da Surya il 29 dicembre 2008 22.58 -
307 messaggi dal 13 luglio 2005
Ciao Surya,
sarebbe stato meglio se avessi postato il codice che fino ad ora hai creato ..., ti avrei potuto dare un consiglio più mirato ...

Rimanendo, per forza di cose, sul vago, ti potrei consigliare di salvare in campi hidden i vecchi valori di username ed email. Così facendo, in fase di update, puoi capire se son stati modificati o meno.  Se sono stati modificati controlli se esistono già, viceversa salti il controllo e ...

Fammi sapere se ti sono stato utile o vuoi un ulteriore approfondimento. Ciao.

Umb
14 messaggi dal 14 dicembre 2008
Ciao Umb, grazie per la celere risposta... purtroppo lo script che avevo sviluppato é andato perso perché questo é un problema che avevo un mesetto fa e lo sto riprendendo stasera... ma non é un problema vado a risviluppare tutto e poi lo posto...

Nel frattempo ti posto qui una procedura dimmi se ti puó sembrare corretta...

Intanto ti premetto che come interfaccia utente uso Flash e non html, ma questo non cambia il problema e nemmeno la procedura...

Nello script asp pensavo di:

a) Far ricevere le variabili allo script da flash con le request.Form (come ovvio)

b) Assegnare a due variabili di appoggio i valori di username e email
usernameappoggio = username
emailappoggio = email

c) Fare subito una sql per capire se email e username sono rimasti le stesse di prima.
Tipo: select username, email from table where username = &usernameappoggio& AND email = &emailappoggio&

Se sono rimaste le stesse di prima, non c'é bisogno di fare altri controlli perché giá dagli inserimenti precedenti (qui siamo in fase di aggiornamento) c'é il controllo sicuro che non ci devono essere doppioni (in quel caso é piú facile), quindi si procede all'update.

Se invece non sono le stesse di prima, si fa una sql su tutta la tabella per vedere se ci sono doppioni. Cosí:
Tipo: select *from table where email = &email& and username = &username&

If not rs.eof
Response.Write ("Giá presenti email o username simili")

Else

Procedo con l'update

End If

Spero che sia chiaro.
Cosa ne pensi della logica?

Grazie
Surya
Modificato da Surya il 29 dicembre 2008 22.58 -
14 messaggi dal 14 dicembre 2008
Sbagliato...

La prima parte va bene, ma poi troverebbe nuovamente le email e username originali...

Si fa cosí:

a) arrivano le variabili

b) si confrontano email e username. Se uguali si procede all'update

c) se non uguali, si parcheggiano i valori in due variabili di appoggio.

d) si fa un update nel record in questione, scrivendo come email e username due valori fittizi.

e) si fa una sql generale, avendo scritto valori fittizi, non c'é il pericolo che ritrovi i vecchi valori, quindi la ricerca é reale, e quindi:

se trova qualcosa, si riscrive nel record i valori originali e si manda il messaggio che username o email sono giá esistenti.

Altrimenti se si verifica rs.eof, allora vengono scritti i valori immessi nelle variabili di appoggio, cioé le prime scelte.

Questo mi sembra piú logico, anche se tremendamente complesso. Adesso che ricordo avevo sviluppato qualcosa in questo senso, mi scriveva i nuovi valori sul database ma poi era un problema riprenderli. Poi ho lasciato perdere perché non ero neanche sicuro della logica.

cosa ne pensi?

Grazie
Surya
14 messaggi dal 14 dicembre 2008
Allora sto facendo un pó di prove, ma come giá mi era successo si ferma tutto dopo che scrive i dati provvisori...

Questo é il codice che funziona, commentato:

////////////////////////////////////////////////////////////////////////////////
<%@LANGUAGE="VBSCRIPT"%>
<%
Response.ContentType = "text/html"
Response.Charset = "iso-8859-1"
Response.Buffer = True
Response.Expires = 0

' Apro la connessione
Dim cn, rs
Set cn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("/mdb-database/dotbase.mdb")

' ricevo le variabili da flash
Dim id, voce1, voce2, voce3, voce4, voce5, voce6, voce7, voce8
id = Request.Form("vid")
voce1 = Request.Form("vVoce1")
voce2 = Request.Form("vVoce2")
voce3 = Request.Form("vVoce3")
voce4 = Request.Form("vVoce4")
voce5 = Request.Form("vVoce5")
voce6 = Request.Form("vVoce6")
voce7 = Request.Form("vVoce7")
voce8 = Request.Form("vVoce8")

'Eseguo la query sul record che mi interessa grazie all'id
rs.Open "SELECT * FROM users WHERE id = " & id, cn, 3, 3

' scrivo correttamente valori fittizi nei campi corrispondenti di username e password

rs("voce6") = "provv"
rs("voce7") = "provv"
rs.Update

' comunico a flash che tutto é avvenuto bene
Dim aggiornato
Response.write "aggiornato=ok"

' Chiudo recordset e connessione
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

%>
/////////////////////////////////////////////////////////////////////////

adesso ti posto il codice completo ma che non funzia. Anche questo te lo commento:


<%@LANGUAGE="VBSCRIPT"%>
<%
Response.ContentType = "text/html"
Response.Charset = "iso-8859-1"
Response.Buffer = True
Response.Expires = 0

' Apro la connessione
Dim cn, rs
Set cn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("/mdb-database/dotbase.mdb")

' ricevo le variabili da flash
Dim id, voce1, voce2, voce3, voce4, voce5, voce6, voce7, voce8
id = Request.Form("vid")
voce1 = Request.Form("vVoce1")
voce2 = Request.Form("vVoce2")
voce3 = Request.Form("vVoce3")
voce4 = Request.Form("vVoce4")
voce5 = Request.Form("vVoce5")
voce6 = Request.Form("vVoce6")
voce7 = Request.Form("vVoce7")
voce8 = Request.Form("vVoce8")

'Eseguo la query sul record che mi interessa grazie all'id
rs.Open "SELECT * FROM users WHERE id = " & id, cn, 3, 3

' scrivo correttamente valori fittizi nei campi corrispondenti di username e password

rs("voce6") = "provv"
rs("voce7") = "provv"
rs.Update

'chiudo la connessione
rs.close
'la riapro facendo la query sulle due voci che mi interessano, email e username
rs.Open "SELECT voce6,voce7 FROM users", cn, 3, 3

' se la query non trova niente...
if rs.eof Then

'aggiorna i valori
rs("voce1") = voce1
rs("voce2") = voce2
rs("voce3") = voce3
rs("voce4") = voce4
rs("voce5") = voce5
rs("voce6") = voce6
rs("voce7") = voce7
rs("voce8") = voce8
rs.Update

'comunico a flash tutto ok
Response.write "aggiornato=ok"

Else
'Riporto i valori allo stato originale
rs("voce6") = voce6
rs("voce7") = voce7
rs.Update

' e comunico che non si é potuto aggiornare
Response.write "aggiornato=no"

End If

' Chiudo recordset e connessione
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

%>

Dove sbaglio?
Grazie Mille!

Surya
301 messaggi dal 31 maggio 2006
ciao
per sapere se esistono username e/o email duplicati a meno di quelli dell'utente corrente

SELECT count(*) FROM users WHERE id <> IDPASSATO AND (email='EMAILPASSATA' OR username='USERNAMEPASSATO')


se la query ti ritorna 1 (o +) significa che esiste almeno un altro utente che ha già l'email o l'username
307 messaggi dal 13 luglio 2005
Ciao Surya,
... ti stai complicando la vita ...  !
Come giustamente ti ha suggerito il "mitico" gghi (io avevo pensato ai valori di una vecchia username e una vecchia email, ma se hai l'id dell'utente è ovviamente meglio ...), basta controllare che username ed email non siano presenti escludendo quello dell'utente stesso! Se username o email sono state già usate ritorni un messaggio di errore, se no fai l'update ...  . Non c'è bisogno di dati provvisori o altro ...

Fammi sapere, ciao.

Umb
301 messaggi dal 31 maggio 2006
ciao SuperPippo2005
grazie per il "mitico" gghi

buon anno

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.