- Home
- Categorie
- Coding e Sistemistica
- Altri linguaggi per il web
- problemi con relazioni tra tabelle
-
problemi con relazioni tra tabelle
ciao a tutti,
nel mio sito ho una galleria immagini, cliccando sulle miniature si accede alla pagina con la
foto grande , i dettagli ed adesso vorrei inserire anche eventuali commenti lasciati dagli utenti.
Per questo motivo mi sono organizzato con due database:nel primo (viaggi.db) ho i dati relativi alle immagini
foto_id
titolo
categoria
foto
fotogrande
data
formatonel secondo (commenti.db) invece
commento_id
commento
nome
email
foto_idDa entrambe i database poi scrivo a video quanto mi serve, la prima parte della pagina dedicata alla foto+
dettagli , la seconda parte invece dedicata ai commenti.
La parte relativa all'immagine funziona con un qualcosa del tipo scheda.asp?foto_id=xxxx , quindi pensavo di
usare lo stesso concetto anche per i commenti. L'utente attraverso il form per il commento invia nel database
commenti anche foto_id , che mi serve dopo per dividere i commenti a seconda dell'immagine a cui sono riferitiSpero di non essermi perso, comunque il problema è che LA PARTE RELATIVA AI COMMENTI non funziona !!!!
Mi continua a rendere questo errore ..
ADODB.Recordset error '800a0e7d'
The connection cannot be used to perform this operation. It is either closed or invalid in this context.
/scheda2.asp, line 375
Posto il codice per una migliore
comprensione , sperando che qualcuno possa aiutarmi .Grazie in anticipo..
<% Dim id1 id1=request.querystring("foto_id") Dim Conn Set Conn = Server.CreateObject("ADODB.Connection") conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/mdb-database/db2.mdb") Dim rs Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "select * from viaggi where foto_id like "&id1, conn Do while NOT RS.EOF %> <html> <head> </head> <body link="#000000" vlink="#000000" alink="#000000"> <div id="content"> <table border="0" width="410px"> <tr> <td width="100%" bgcolor="#CCCCCC"> <table border="0" width="100%"> <tr> <td width="100%" colspan="4"><%Response.Write("![image](images/" & RS("fotogrande") & ")") %></td> </tr> <tr> <td width="100%" colspan="4"><font face="Verdana" size="1">**Descrizione:<% response.write"" & RS("descrizione") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">viaggio</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">dimensioni</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("formato") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">tema</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("viaggio") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">voto</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">titolo</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("titolo") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">desktop</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">data</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("data") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">prezzo</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> </tr> </table> </td> </tr> </table> <% RS.MoveNext Loop RS.Close Set RS = Nothing conn.Close Set conn=Nothing %> <% Dim id2 id2=request.querystring("foto_id") Dim Con Set Con = Server.CreateObject("ADODB.Connection") con.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/mdb-database/db2.mdb") Dim rss Set rss = Server.CreateObject("ADODB.Recordset") rss.Open " SELECT commento FROM commenti, viaggi WHERE commenti.foto_id=viaggi.foto_id AND viaggi.foto_id= "&id2, con Do while NOT RSS.EOF %> <P align= "center" > <table border="0" width="410px"> <tr> <td width="100%"> <table border="0" width="100%"> <tr> <td width="33%"><font size="2" face="Verdana">"<% response.write"" & RSS("nome") & " "%>"</font></td> <td width="33%"><font size="2" face="Verdana">"<% response.write"" & RSS("email") & " "%>"</font></td> <td width="34%">3</td> </tr> <tr> <td width="100%" colspan="3"><font size="2" face="Verdana">"<% response.write"" & RSS("commento") & " "%>"</font></td> </tr> </table> </td> </tr> </table> <% RSS.MoveNext Loop RSS.Close Set RSS = Nothing con.Close Set con=Nothing %>
-
un po' di consigli:
- quando devi scrivere del codice utilizza il tag ```
2. evidenzia qual è la riga incriminata! 3. potrebbe non essere necessario avere due db. per te sarebbe identico utilizzare due tabelle dello stesso db?
-
la select mi sembra sbagliata
rss.Open " SELECT commenti.commento, viaggi.commento FROM commenti, viaggi WHERE commenti.foto_id=viaggi.foto_id AND viaggi.foto_id= "&id2, con
in alternativa prova ad utilizzare l'inner join
ah: per il primo codice (quello delle foto), sei sicuro che non ti stampi più volte anche il body?
-
Grazie per le risposte ed i consigli, sempre ben accetti.
@sms said:
un po' di consigli:
3. potrebbe non essere necessario avere due db. per te sarebbe identico utilizzare due tabelle dello stesso db?effettivamente ho utilizzato due tabelle dello stesso db, una svista...
infine , riguardo alla select, io avevo già provato con l' INNER JOIN ma senza fortuna.
Piuttosto dopo tante prove, mi sono convinto che il problema potrebbe essere nella definizione della variabile id
Dim id2 id2=request.querystring("foto_id")
infatti ne uso una identica ad inizio pagina e quando arrivo ai commenti non sembra riconoscerla, mi chiedo:
**è possibile aprire la connessione e le 2 stringhe direttamente ad inizio pagina , senza doverle chiudere entrambi sino a fine pagina, qualcosa che concettualmente dovrebbe essere così **:<% Dim id1 id1=request.querystring("foto_id") Dim Conn Set Conn = Server.CreateObject("ADODB.Connection") conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/mdb-database/db2.mdb") Dim rs Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "select * from viaggi where foto_id like "&id1, conn Do while NOT RS.EOF Dim Con Set Con = Server.CreateObject("ADODB.Connection") con.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/mdb-database/db2.mdb") Dim rss Set rss = Server.CreateObject("ADODB.Recordset") rss.Open " SELECT commento FROM commenti, viaggi WHERE commenti.foto_id=viaggi.foto_id AND viaggi.foto_id= "&id1, con Do while NOT RSS.EOF %>
per poi restituire a video i dati secondo la struttura originaria e chiudere tutto a fine pagina con un qualcosa così:
<% RS.MoveNext Loop RS.Close Set RS = Nothing conn.Close Set conn=Nothing RSS.MoveNext Loop RSS.Close Set RSS = Nothing con.Close Set con=Nothing %>
non essendo molto pratico, mi trovo spesso in difficoltà nello stabilire se l'errore lo commetto a livello di concetto oppure di sintassi
grazie ancora
ciao
-
in realtà non è necessario avere due connessioni e due recordset.
ti basterebbe aprire una unica connessione con probabilmente un altro inner join.
una cosa: il campo ID è numerico, vero?
se non fosse numerico dovresti aggiungere gli apostrofi:
cioè, al posto difoto_id=2
ci andrebbe
foto_id='2'
cerca però di mettere i campi primari sempre come numerici.
stringa sql potrebbe essere del tipo (occhio che è fatta senza provarla, per cui vedi tu di rimischiarla in caso di errore)
"SELECT viaggi.*,commenti.* FROM viaggi INNER JOIN commenti ON viaggi.foto_id = commenti.foto_id WHERE viaggi.foto_ID=" & Request.QueryString("foto_id")
non sono sicuro soprattutto con il WHERE. se dà errore prova a spostarlo qua e là prima dell'INNER JOIN
-
GRAZIE SMS
dopo aver letto il tuo suggerimento sul campo numerico, sono andato a ricercarmi una delle prime prove, mi ricordavo esser riuscito a far funzionare la pagina senza nessuna JOIN, ma avevo il problema che il db
non mi riconosceva il campo foto_id nella restituzione dei commenti.....ebbene è bastato impostare il campo foto_id come numerico direttamente nel db , che per magia tutto FUNZIONA !!!!!
Infatti mi riconosce questa stringa:
rss.Open "select * from commenti where foto_id like "&id2, con
senza dover ricorrere alle JOIN .
Grande prova !!!!!!!!!!!!!!!
Posto il codice per completezza,
<% Dim id1 id1=request.querystring("foto_id") Dim Conn Set Conn = Server.CreateObject("ADODB.Connection") conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/mdb-database/db2.mdb") Dim rs Set rs = Server.CreateObject("ADODB.Recordset") rs.Open "select * from viaggi where foto_id like "&id1, conn Do while NOT RS.EOF %> ................................. <table border="0" width="410px"> <tr> <td width="100%" bgcolor="#CCCCCC"> <table border="0" width="100%"> <tr> <td width="100%" colspan="4"><%Response.Write("![image](images/" & RS("fotogrande") & ")") %></td> </tr> <tr> <td width="100%" colspan="4"><font face="Verdana" size="1">**Descrizione:<% response.write"" & RS("descrizione") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">viaggio</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">dimensioni</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("formato") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">tema</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("viaggio") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">voto</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">titolo</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("titolo") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">desktop</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> </tr> <tr> <td width="25%"><font face="Verdana" size="1">data</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("data") & " "%>**</font></td> <td width="25%"><font face="Verdana" size="1">prezzo</font></td> <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS("categoria") & " "%>**</font></td> </tr> </table> </td> </tr> </table> <% RS.MoveNext Loop RS.Close Set RS = Nothing conn.Close Set conn=Nothing %> <% Dim id2 id2=request.querystring("foto_id") Dim Con Set Con = Server.CreateObject("ADODB.Connection") con.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/mdb-database/db2.mdb") Dim rss Set rss = Server.CreateObject("ADODB.Recordset") rss.Open "select * from commenti where foto_id like "&id2, con Do while NOT RSS.EOF %> <div id="middleleft" > <table border="0" width="410px"> <tr> <td width="100%"> <table border="0" width="100%"> <tr> <td width="33%"><font size="2" face="Verdana">"<% response.write"" & RSS("nome") & " "%>"</font></td> <td width="33%"><font size="2" face="Verdana">"<% response.write"" & RSS("email") & " "%>"</font></td> <td width="34%">3</td> </tr> <tr> <td width="100%" colspan="3"><font size="2" face="Verdana">"<% response.write"" & RSS("commento") & " "%>"</font></td> </tr> </table> </td> </tr> </table> </div> <% RSS.MoveNext Loop RSS.Close Set RSS = Nothing con.Close Set con=Nothing %>
Grazie ancora
-
prego.
ultima domandina per il miglioramento dello script.
perchè usi like al posto di = in una delle due query?
lo script cmq potrebbe essere ottimizzato, però questo ti viene con un po' di esperienza.
-
sicuramente lo script si può migliorare, credo abbia una forma decisamente elemetare, che rispecchia peraltro il mio intendere di asp, tuttavia sono soddisfatto perchè lo script funziona e questo mi permette di passare al "problema " succesivo . Di problema in problema , spero di farmi l'esperienza per affinare la tecnica.
Infine riguardo a like non c'è una ragione che mi abbia fatto propendere per like piuttosto di = , speravo per qualche strana sensazione di poter regolare meglio il order by ..... desc, invece così non è stato.....
se faccio così
rss.Open "select * from commenti where foto_id like "&id2 and ORDER BY commento_cod desc, con
mi rende questo errore
Microsoft VBScript compilation error '800a0401' Expected end of statement /scheda112.asp, line 419 rss.Open "select * from commenti where foto_id like "&id2 and ORDER BY commento_cod desc, con --------------------------------------------------------------------^
invece se faccio così:
rss.Open "select * from commenti order by commento_id desc where foto_id ="&id2 , con
mi rende questo errore
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC Microsoft Access Driver] Syntax error in ORDER BY clause. /scheda11.asp, line 419
altri sistemi non ne vedo anche se ...... mai dire mai
grazie in anticipo
-
la query giusta è strutturata cosi:
rss.Open "select * from commenti where foto_id=" & id2 & " and ORDER BY commento_cod desc", con
ti mancavano il "ripristino" del contenuto stringa (= scritto tra " e ") dopo id2
-
ciao , ho provao la query così:
rss.Open "select * from commenti where foto_id ="& id2 &" and ORDER BY commento_cod desc", con
e mi rende questo errore, strano inoltre che il numero di riga che indica sia in realtà vuoto ??
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'foto_id =10 and'. /scheda11.asp, line 425
sembrerebbe che , avendo usato il riferimento id2 come indice della pagina, tutto quello che trova dietro id2 , si aspetta di trovarlo nella url della pagina . Almeno credo.
oppure non riesce a vedere la queri come interrotta ed allora si aspetta di trovare altre informazioni relative al where mentre in realtà io impartisco già ordini diversi sul risultato della query.
La butto così come viene:
potrei in qualche modo dividere le due righe,
pensavo a qualcosa del genererss.Open "select * from commenti where foto_id ="& id2 &" and ORDER BY commento_cod desc", con
anche se ovviamente questo mi rende un errore del tipo Expected statement sulla seconda riga della query.
qualcosa del tipo RIGA 1 dove specifico i criteri di ricerca
RIGA 2 dove ordino i risultati trovati .adesso mi mostra i records seguendo il campo commento_id dal 1,2,3, questo però comporta che il record nuovo si aggiunge in coda,
a me basterebbe invertire questa tendenza, magari con qualche stratagemma ........grazie in anticipo
-
errore tuo di scrittura e mio di non rilettura:
l'and non ci va:rss.Open "select * from commenti where foto_id=" & id2 & " ORDER BY commento_cod desc", con
-
Grazie ancora !!! mitico !!!! Adesso funziona che è una meraviglia.
praticamente il codice in neretto mi divide la query , come se fosse su due righe
rss.Open "select * from commenti where foto_id=" & id2 & " ORDER BY commento_cod desc", con
perfetto.
Ciao