[C] Query con variabile in MySQL

di il
33 risposte

[C] Query con variabile in MySQL

Buonasera ragazzi.

Volevo chiedervi se gentilmente sapreste dirmi se è possibile inserire una variabile in una query da codice C

supponiamo ad esempio di avere il seguente codice:

select nome from persona where id = 1;

e se in c ho la seguente cosa:
int i=4;

come posso scrivere la query sopra scritta facendo( where id = valore della variabile i ? )

Grazie a tutti

33 Risposte

  • Re: [C] Query con variabile in MySQL

    std::stringstream ss;
    
    ss << "select nome from persona where id = " << i << ";";
    std::string str = ss.str();
    // str contiene la query completa.
  • Re: [C] Query con variabile in MySQL

    Ciao, grazie per la risposta.

    Il codice da te posto è in c++ se non sbaglio.

    Io avrei bisogno del codice c
  • Re: [C] Query con variabile in MySQL

    In C puoi usare sprintf
    
    char str[100];
    sprintf(str,"select nome from persona where id = %d;",i);
    //str contine la query completa
  • Re: [C] Query con variabile in MySQL

    Ti ringrazio

    Provo e ti faccio sapere
  • Re: [C] Query con variabile in MySQL

    Scusami, prima di provare ho un altro problemino tecnico.

    Per una query di insert tipo

    insert into tabella(id) values(1) ;
    se 1 lo voglio prendere dalla variabile i ?
    cioe ho ad esempio int i = 1

    come posso fare questo con la funzione da te proposta?
  • Re: [C] Query con variabile in MySQL

    Studia l'uso della sprintf
        char str[100];
        sprintf(str,"insert into tabella(id) values(%d) ;",i);
  • Re: [C] Query con variabile in MySQL

    Ammetto di non conoscere tale funzione..

    Faccio qualche prova e poi vi do un feedback
  • Re: [C] Query con variabile in MySQL

    Dunque a livello di compilazione non ci sono problemi ma,

    se scrivo :
    
    // char* query_insert = "INSERT INTO superpeer (ipSuperPeer,portNSuper,ipBoot) values ('aaabb',1,'aa');";
    
    Nel db mi trovo il dato appena inserito.

    Invece usando :
    
    char* query_insert;
        sprintf(query_insert,"insert into superpeer(ipSuperPeer,portNSuper,ipBoot) values(%s,%d,%s) ;",ip,port,ipBoot);
    
    Nel db non ottengo cambiamenti.

    Le variabili sono di questo tipo : const char* ip,int port,const char* ipBoot


    In realta in entrambi i caso ottengo in fondo un errore di segmentazione, ma, nel primo caso l'insert avviene.

    Non so il motivo..
  • Re: [C] Query con variabile in MySQL

    Mi correggo facendo la query standard non ottengo l' errore di segmentazione.

    Lo ottengo solo quando uso la sintassi particolare di query.
  • Re: [C] Query con variabile in MySQL

    Sprintf vuole dello spazio dove mettere le stringhe.
    char query_insert[100];
        sprintf(query_insert,"insert into superpeer(ipSuperPeer,portNSuper,ipBoot) values(\'%s\',%d,\'%s\') ;",ip,port,ipBoot);
  • Re: [C] Query con variabile in MySQL

    NO, NO

    Questa strada e' irta di ostacoli insormontabili nell'istante stesso in cui si esce dall'esempio banale.

    1) se cambia un parametro, si deve costruire un nuovo statement SQL. Operazione poco intelligente, soprattutto se lo statement e' complesso e magari con molti parametri

    2) se per i valori numerici ancora ancora c'e' speranza, per valori di tipo stringa iniziano i guai

    Esempi banali:

    " select * from table where name = '%s' " (il %s e' racchiuso tra singoli apici)

    se la stringa contiene un apice, viene generato uno statement SQL invalido!

    Stesso discorso se si racchiude %s tra DOPPI apici: se la stringa contiene dei doppi apici, ci si trova nella situazione precedente. Ovviamente NON SI PUO scrivere:

    " select * from table where name = %s " (il %s NON E' racchiuso tra apici)

    perche' la stringa verrebbe interpretata come nomi di campi della tabella, con risultato devastante.

    C'e' una soluzione, ovviamente: bisogna leggere la documentazone relativa alla libreria utilizzata per accedere al DB.

    In generale, queste librerie sono fatte in questo modo:

    1) creazione della connessione fornendo IP (e porta) del DB, nome del database, login e password

    2) dalla connessione si crea un prepared statement, cioe' un template di statement con cui vengono indicati i punti in cui ci sono i parametri.

    La sintassi piu' plausibile che si trovera' nella documentazione e' la seguente: lo statement va scritto come:

    " select * from table where name = ? "

    dove il '?' serve ad indicare che li ci sara' un parametro.

    3) a questo punto si impostano i parametri: il prepared statement mettera' a disposizione una serie di funzioni del tipo:

    ps.setint(int position, int value)
    ps.setstring(int position, char* string)
    ps.setdouble(int position, double value)

    Questo fa si che si passi il valore in formato nativo (e binario) e sara' la libreria a fare le opportune conversioni, fare l'escaping dei caratteri di controllo, ecc..

    4) a questo punto puo' essere richiesta l'esecuzione del prepared statement, il quale, a seconda del tipo di esecuzione, puo' ritornare un valore booleano (l'operazione e' anadata a buon fine oppure no, ad esempio una CREATE), oppure un result set (risultato di una query con SELECT).

    5) il prepared statement puo' essere riusato quante volte si vuole, ed e' sufficiente impostare, di volta in volta, i nuovi valori dei parametri

    6) come ultimo passo, si deve chiudere, nell'ordine, il result set (se presente), il prepared statement e per ultima la connessione.

    Poiche' esiste una dipendenza strettamente gerarchica tra i vari oggetti, generalmente chiudendo l'oggetto piu' alto nella gerarchia, vengono chiusi in automatico anche tutti gli oggetti figli.


    Quello di creare direttamente gli statement SQL come stringa: e' un sistema grezzo, rozzo e dozzinale (mi piace un sacco questa frase ): va bene si e no per fare le prove. Ma solo per quello.
  • Re: [C] Query con variabile in MySQL

    Ciao migliorabile, sfondi una porta aperta in quanto in java ho sempre e solo usato i preparedStatement

    Ora per uno specifico progetto devo usare il C nemmeno C++ proprio C e devo usarlo su una macchina linux o ubuntu.

    Fatta questa premessa, prima di parlare dell'argomento da te citato vorrei cercare di risolvere il problema con questo metodo.

    Se io scrivo :
    
     char* query_insert = "INSERT INTO superpeer (ipSuperPeer,portNSuper,ipBoot) values ('aaabb',1,'aa');";
    
    tutto funziona e l'insert viene fatto.

    Se invece scrivo :
    
    char* query_insert;
    sprintf(query_insert,"insert into superpeer(ipSuperPeer,portNSuper,ipBoot) values(\'%s\',%d,\'%s\') ;",ip,port,ipBoot);
    
    In questo caso ottengo :
    Errore di segmentazione (core dump creato)

    Le variabili sono di questo tipo : const char* ip,int port,const char* ipBoot

    Non capisco perchè si verifica il problema...
    Potete aiutarmi?
  • Re: [C] Query con variabile in MySQL

    Hai letto quello che ti ha scritto skynet ?
  • Re: [C] Query con variabile in MySQL

    Si, mi sono forse perso qualcosa?
Devi accedere o registrarti per scrivere nel forum
33 risposte