|
peppepegasus
|
 |
« inserita:: Giugno 24, 2009, 02:32:14 pm » |
|
ciao,
ho riscontrato questo problema: devo inserire in una query dei dati e nomi dei campi sono contenuti in una variabile, la mia query è:
inserito1=`mysql --user=${utente} -p${pwdd} ${databs} -Bse "INSERT INTO sodar_windprofile ( id, data, ora, altitude '${stringa1}' ) VALUES( id,'${data1}', '${ora1}', '${colonna1}' '${stringa2}' )"`;
la stringa1 contiene i nomi dei campi che vanno inseriti nel database, e stringa2 i relativi valori, purtroppo mi da errore di sintassi perchè i nomi dei campi di stringa1 se li ritrova tra singolo apice (') cosa che non piace a mysql ma necessari per passargli la variabile. Sto sviluppando in bash di debian. Qualcuno sa come ovviare a questo problema? grazie. ciao.
|
|
|
|
« Ultima modifica: Giugno 24, 2009, 02:46:44 pm da peppepegasus »
|
Registrato
|
|
|
|
|
More+
|
 |
« Risposta #1 inserita:: Giugno 24, 2009, 02:59:54 pm » |
|
ciao,
ho riscontrato questo problema: devo inserire in una query dei dati e nomi dei campi sono contenuti in una variabile, la mia query è:
inserito1=`mysql --user=${utente} -p${pwdd} ${databs} -Bse "INSERT INTO sodar_windprofile ( id, data, ora, altitude '${stringa1}' ) VALUES( id,'${data1}', '${ora1}', '${colonna1}' '${stringa2}' )"`;
la stringa1 contiene i nomi dei campi che vanno inseriti nel database, e stringa2 i relativi valori, purtroppo mi da errore di sintassi perchè i nomi dei campi di stringa1 se li ritrova tra singolo apice (') cosa che non piace a mysql ma necessari per passargli la variabile. Sto sviluppando in bash di debian. Qualcuno sa come ovviare a questo problema? grazie. ciao.
brutalmente puoi sostituire il singolo apice con due singoli apici prima di darlo in pasto a mysql
|
|
|
|
|
Registrato
|
|
|
|
|
peppepegasus
|
 |
« Risposta #2 inserita:: Giugno 24, 2009, 03:10:19 pm » |
|
ciao, non mi è chiaro dove va fatta la sostituzione degli apici come dici visto che ce ne sono diversi  , ho fatto varie prove ma nessuna ha risolto il problema. Potresti postare la tua soluzione? grazie.
|
|
|
|
|
Registrato
|
|
|
|
|
More+
|
 |
« Risposta #3 inserita:: Giugno 24, 2009, 03:28:30 pm » |
|
ciao, non mi è chiaro dove va fatta la sostituzione degli apici come dici visto che ce ne sono diversi  , ho fatto varie prove ma nessuna ha risolto il problema. Potresti postare la tua soluzione? grazie. Se non fosse per Bash ti posterei tranquillamente la soluzione ma dato che non mi muovo bene con bash, provo spiegartelo prima di comporre la Query devi sostituire tutti gli apici singoli all'interno di Stringa1 con due singoli apici. Te lo scrivo in PHP, per chiarire il concetto stringa1=str_replace("'","''",stringa1) in pratica cerco in stringa 1 i singoli apici ' e li sostituisco con due singoli apici '' (attenzione, non sono le virgolette!) poi componi la query inserito1=`mysql --user=${utente} -p${pwdd} ${databs} -Bse "INSERT INTO sodar_windprofile ( id, data, ora, altitude '${stringa1}' ) VALUES( id,'${data1}', '${ora1}', '${colonna1}' '${stringa2}' )"`; in questo modo mysql digerisce la query, oppure anteponi ai singoli apici il blackslash In PHP comunque uso, in modo più elegante, la funzione mysql_real_escape_string() mysql_real_escape_string() calls MySQL's library function mysql_real_escape_string, which prepends backslashes to the following characters: \x00, \n, \r, \, ', " and \x1a. More+ PS: ma sei sicuro che c'è solo quell'errore? altitude '${stringa1}' '${colonna1}' '${stringa2}' non sono separati dalle virgole  . Prova a stampare a video la query risultante per verificare l'esatta sintassi.
|
|
|
|
|
Registrato
|
|
|
|
|
peppepegasus
|
 |
« Risposta #4 inserita:: Giugno 24, 2009, 10:45:18 pm » |
|
Forse non mi sono spiegato bene..nella mia stringa1 non ci sono apici, gli apici che danno problemi sono quelli all'interno della query, cioè
INSERT INTO sodar_windprofile ( id, data, ora, altitude '${stringa1}' )
quelli che dovrebbero essere in grassetto. Senza quegli apici non passa la variabile e quindi sono indispensabili però essendo i nomi dei campi contenuti in stringa1 non li vuole tra apici. No non ci sono altri errori, il fatto che siano attaccati è che c'è già lo spazio incluso all'interno di stringa1. Infatti se mi fermo ad altitude va tutto bene, è lì il problema allora! grazie..spero ora sia più chiaro e che mi possa dare una mano. ciao..
|
|
|
|
« Ultima modifica: Giugno 24, 2009, 10:47:15 pm da peppepegasus »
|
Registrato
|
|
|
|
|
More+
|
 |
« Risposta #5 inserita:: Giugno 25, 2009, 11:36:23 am » |
|
Forse non mi sono spiegato bene..nella mia stringa1 non ci sono apici, gli apici che danno problemi sono quelli all'interno della query, cioè
INSERT INTO sodar_windprofile ( id, data, ora, altitude '${stringa1}' )
quelli che dovrebbero essere in grassetto. Senza quegli apici non passa la variabile e quindi sono indispensabili però essendo i nomi dei campi contenuti in stringa1 non li vuole tra apici. No non ci sono altri errori, il fatto che siano attaccati è che c'è già lo spazio incluso all'interno di stringa1. Infatti se mi fermo ad altitude va tutto bene, è lì il problema allora! grazie..spero ora sia più chiaro e che mi possa dare una mano. ciao..
Ho capito che avevo interpretato male il discorso degli apici ma ancora non capisco la tua necessità  Ti posto parte di uno script bash che avevo fatto: GIORNO=`date +%Y-%m-%d` ORA=`date +%T`
mysql $DBname -u $USER --password=$PWD -h $HOST --execute="INSERT INTO tabella ( User, Giorno,Timbro, Ora ) VALUES ('$UTENTE', '$GIORNO', '$TIMBRO', '$ORA');"
|
|
|
|
|
Registrato
|
|
|
|
|
peppepegasus
|
 |
« Risposta #6 inserita:: Giugno 25, 2009, 11:45:07 am » |
|
ciao,
allora approfitto del tuo esempio postato e ti spiego quale è il problema..nel tuo esempio i nomi dei campi User, Giorno etc che seguono nelle parentesi tonde la parola tabella ..sono definiti, non sono una variabile, i valori che inserisci sono una variabile
--execute="INSERT INTO tabella ( User, Giorno,Timbro, Ora )
il mio problema è che i nomi dei campi (nel tuo caso user, Giorno...) sono anche essi una variabile?! Sono cioè variabili sia i nomi dei campi che quelli dei valori. Ok? grazie. ciao.
|
|
|
|
|
Registrato
|
|
|
|
|
More+
|
 |
« Risposta #7 inserita:: Giugno 25, 2009, 12:24:58 pm » |
|
ciao,
allora approfitto del tuo esempio postato e ti spiego quale è il problema..nel tuo esempio i nomi dei campi User, Giorno etc che seguono nelle parentesi tonde la parola tabella ..sono definiti, non sono una variabile, i valori che inserisci sono una variabile
--execute="INSERT INTO tabella ( User, Giorno,Timbro, Ora )
il mio problema è che i nomi dei campi (nel tuo caso user, Giorno...) sono anche essi una variabile?! Sono cioè variabili sia i nomi dei campi che quelli dei valori. Ok? grazie. ciao.
Chiaro  (perdonami) CAMPO="Giorno" GIORNO=`date +%Y-%m-%d` ORA=`date +%T`
SQL="INSERT INTO tabella ( User, $CAMPO ,Timbro, Ora ) VALUES ('$UTENTE', '$GIORNO', '$TIMBRO', '$ORA');" mysql $DBname -u $USER --password=$PWD -h $HOST --execute="$SQL"
Ho provato questa mia variante e funziona ..mentre sul tuo codice ho ancora degli scrupoli per come lo hai scritto. ciao More+
|
|
|
|
|
Registrato
|
|
|
|
|
peppepegasus
|
 |
« Risposta #8 inserita:: Giugno 25, 2009, 12:59:49 pm » |
|
Non ti preoccupare..allora ho usato una variante del tuo codice, ne ho fatto una versione ridotta, simile al tuo ma adattato al mio caso, ho fatto così:
CAMPO="speed" GIORNO=`date +%Y-%m-%d` ORA=`date +%T` velocita=100
SQL="INSERT INTO sodar_windprofile ( id, data, ora, altitude, $campo ) VALUES (id, '${data1}', '${ora1}', '${colonna1}', ${velocita});" mysql --user=${utente} -p${pwdd} ${databs} -Bse --execute="$SQL"
il problema è che non mi accade nulla nel Db non mi inserisce nulla. Mi sembra essere simile al tuo..c'è solo quel -Bse che se non c'è nel mio caso mi da errore. Boh.. grazie. ciao.
|
|
|
|
|
Registrato
|
|
|
|
|
More+
|
 |
« Risposta #9 inserita:: Giugno 25, 2009, 01:55:39 pm » |
|
Mi sembra essere simile al tuo..c'è solo quel -Bse che se non c'è nel mio caso mi da errore. Boh..
Beh le differenze sono molte di più. Per le ozioni espresse come -Bse leggi il man mysql (mai usare le cose ciecamente) il -e equilvale al mio --execute (è soltanto un'espressione ridotta) inoltre tra il -p e la password non vedo alcuno spazio ma non puoi scrivere l'istruzione in questo modo: mysql $databs -u $utente --password=$pwdd --execute="$SQL"
funziona, qualora non funzioni, verifica i dati di accesso che passi a mysql. se lavori in localhost, comunque sarebbe meglio indicare sempre l'opzione -h
|
|
|
|
|
Registrato
|
|
|
|
|
peppepegasus
|
 |
« Risposta #10 inserita:: Giugno 25, 2009, 02:17:09 pm » |
|
Allora ho modificato come mi hai detto, cioé
SQL="INSERT INTO sodar_windprofile ( id, data, ora, altitude$stringa1 ) VALUES (id, '${data1}', '${ora1}', '${colonna1}' '${stringa2}');" mysql --user=${utente} -p${pwdd} ${databs} --execute="$SQL"
mi da però questo errore ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 che errore è? non trova i valori? grazie. ciao.
|
|
|
|
|
Registrato
|
|
|
|
|
More+
|
 |
« Risposta #11 inserita:: Giugno 25, 2009, 02:24:43 pm » |
|
mi da però questo errore ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 che errore è? non trova i valori?
hai scritto 4 campi e inserito 5 valori! PS: ma sei sicuro che c'è solo quell'errore? altitude '${stringa1}' '${colonna1}' '${stringa2}' non sono separati dalle virgole  . Prova a stampare a video la query risultante per verificare l'esatta sintassi.  Te lo avevo detto!
|
|
|
|
« Ultima modifica: Giugno 25, 2009, 02:26:41 pm da More+ »
|
Registrato
|
|
|
|
|
peppepegasus
|
 |
« Risposta #12 inserita:: Giugno 25, 2009, 02:43:26 pm » |
|
è vero che non c'è la virgola ma questo perchè la stringa1 inizia con una virgola e non serve mettercene un'altra. Se metto le virgole, così: SQL="INSERT INTO sodar_windprofile ( id, data, ora, altitude, $stringa1 ) VALUES (id, '${data1}', '${ora1}', '${colonna1}', '${stringa2}');" mysql --user=${utente} -p${pwdd} ${databs} --execute="$SQL"mi da questo errore ora ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' speed, direction, vertical_intensity, vertical_sn, vertical_velocity, variance_' at line 1
cioè di nuovo un errore di sintassi..sto impazzendooo!!!  grazie per la pazienza. ciao.
|
|
|
|
|
Registrato
|
|
|
|
|
More+
|
 |
« Risposta #13 inserita:: Giugno 25, 2009, 04:07:53 pm » |
|
ma non sarebbe più semplice e comprensibile se finalmente mostrassi un chiaro esempio di cosa contengono quelle variabili ..vista l'insolito uso di inserire la virgola all'interno?
|
|
|
|
|
Registrato
|
|
|
|
|
peppepegasus
|
 |
« Risposta #14 inserita:: Giugno 26, 2009, 02:01:07 pm » |
|
Beh non ho voluto scrivere tutto il processo dall'inizio per non confondere le idee..ma ora a grande richiesta  spiego dall'inizio. Ho un file di testo di questo tipo: Altitude (m), Speed (m/s), Direction (°), Vertical Intensity, Vertical S/N (%), Vertical Velocity (m/s), Variance of VV (m/s)
20, 0.7, 130, 34419, 96, 0.03, 0.03
34, 1.9, 160, 8170, 97, 0.14, 0.05
49, 3.6, 154, 1450, 94, 0.08, 0.08
63, 4.8, 156, 549, 94, 0.10, 0.07
77, 5.9, 155, 233, 90, 0.07, 0.18
91, 8.1, 149, 145, 88, -0.08, 0.26
105, 8.2, 157, 91, 83, 0.14, 0.27
119, , , 70, 81, 0.19, 0.23
133, , , 56, 77, 0.24, 0.26
148, , , 45, 74, 0.22, 0.44
162, , , 37, 73, 0.22, 0.47
176, , , 30, 69, 0.19, 0.36
190, , , 25, 67, 0.16, 0.42
204, , , 23, 65, 0.13, 0.68
218, , , 22, 64, 0.20, 0.48
232, , , 20, 62, 0.15, 0.80
247, , , 18, 61, ,
Wind profile from 31 Mar 09, 00:00:00 to 00:10:00
20, 0.4, 136, 34174, 96, 0.10, 0.04
34, 2.2, 152, 10082, 97, 0.16, 0.05
49, 4.3, 144, 1594, 94, -0.01, 0.09
63, 4.9, 150, 665, 94, 0.12, 0.11
77, 6.6, 149, 286, 91, 0.11, 0.16
91, 8.5, 146, 166, 89, 0.04, 0.22
105, , , 95, 83, 0.16, 0.29questo file lo devo leggere riga per riga e prendere i valori delle varie grandezze e inserirle in un database. Quando sono presenti tutti i valori non ci sono problemi, quando invece il valore non c'è io voglio che nel database mette il NULL. Ho pensato in un primo tempo di creare una stringa variabile che contenesse solo i campi in cui ho dato. Con un if controllo la presenza del dato e ins tringa1 faccio scrivere il campo (speed, direction etc) e nella stringa2 metto il relativo valore. Un esempio di if è questo if [ "$colonna7" = "$var_vuota" ] then stringa1=$stringa1 stringa2=$stringa2 else stringa1="$stringa1, $variance_of_vv" stringa2="$stringa2, $colonna7" fi quindi alla fine devo scrivere nel db..e qui si ricollega al resto che ho detto. spero di essere stato più chiaro. ciao
|
|
|
|
|
Registrato
|
|
|
|
|