È possibile farlo con sprintf
, ma non da solo (in sicurezza). Su un sistema corretto, utilizzare snprintf
due volte, una volta per scoprire la dimensione da utilizzare e la seconda volta per farlo effettivamente. Questo dipende da snprintf
che restituisce il numero di caratteri necessari quando si esaurisce la stanza. I sistemi compatibili con Linux, BSD e C99 fanno questo; Windows in genere non lo fa. In quest'ultimo caso, sarà necessario allocare un buffer iniziale e allocarne uno più grande se snprintf
ha esito negativo (in un ciclo fino al snprintf
succede). Ma sul C99, il seguente funziona:
char *buf;
size_t sz;
sz = snprintf(NULL, 0, "select key from answer WHERE key = %s LIMIT 5;", tmp);
buf = (char *)malloc(sz + 1); /* make sure you check for != NULL in real code */
snprintf(buf, sz+1, "select key from answer WHERE key = %s LIMIT 5;", tmp);
Tuttavia, per la costruzione di SQL, è molto meglio usare prepared statements. Evitano le vulnerabilità di SQL injection (e frequentemente la necessità di sprintf
). Con loro, prepareresti la frase "seleziona chiave dalla risposta dove chiave =? Limite 5;", quindi eseguila con il parametro tmp
. Il motore SQL inserisce la stringa e rimuove la necessità di assicurarsi che sia preceduto da un escape corretto.
fonte
2009-11-17 00:13:51
Una delle ragioni per cui è meglio per legare i parametri – eckes