Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: tornu - 25 Maggio 2009, 23:19:51

Titolo: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 25 Maggio 2009, 23:19:51
Buonasera a tutti,
ho un problema di inserimento dati in Mysql quando un campo contiene il carattere "apostrofo".
Faccio un piccolo esempio per spiegarmi meglio:
in un campo Indirizzo che contiene il dato "Via dell'Industria"
quando Gambas esegue l'INSERT leggendo il dato da una TextBox o qualsiasi altro oggetto che contenga una stringa come sopra, Mysql ritorna un errore di sintassi.

Come posso fare perchè Gambas formatti il dato con la sintassi corretta per l'inserimento in Mysql?

Avete incontrato lo stesso problema anche con altri DB?
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: fsurfing - 26 Maggio 2009, 07:06:54
lo stesso problema si presenta anche con sqlite

hai provato a inserire la parola mettendo un apostrofo all' inizio e uno alla fine?

esempio


'Via dell'Industria'
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: milio - 26 Maggio 2009, 08:26:22
Dovete radoppiare l'apostrofo

Via dell''Industria

Io solitamente quando inserisco un record diciamo 'a rischio apostrofo' faccio un replace prima dell'inserimento

testo = Replace(Testo,"'","''")
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: leo72 - 30 Maggio 2009, 16:35:12
A me non pare che lo faccia, però. Anch'io uso MySQL e gli apostrofi nei nomi e negli indirizzi sono all'ordine del giorno, ma non mi ha mai dato errore.
Mi pare strana, 'sta cosa. Forse fa parte delle impostazioni del server MySQL? Io uso la codifica UTF-8.
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: Ceskho - 30 Maggio 2009, 17:23:09
Penso che l'apostofo nei conadi inerenti a *sql in gambas sia disabilitato per motivi di sicurezza....

La maggior parte degli sql injection, infatti, si basa proprio sullo strutturare la stringa inserita in una textbox in modo che commenti tutto ciò che viene dopo e siccome in gambs i commenti sono dati dall'apostrofo allora esso è disabilitato......(non mi dilungo sennò Leo mi denuncia per hacking...:-D e po non voglio essere motivo di vanto di lamers vari!!!)
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 30 Maggio 2009, 20:43:25
Ho provato ad inserire lo stesso tipo di dato anche escludendo Gambas, quindi direttamente su MySQL ma mi restituisce sempre l'errore, tolgo l'apostrofo o lo inserisco tra doppi apici è tutto e ok.

@leo72
Se a te non da errore molto probabilmente ho qualche impostazione diversa dal tuo, ma cosa?

Sarebbe altrimenti complicato (secondo me improponibile) dover controllare tutti i campi di tipo Text in un progetto Gambas specialmente se i campi sono una quantità importante.

Anche io uso la tua stessa codifica: UTF-8 Unicode
Versione MySQL 5.1.33
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: leo72 - 30 Maggio 2009, 22:48:04
Uhm... però io non uso direttamente l'SQL quando inserisco dati con l'apostrofo.
Ho ricontrollato il codice e faccio interfacciare Gambas per cui non so se esegue un qualche tipo di conversione da codifica a codifica.

Tanto per intendersi:
Codice: [Seleziona]

Risultato["nome"] = txtNome.Text
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 31 Maggio 2009, 20:13:09
Scusa leo ma non ho capito l'esempio che hai postato.

Io normalmente per inserire dati in MySQL uso questa sintassi
Codice: [Seleziona]
("INSERT INTO anagrafica (indirizzo) VALUES ('" & TxtIndirizzo.Text & "')")
 
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: leo72 - 01 Giugno 2009, 16:02:29
Come ti ho detto, non uso per inserire i dati l'SQL puro, quindi non eseguo query SQL. Mi affido ai metodi di Gambas.

L'esempio che ti ho postato fa parte di una porzione di codice più ampia. Restringendo diciamo che sarebbe così:

Codice: [Seleziona]

  Connessione.OPEN
  Risultato = Connessione.Create("anagrafica")
  Risultato["codice"] = codice
  Risultato["cognome"] = txtCognome.Text
  Risultato["nome"] = txtNome.Text
  Risultato.Update
  Connessione.Commit
  Connessione.Close
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: Ceskho - 01 Giugno 2009, 16:57:52
Citazione

leo72 ha scritto:
Uhm... però io non uso direttamente l'SQL quando inserisco dati con l'apostrofo.
Ho ricontrollato il codice e faccio interfacciare Gambas per cui non so se esegue un qualche tipo di conversione da codifica a codifica.

Tanto per intendersi:
Codice: [Seleziona]

Risultato["nome"] = txtNome.Text


Ed è per questo che non incontri errori...perchè ci pensa l'istruzione di gambas a rendere la parola con l'apostrofo una stringa accettata da SQL....Gli apostrofi in SQL devono essere filtrati per motivi di sicurezza...se così non fosse non sarebbe difficile entrare nel database senza credenziali, conoscere il nome del database o addirittura distruggerlo!
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 02 Giugno 2009, 00:14:39
@ leo
Non conoscevo il metodo da te desritto, anche perchè tutti gli esempi che avevo trovato a suo tempo quando ho cominciato ad usare MySQL con Gambas erano descritti con esempi di SQL "puro" e così ho continuato.
Ho provato l'esempio che mi hai postato è funziona perfettamemte con dati apostrofati, quindi usero' questo sistema.

Ne aprofitto per chiederti alcuni chiarimenti, la sintassi è la stessa anche per
update e delete?
Se devo inserire dati di tipo data e valuta (due decimali) come li formato per inserirli con il metodo che mi hai postato?
Ti ringrazio per la risposta e per le eventuali spiegazioni.

@ Ceskho
Grazie per le ulteriori delucidazioni.
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: leo72 - 02 Giugno 2009, 06:08:38
@tornu:
Usa Risultato = Connessione.Edit("tabella") chiuso da una Connessione.Update per modificare; per cancellare basta dare il comando diretto Connessione.Delete(....).
Per aggirare il problema della conversione dei tipi data, valuta e numero, io uso sempre dati di tipo Text così che il DB immagazzini i valori come glieli passo io.

@Ceskho:
L'utilizzo dei metodi precompilati in Gambas toglie spesso molte castagne dal fuoco. Forse usare l'SQL nudo e crudo fa più "ganzo" ma io preferisco dormire sonni tranquilli ;-)
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 02 Giugno 2009, 19:32:28
Per prima cosa ti ringrazio per le spiegazioni che mi hanno aiutato a capire questo metodo di inserimento dati, anche se ancora non ho capito bene alcuni concetti di cui ho provato a cercare documentazione in giro ma come al solito con Gambas non è semplice.

Chiedo cortesemente non solo a te, (ma a chiunque sappia) se puoi dare risposta ai dubbi che mi sono rimasti.

Per la cancellazione, sono riuscito solo a cancellare un'intera tabella, ma se volessi cancellare un solo record oppure n record che soddisfano una condizione?

Il metodo che tu hai descritto sostituisce in toto l'SQL "puro" o devo usare un "misto" ? Per esempio: ricerca di record, aggregazione dati da più tabelle ecc.. cose che al momento io eseguo usando SELECT con tutte le sue opzioni e fattibile con i metodi di Gambas?
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: leo72 - 03 Giugno 2009, 06:21:10
1)
Delete dato senza parametri cancella un'intera tabella:
Codice: [Seleziona]

Connection.Delete(NomeTabella)

Per la cancellazione di un solo record, devi mettere i parametri nel comando Connection.Delete(), né più né meno di come faresti per una ricerca o un'edit. Quindi, per cancellare il record il cui campo ID, ad esempio, fosse 1234, basta dare:
Codice: [Seleziona]

Connesione.Delete(NomeTabella, "ID = &1", ValoreID)

Se invece vuoi ad esempio cancellare tutti i nominativi che si chiamano Rossi, dai:
Codice: [Seleziona]

Connessione.Delete(NomeTabella, "cognome = &1", "Rossi")


In pratica, Delete esegue una query filtrando i risultati con i parametri immessi, come se eseguissi un WHERE in SQL puro.

2)
I metodi di gestione dei record in Gambas puoi usarli insieme a query SQL. Io faccio così, infatti, utilizzando i primi per normali lavori di aggiunta, editazione e cancellazione di singoli record, mentre utilizzo l'SQL puro quando devo fare ricerche avanzate nel DB. Non c'è nessuna regola per cui devi usare o l'uno o l'altro: gli strumenti di un linguaggio sono lì apposta per aiutarti a raggiungere il tuo scopo ;-)
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 04 Giugno 2009, 00:15:19
:ok:  :-D

Un'ultima cosa, NomeTabella va messo tra doppi apici.
Grazie
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: leo72 - 05 Giugno 2009, 23:47:44
Se NomeTabella è una stringa, no. :-P
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: swan - 30 Giugno 2009, 00:00:44
ci sono casi però in cui diventa fondamentale utilizzare istruzioni sql di INSERT INTO per velocizzare le operazioni, esempio nell'importazione di dati si avrebbero sicuramente dei tempi di attesa ben più lunghi utilizzando:

connessione.open
....connessione.create("...")
....
connessione.commit

potrebbe allora essere necessario "formattare" correttamente le stringhe oppure sostituire gli apostrofi al keypress con caratteri simile, c'è un carattere che è simile all'apostrofo ma è di traverso, non lo so fare sotto linux. dov'è la mappa dei caratteri? bho!
altra cosa, quando poi fai le ricerche con le like come si comporta poi gambas con sti campi con l'apostrofo?

ciao
max
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 30 Giugno 2009, 00:31:08
Come ha detto leo un metodo non esclude l'altro, quindi se devi reperire dati nel DB che richiedono delle Select complesse o con subquery niente ti vieta di utilizzare l'SQL 'puro'.

Per quanto riguarda l'Insert ti assicuro che con il metodo di Gambas che mi è stato suggerito non ho avuto nessun problema anche con dati complessi per esempio leggendoli da GridView, ColumnView e Array superando quindi il problema di stringhe apostrofate e di conseguenza non ho problemi a fare ricerche con il predicato Like in quanto i dati vengono inseriti correttamente nel DB.
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 23 Ottobre 2009, 20:57:31
Citazione

leo72 ha scritto:
Se invece vuoi ad esempio cancellare tutti i nominativi che si chiamano Rossi, dai:
Codice: [Seleziona]

Connessione.Delete(NomeTabella, "cognome = &1", "Rossi")


In pratica, Delete esegue una query filtrando i risultati con i parametri immessi, come se eseguissi un WHERE in SQL puro.


E se volessi cancellare solo i "Rossi" di "Milano" ?
Dovrei praticamente aggiungere AND citta = "Milano" all'esempio di leo.
Ho fatto varie prove ma non ci sono riuscito, si può fare utilizzando lo stesso metodo?

C'è da qualche parte un minimo di documentazione riguardo questi metodi?
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: fsurfing - 24 Ottobre 2009, 10:39:11
purtroppo non esiste una documentazione dettagliata e completa dell' utilizzo dei metodi.
I metodi implementati da gambas secondo la mia opinione sono una comodità per riuscire a lavorare con un db senza conoscere la sintassi sql.
in alternativa puoi usare il metodo exec inserendo una query standard che effettua le tue richieste, in questo caso il lavoro sporco viene fatto dalla query , per sapere che query utilizzare hai una quasi infinita scelta di documentazione inerente il "linquaggio" SQL.

poi puoi sempre provare andando a  tentoni ad esempio con:

Codice: [Seleziona]

Connessione.Delete(NomeTabella, "cognome = &1", "Rossi","citta=&1","milano")
 

oppure
Codice: [Seleziona]

Connessione.Delete(NomeTabella, "cognome = &1","citta=&1", "Rossi","milano")
 
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 24 Ottobre 2009, 15:35:02
Accidenti alla documentazione mancante  :evil:  :evil:

Concordo pienamente con te sulla comodità dell'uso dei metodi di Gambas, da quando li ho conosciuti grazie al forum mi hanno permesso di evitare di implementare molto codice di controllo su alcune funzioni a vantaggio di una intellegibilità maggiore del codice stesso.

Per quanto riguarda l'SQL "puro" non ho grossi problemi ad implementarlo, la mia richiesta oltre che per approfondire l'argomento, era per continuare ad usare lo stesso metodo fin dove possibile.

Grazie comunque dei suggerimenti, vado avanti a "tentoni" come mi hai indicato tu in attesa di qualcosa di ufficiale.

Se qualcuno del forum ha avuto esperienza in merito si faccia pure avanti.
Grazie
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: Ceskho - 24 Ottobre 2009, 16:28:59
Vorrei invitarti (se possibile, ovviamente) a scrivere magari qualcosa a riguardo nel nostro wiki. In questo modo nessuno si troverà più nella tua stessa situazione.-
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: tornu - 24 Ottobre 2009, 20:51:26
Citazione

Ceskho ha scritto:
Vorrei invitarti (se possibile, ovviamente) a scrivere magari qualcosa a riguardo nel nostro wiki. In questo modo nessuno si troverà più nella tua stessa situazione.-


 :eh: Scusa Ceskho, ma non ho capito.
Scrivere riguardo a cosa.

P.S.: Scrivere sul wiki: mi sarebbe piaciuto partecipare, ma ho sempre avuto difficoltà a mettere per iscritto le mie conoscienze e trasmetterle agli altri in modo comprensibile (è un mio limite, purtroppo).
Mi riprometto di provarci, appena il lavoro me lo permette.
Titolo: Re: L'apostrofo in Mysql e Gambas
Inserito da: Ceskho - 25 Ottobre 2009, 12:38:03
Riguardo a tutto ciò che la documentazione non riesce a coprire efficientemente.