• User Newbie

    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
    formato

    nel secondo (commenti.db) invece

    commento_id
    commento
    nome
    email
    foto_id

    Da 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 riferiti

    Spero 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&#40;"foto_id"&#41;
    Dim Conn
    
    Set Conn = Server.CreateObject&#40;"ADODB.Connection"&#41;
    
    conn.Open "driver=&#123;Microsoft Access Driver &#40;*.mdb&#41;&#125;;dbq=" & server.mappath&#40;"/mdb-database/db2.mdb"&#41;
    
    Dim rs
    
    Set rs = Server.CreateObject&#40;"ADODB.Recordset"&#41;
    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&#40;"![image](images/" & RS&#40;"fotogrande"&#41; & ")"&#41; %></td>
            </tr>
            <tr>
              <td width="100%" colspan="4"><font face="Verdana" size="1">**Descrizione:<% response.write"" & RS&#40;"descrizione"&#41; & " "%>**</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&#40;"categoria"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">dimensioni</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"formato"&#41; & " "%>**</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&#40;"viaggio"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">voto</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"categoria"&#41; & " "%>**</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&#40;"titolo"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">desktop</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"categoria"&#41; & " "%>**</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&#40;"data"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">prezzo</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"categoria"&#41; & " "%>**</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&#40;"foto_id"&#41;
    Dim Con
    
    Set Con = Server.CreateObject&#40;"ADODB.Connection"&#41;
    
    con.Open "driver=&#123;Microsoft Access Driver &#40;*.mdb&#41;&#125;;dbq=" & server.mappath&#40;"/mdb-database/db2.mdb"&#41;
    
    Dim rss
    
    Set rss = Server.CreateObject&#40;"ADODB.Recordset"&#41;
    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&#40;"nome"&#41; & " "%>"</font></td>
              <td width="33%"><font size="2" face="Verdana">"<% response.write"" & RSS&#40;"email"&#41; & " "%>"</font></td>
              <td width="34%">3</td>
            </tr>
            <tr>
              <td width="100%" colspan="3"><font size="2" face="Verdana">"<% response.write"" & RSS&#40;"commento"&#41; & " "%>"</font></td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
    
    
    <% 
    RSS.MoveNext 
    Loop 
    RSS.Close 
    Set RSS = Nothing 
    con.Close 
    Set con=Nothing 
    %>
    

  • User Attivo

    un po' di consigli:

    1. 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?

  • User Attivo

    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?


  • User Newbie

    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&#40;"foto_id"&#41; 
    
    

    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&#40;"foto_id"&#41; 
    Dim Conn 
    
    Set Conn = Server.CreateObject&#40;"ADODB.Connection"&#41; 
    
    conn.Open "driver=&#123;Microsoft Access Driver &#40;*.mdb&#41;&#125;;dbq=" & server.mappath&#40;"/mdb-database/db2.mdb"&#41; 
    
    Dim rs 
    
    Set rs = Server.CreateObject&#40;"ADODB.Recordset"&#41; 
    rs.Open "select * from viaggi where foto_id like "&id1, conn 
    
    Do while NOT RS.EOF 
    
    
    Dim Con 
    
    Set Con = Server.CreateObject&#40;"ADODB.Connection"&#41; 
    
    con.Open "driver=&#123;Microsoft Access Driver &#40;*.mdb&#41;&#125;;dbq=" & server.mappath&#40;"/mdb-database/db2.mdb"&#41; 
    
    Dim rss 
    
    Set rss = Server.CreateObject&#40;"ADODB.Recordset"&#41; 
    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


  • User Attivo

    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 di

    foto_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&#40;"foto_id"&#41;
    

    non sono sicuro soprattutto con il WHERE. se dà errore prova a spostarlo qua e là prima dell'INNER JOIN :fumato:


  • User Newbie

    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 :vai: 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&#40;"foto_id"&#41;
    Dim Conn
    
    Set Conn = Server.CreateObject&#40;"ADODB.Connection"&#41;
    
    conn.Open "driver=&#123;Microsoft Access Driver &#40;*.mdb&#41;&#125;;dbq=" & server.mappath&#40;"/mdb-database/db2.mdb"&#41;
    
    Dim rs
    
    Set rs = Server.CreateObject&#40;"ADODB.Recordset"&#41;
    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&#40;"![image](images/" & RS&#40;"fotogrande"&#41; & ")"&#41; %></td>
            </tr>
            <tr>
              <td width="100%" colspan="4"><font face="Verdana" size="1">**Descrizione:<% response.write"" & RS&#40;"descrizione"&#41; & " "%>**</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&#40;"categoria"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">dimensioni</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"formato"&#41; & " "%>**</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&#40;"viaggio"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">voto</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"categoria"&#41; & " "%>**</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&#40;"titolo"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">desktop</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"categoria"&#41; & " "%>**</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&#40;"data"&#41; & " "%>**</font></td>
              <td width="25%"><font face="Verdana" size="1">prezzo</font></td>
              <td width="25%"><font face="Verdana" size="1">**<% response.write"" & RS&#40;"categoria"&#41; & " "%>**</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&#40;"foto_id"&#41;
    Dim Con
    
    Set Con = Server.CreateObject&#40;"ADODB.Connection"&#41;
    
    con.Open "driver=&#123;Microsoft Access Driver &#40;*.mdb&#41;&#125;;dbq=" & server.mappath&#40;"/mdb-database/db2.mdb"&#41;
    
    Dim rss
    
    Set rss = Server.CreateObject&#40;"ADODB.Recordset"&#41;
    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&#40;"nome"&#41; & " "%>"</font></td>
              <td width="33%"><font size="2" face="Verdana">"<% response.write"" & RSS&#40;"email"&#41; & " "%>"</font></td>
              <td width="34%">3</td>
            </tr>
            <tr>
              <td width="100%" colspan="3"><font size="2" face="Verdana">"<% response.write"" & RSS&#40;"commento"&#41; & " "%>"</font></td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
    </div>
    
    
    <% 
    RSS.MoveNext 
    Loop 
    RSS.Close 
    Set RSS = Nothing 
    con.Close 
    Set con=Nothing 
    %> 
    
    

    Grazie ancora


  • User Attivo

    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.


  • User Newbie

    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 :arrabbiato: . 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' 
    
    &#91;Microsoft&#93;&#91;ODBC Microsoft Access Driver&#93; Syntax error in ORDER BY clause. 
    
    /scheda11.asp, line 419 
    
    
    

    altri sistemi non ne vedo anche se ...... mai dire mai

    grazie in anticipo


  • User Attivo

    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


  • User Newbie

    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 ?? :mmm:

    Microsoft OLE DB Provider for ODBC Drivers error '80040e14' 
    
    &#91;Microsoft&#93;&#91;ODBC Microsoft Access Driver&#93; Syntax error &#40;missing operator&#41; 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 genere

    rss.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


  • User Attivo

    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
    

  • User Newbie

    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 :ciauz: