• User

    Problema con insert to e pagine asp

    Salve a tutti sono nuova di questa sezione e vorrei sottoporre alla vostra attenzione una parte di codice da me scritta che mi da alcuni problemi in fase di inserimento. In poche parole mi sono creata un'area amministrativa per inserire news e articoli in un database. Tutto parte da un form e le pagine passano i dati a sè stesse per poi inserirle nel db.
    I problemi sono:

    1. Quando provo a inserire o modificare una news nel db e magari nel corpo del testo incollo un testo preso da word o da blocco note mi risponde questo:
      *Microsoft OLE DB Provider for ODBC Drivers error '80040e14' **

    [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression ''Dopo aver importato in Photoshop il vostro file, duplicate il livello della foto (dal menù livello, seconda voce in basso): questo nuovo livello sarà quello in cui lavoreremo (Fig. 2). Cliccate su livelli (CTRL+L) e scurite la sagoma della foto muovendo i'. *

    Questo errore mi segnala sempre la riga di codice nella quale c?è l?insert o l?update;
    A volte succede anche con testo scritto sul momento direttamente nella text area. Non capisco perché la prende come espressione visto che ho provato a inserire anche testo senza punteggiatura e non funziona, e cmq anche se funzionasse non si può fare una vita così?
    2) Quando provo a modificare una news, ci clicco sopra e me la apre di nuovo in un form in maniera che possa essere modificata, ma ad esempio nel titolo mi riporta solo le prime due parole mettiamo se il titolo fosse ?che bello il forum? mi riporta solo ?che bello?.
    Questo lo fa principalmente nei campi di testo.

    Questa è la pagina che elenca le news:

     
    In questa pagina visualizzi tutte le news in elenco: puoi modificarle o cancellarle.
    
      <%'creo la connessione e mi connetto al database
      dim dbconn
      Set dbconn = Server.CreateObject("ADODB.Connection")
      strconn= "driver={Microsoft Access Driver (*.mdb)}; dbq=" &Server.MapPath("\mdb-database\database.mdb")&"; Persist Security Info = False"
      DBconn.Open strConn%>
      <%
      'creo il recordset news e chiedo al db di elencare le news all'interno del db
      set news=dbconn.execute("select * from news order by idnews desc")%>
    <% 'leggo tutti i record fino alla fine del file
      do while not news.eof%>
    
      <table>
      <tr> 
      <td>><a href="dettaglio_news.asp?idnews=<%=news("idnews")%>"><strong><%=news("data")%>&nbsp;<%=news("titolo")%></strong></a> <a href="elimina_news.asp?idnews=<%=news("idnews")%>">Elimina</a> <a href="modifica_news.asp?idnews=<%=news("idnews")%>">Modifica</a></td>
    </tr></table>
      <%news.movenext
      loop
      %>
      <%'chiudo e cancello il recordset
      news.close 
      set news=nothing%>
      <% 'chiudo la connessione al database
      dbconn.close
      set dbconn=nothing%>
    
    

    E questa è la pagina modifica.asp

     
    <%'creo la connessione e mi connetto al database
      dim dbconn
      Set dbconn = Server.CreateObject("ADODB.Connection")
      strconn= "driver={Microsoft Access Driver (*.mdb)}; dbq=" &Server.MapPath("\mdb-database\database.mdb")&"; Persist Security Info = False"
      DBconn.Open strConn%>
    
    <%if request.QueryString("action")="" then%>
    <%set news=dbconn.execute ("select * from news where idnews="&int(request.querystring("idnews")))%>
    
    <fieldset style="border:1px solid gray;">
    <legend>Modifica una news nel database</legend>
    
    <form name="form1" method="post" onsubmit="return controllaINSERIMENTO(this)" action="modifica_news.asp?action=register">
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr>
    <td><input type="hidden" name="idnews" value="<%=news.fields("idnews")%>"></td></tr>
    <tr>
    <td>Data</td>
    <td><input name="data" type="text" size="50" value=<%=news.fields("data")%>></td>
    </tr>
    <tr>
    <td>Titolo</td>
    <td><input name="titolo" type="text" size="50" value=<%=news.fields("titolo")%>></td>
    </tr>
    <tr>
    <td>Abstract (introduzione)</td>
    <td><textarea name="abstract" cols="60" rows="10"><%=news.fields("abstract")%></textarea></td>
    </tr>
    <tr>
    <td>Testo</td>
    <td><textarea name="testo" cols="60" rows="10"><%=news.fields("testo")%></textarea></td>
    </tr>
    <tr>
    <td>Autore </td>
    <td><input name="autore" type="text" size="50" value=<%=news.fields("autore")%>></td>
    </tr>
    <tr>
      <td><input type="submit" name="submit" value="Modifica"></td>
    </tr>
    </table>
    </form>
    <a href="amministrazione.asp" target="_self">Cambiato idea? Clicca qui!</a>
    
    </fieldset>
    
    <%else
    id=request.form("idnews")
    data=request.form("data")
    titolo=request.form("titolo")
    abstract=request.form("abstract")
    testo=request.form("testo")
    autore=request.form("autore")
    
          'AZIONE DI REGISTRAZIONE
        set rds_news=dbconn.execute ("UPDATE news SET data='"&data&"', titolo='"&titolo&"', abstract='"&abstract&"', testo='"&testo&"', autore='"&autore&"' WHERE idnews="&id&"")%>
    
         <tr>
        <td height="156">
          <p align="center">&nbsp;</p>
          <p align="center">La modifica &egrave; avvenuta con successo. <br>
           </p>
    <%end if%>
    <% 'chiudo la connessione al database
      dbconn.close
      set dbconn=nothing%>
    
    

    E per finire questa è la pagina inserisci news.asp:

     
    <%'creo la connessione e mi connetto al database
      dim dbconn
      Set dbconn = Server.CreateObject("ADODB.Connection")
      strconn= "driver={Microsoft Access Driver (*.mdb)}; dbq=" &Server.MapPath("\mdb-database\database.mdb")&"; Persist Security Info = False"
      DBconn.Open strConn%>
     
    <%if request.QueryString("action")="" then%>
     
    <fieldset style="border:1px solid gray;">
    <legend><strong>INSERISCI UNA NEWS NEL DATABASE</strong></legend>
     
    <form name="form1" method="post" onsubmit="return controllaINSERIMENTO(this)" action="gestione_news.asp?action=register">
    <table width="50%" border="0" cellspacing="0" cellpadding="0" align="center">
    <tr>
    <td><strong>Data</strong></td>
    <td><input name="data" type="text" size="50" value="qui la data formato 00/00/0000"></td>
    </tr>
    <tr>
    <td><strong>Titolo</strong></td>
    <td><input name="titolo" type="text" size="50" value="qui il titolo"></td>
    </tr>
    <tr>
    <td><strong>Abstract (introduzione)</strong></td>
    <td><textarea name="abstract" cols="60" rows="10">qui il sottotitolo</textarea></td>
    </tr>
    <tr>
    <td><strong>Testo</strong></td>
    <td><textarea name="testo" cols="60" rows="10">qui il corpo del testo</textarea></td>
    </tr>
    <tr>
    <td><strong>Autore </strong></td>
    <td><input name="autore" type="text" value="qui il nome dell'autore" size="50"></td>
    </tr>
    <tr><td><strong>Immagine</strong></td>
    <td><input name="immagine" type="text" value="../immaginidb/nomeimmagine.jpg" size="50"></td>
    </tr>
    <tr>
    <td><strong>Importante:</strong></td><td> Verifica di aver inserito l'immagine desiderata nella cartella <strong>IMMAGINIDB</strong> ed averla caricata nel server prima di inserire il nome nel database, altrimenti si verificherà un errore in fase di visualizzazione!</td>
    </tr>
     
    <tr><TD>&nbsp;</TD>
      <td><input type="submit" name="submit" value="Inserisci">&nbsp;<a href="amministrazione.asp" target="_self">Cambiato idea? Clicca qui!</a>
    </td>
    </tr>
    </table>
    </form>
     
    </fieldset>
     
    <%else
    data=request.form("data")
    titolo=request.form("titolo")
    abstract=request.form("abstract")
    testo=request.form("testo")
    autore=request.form("autore")
    immagine=request.form("immagine")
     
          'AZIONE DI REGISTRAZIONE
          sql="Insert into news (data, titolo, abstract, testo, autore, immagine) values('"&data&"','"&titolo&"','"&abstract&"','"&testo&"','"&autore&"', '"&immagine&"')"
          dbconn.execute(sql)
            %>
             <tr>
        <td height="156">
          <p align="center">&nbsp;</p>
          <p align="center"><strong>La registrazione &egrave; avvenuta con successo.</strong> <br>
          </p>
    <BR>
    <BR>
           </td>
      </tr>
    <%end if%>
    <% 'chiudo la connessione al database
      dbconn.close
      set dbconn=nothing%>
    
    

    Questi due errorini mi tirano scema e non so come risolverli anche se ho controllato mille volte il codice nn ne vengo a capo. Visto che non ho installato IIS lo provo direttamente online, sono ospitata da aruba su piattaforma windows 2003; a me il codice sembra giusto dopo averlo controllato tante volte, e comincio a pensare che il linguaggio che usato non sia compatibile con la versione sul server.
    Mi rimetto alla vostra sapienza e mi scuso tantissimo per la lunghezza del thread ma non sapevo come accorciare!! Katy82


  • User Attivo

    Ciao Katy benvenuta in questo forum 🙂

    L'errore di missing operator è generalmente dovuto ad apici di troppo.

    Quando recuperi i valori, come minimo, devi fare un replace degli apici in maniera da raddoppiarli:

    testo=Replace(request.form("testo"),"'","''")

    Questo devi farlo con tutti valori testuali che possono contenere apici.
    Prova quindi col replace di eventuali apici, se non dovessi risolvere il problema ti invito a stampare a video la query prima della sua esecuzione per poi postarcela così da poter individuare il problema.

    Praticamente così:
    (ad es. per l'insert)

    
    'AZIONE DI REGISTRAZIONE
    sql="Insert into news (data, titolo, abstract, testo, autore, immagine) values('"&data&"','"&titolo&"','"&abstract&"','"&testo&"','"&autore&"', '"&immagine&"')"
    Response.Write(sql)
    Response.End
    dbconn.execute(sql)
    
    

    Ciao


  • User

    Mi manca solo una cosa per capire bene: allora io dovrei in una ipotetica request form come questa:
    id=request.form("idnews")
    data=request.form("data")
    titolo=request.form("titolo")
    abstract=request.form("abstract")
    testo=request.form("testo")
    autore=request.form("autore")

    aggiungere solamente gli apici; solo che a video non riesco a vedere bene quanti sono, tu hai scritto:
    testo=Replace(request.form("testo"),"'","''")

    quindi se leggo bene dopo ("testo"),"'","''")
    ovvero ("testo"),virgolette apice virgolette,virgolette apice apice virgolette? Tutto senza spazi?
    Verrebbe:
    id=request.form("idnews"),"'","''")
    data=request.form("data"),"'","''")
    titolo=request.form("titolo"),"'","''")
    abstract=request.form("abstract"),"'","''")
    testo=request.form("testo"),"'","''")
    autore=request.form("autore"),"'","''")
    Così? E scusa l'ignoranza, ma fatto questo dobrebbe funzionare? A cosa serve mettere questi apici? Che funzione hanno?
    Grazie per avermi risposto così in fretta!!! Sei davvero gentilissimo e se funziona ti devo minimo una cena! Grazie!!!! :ciauz:


  • User Attivo

    Ho detto *testo=Replace(request.form("testo"),"'","''")

    non

    *testo=request.form("testo"),"'","''")

    In alternativa puoi crearti una piccola funzione che fa questo lavoro:

    
    Function sos(str)
    *   sos **= Replace(str,"'","''")*
    End function
    
    

  • User Attivo

    Verrebbe così:

    
    id=sos(request.form("idnews"))
    data=sos(request.form("data"))
    titolo=sos(request.form("titolo"))
    abstract=sos(request.form("abstract"))
    testo=sos(request.form("testo"))
    autore=sos(request.form("autore"))
    
    

    Il motivo sta nel fatto che l'apice manda in "confusione" l'interprete sql. In una insert le stringhe vanno racchiuse tra apici. Se c'è un'apice nella stringa questo deve essere raddoppiato per poter essere considerato parte di essa e non la sua terminazione.

    Ciao fammi sapere


  • User

    aver inviato il messaggio di risposta, ho già provato e mi pare proprio che funzioni. Meno male che ci sei tu, davvero non sai da quanto provavo a metterla a posto saranno mesi (almeno 5)!!!
    Se tutto va bene torno e vi posto i miei più sentiti ringraziamenti ove mi metterò a disposizione per pulizie gratuite di case e uffici ai valorosi del linguaggio asp!
    Ma senti, e visto che sei così istruito, mi sapresti anche dire come mai quando voglio fare le modifiche nel form mi riporta solo due parole anzichè tutte quelle che ci sono nel campo (vedi il primo messaggio)??
    Può essere dovuto anche quello agli apici? Ma che funzione hanno esattamente? Grazie Grazie Grazie!!!!! 😄 😄 😄


  • User

    Scusa abbiamo postato praticamente insieme! Grazie per la risposta, era semplice dovevo arrivarci!!!!! L'idea della funzione è eccellente e semplicissima, devo ancora imparare tutto su come sfruttare le potenzialità dell'asp! Però mi metto di impegno! Provo e vi faccio sapere come finisce (sicuramente con un guru che mi aiuta come te andrà subito tutto a posto!) Non so proprio come ringraziarti, davvero.


  • User Attivo

    guru? per così poco? 🙂

    Occhio che effettuare come minimo il replace degli apici è fondamentale per la sicurezza di una pagina di accesso ad un'area riservata, qualora questa effettui il controllo dei dati di accesso attraverso un database.

    Altrimenti saresti esposta ad SQL INJECTION

    Es. di query ERRATA e penetrabile:

    
    "SELECT * FROM utenti WHERE nome = '"&Request("nome")&"' AND psw = '"&Request("psw")&"'"
    
    ``` In questo caso inserendo come nome utente e psw i seguenti valori:
    
    nome: **' or '' = '**
    psw: **' or '' = '
    **
    si otterrebbe la selezione del primo record della tabella, di solito quello con ID = 1
    ** 
    Attenzione perchè questo errore è molto diffuso tra i neofiti
    
    **PS: vada per la cena

  • User

    Erano MESI che ci provavo e non riuscivo nè qualcuno era stato capace di darmi una mano; adesso ho fatto tutte le modifiche e pare che funzioni, ho provato a mettere cose copiate e incollate e a scriverne a mano pare che vada. Tranne a un tentativo in cui mi ha detto che "data mismatch in criteria expression" ma credo fosse perchè in un campo data era rimasto "inserire data" anzichè un formato data 00/00/0000. Me lo confermi? O mi devo preoccupare?:?
    Invece (ahime) la modifica nonostante i tuoi suggerimenti continua a prendere solo le prime due parole del titolo, e non so proprio come fare... ti prego dammi una mano!!!
    Cmq avrai passato anche tu (e spero stia tuttora passando) quei momenti in cui credi di aver scoperto l'acqua calda e ti senti fiero di un piccolo passo avanti che a distanza di anni ti fa ridere... lo provi quasi per tutte le cose!! Una lingua, un programma o un sito! Ecco per me oggi è uno di quei giorni!:D


  • User Attivo

    Ti capisco benissimo.. ancora oggi le nuove scoperte mi lucidano gli occhi 😄

    Certo che l'errore "data mismatch in criteria expression" è dovuto a quello che dici.

    Ma veniamo al secondo problema... aspetta che sto pensando :mmm:


  • User Attivo

    è un errore html... hai mancato le virgolette dell'attributo value:

    <input name="titolo" type="text" size="50" value="<%=news.fields("titolo")%>">

    Avrebbe dovuto spezzarsi al primo spazio


  • User

    Se può aiutarti (non credo!) mi prende solo la prima parola del titolo.
    Nella pagina che mostra le news c'è un link che consente di cancellare o modificare la news, con questo codice:

     
     <%
      'creo il recordset news e chiedo al db di elencare le news all'interno del db
      set news=dbconn.execute("select * from news order by idnews desc")%>
     <% 'leggo tutti i record fino alla fine del file
      do while not news.eof%>
    <a href="dettaglio_news.asp?idnews=<%=news("idnews")%>"><strong><%=news("data")%>&nbsp;<%=news("titolo")%></strong></a> <a href="elimina_news.asp?idnews=<%=news("idnews")%>">Elimina</a> <a href="modifica_news.asp?idnews=<%=news("idnews")%>">Modifica</a></td>
    
    

    Nella pagina delle modifiche il codice (l'ho anche modificato come avevi detto tu) è così:

     
    <%if request.QueryString("action")="" then%>
    <%set news=dbconn.execute ("select * from news where idnews="&int(request.querystring("idnews")))%>
    <fieldset style="border:1px solid gray;">
    <legend><strong>MODIFICA UNA NEWS NEL DATABASE</strong></legend>
    <form name="form1" method="post" onsubmit="return controllaINSERIMENTO(this)" action="modifica_news.asp?action=register">
    <table width="50%" border="0" cellspacing="0" cellpadding="0" align="center">
    <tr>
    <td><input type="hidden" name="idnews" value="<%=news.fields("idnews")%>"></td></tr>
    <tr>
    <td><strong>Data</strong></td>
    <td><input name="data" type="text" size="50" value=<%=news.fields("data")%>></td>
    </tr>
    <tr>
    <td><strong>Titolo</strong></td>
    <td><input name="titolo" type="text" size="50" value=<%=news.fields("titolo")%>></td>
    </tr>
    <tr>
    <td><strong>Abstract (introduzione)</strong></td>
    <td><textarea name="abstract" cols="60" rows="10"><%=news.fields("abstract")%></textarea></td>
    </tr>
    <tr>
    <td><strong>Testo</strong></td>
    <td><textarea name="testo" cols="60" rows="10"><%=news.fields("testo")%></textarea></td>
    </tr>
    <tr>
    <td><strong>Autore </strong></td>
    <td><input name="autore" type="text" size="50" value=<%=news.fields("autore")%>></td>
    </tr>
    <tr><td><strong>Immagine</strong></td>
    <td><input name="immagine" type="text" size="50" value=<%=news.fields("immagine")%>></td>
    </tr>
    <tr><TD>&nbsp;</TD>
      <td><input type="submit" name="submit" value="Modifica">&nbsp;<a href="amministrazione.asp" target="_self">Cambiato idea? Clicca qui!</a>
    </td>
    </tr>
    </table>
    </form>
    </fieldset>
    <%else
    id=request.form("idnews")
    data=request.form("data")
    titolo=Replace(request.form("titolo"),"'","''")
    abstract=Replace(request.form("abstract"),"'","''")
    testo=Replace(request.form("testo"),"'","''")
    autore=Replace(request.form("autore"),"'","''")
    immagine=request.form("immagine")
          'AZIONE DI REGISTRAZIONE
       set rds_news=dbconn.execute ("UPDATE news SET data='"&data&"', titolo='"&titolo&"', abstract='"&abstract&"', testo='"&testo&"', autore='"&autore&"', immagine='"&immagine&"' WHERE idnews="&id&"")%>
    
    
    

    Non so dirti di più...


  • User Attivo

    Ti ho già risposto sopra 🙂


  • User

    🙂 Sei troppo intelligente!!!! L'avevo visto ma siccome tutti gli altri campi funzionavano, incluse le textarea e tutto il resto non mi ero posta il problema... come mai funzionano lo stesso?? E' un problema solo per campi di testo?:yuppi: :yuppi: :yuppi: :yuppi: :yuppi: :vai:


  • User Attivo

    @katy82 said:

    🙂 Sei troppo intelligente!!!! L'avevo visto ma siccome tutti gli altri campi funzionavano, incluse le textarea e tutto il resto non mi ero posta il problema... come mai funzionano lo stesso?? E' un problema solo per campi di testo?:yuppi: :yuppi: :yuppi: :yuppi: :yuppi: :vai:
    Le textarea non vuole le virgolette, potresti anche evitarle per il textfield solo evitando gli spazi. Perchè?

    Perchè il browser non potendo sapere dove termina il testo che stai immettendo nel campo testo allora si ferma al primo spazio in quanto lo interpreta come separatore di attributi

    <input type="text" name="textfield" value=prova test>

    In questo esempio il browser crede che test sia un attributo così come lo è type, name e value. Ovviamente non lo riconosce e lo lascia pardere.

    Con la textarea è differente, il browser interpreterà come valore del campo tutto quello compreso tra <textarea> e </textarea>

    PS: a base di pesce, porto io il vino 😄


  • User

    Mi inchino alla tua sapienza e mi imbarazzo per la mia ignoranza! A presto l'invito per una cena a base di pesce (si vede che sei dalle parti di ischia, noi polentoni del piemonte conosciamo solo la bagna caoda!)!!! Grazie davvero di tutto!!!!!!


  • User Attivo

    Ehehe ciao 🙂