Image + char* + mysql

Signaler
Messages postés
24
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
27 janvier 2004
-
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006
-
Hello

Voila, j'ai un big PRBLM!!!
je desire lire une image jpg et la stocker dans uune base mysql, tout simplement.
pour cela, je lis mon fichier que je stocke dans un buffer, et je l'ecris dans un autre char* qu'est la requete...
mais voila, quand je le li, strlen(buff) fait 9343o et dans la requete, il represente 4o!!!!!!!
il doit rencontrer des char bizarre et il zappe...
du coup, j'ai fait un codee mais ca ne marche pas plus:

CFile f("plop.jpg",CFile::modeRead);
char *buff =  new char[f.GetLength()];
char *buff_tr = new char[f.GetLength()*2];

f.Read(buff, f.GetLength());

int i,j=0, longeur = f.GetLength();

for (i=0; i<longeur; i++)
{
if (buff[i] ==  <s>????</s> )
{
buff_tr[j]  = '\\';
j++;
buff_tr[j] = buff[i];
j++;
}
else
{
buff_tr[j] = buff[i];
j++;
}
}

char *requet = new char[f.GetLength()*2+100];

strcpy(requet, "UPDATE test SET image='");
strcat(requet, buff_tr);
strcat(requet, "' WHERE login="plop"");
query.exec(requet); 


dans les ??? j'ai essayer 0, '\'', '"', '\\' sans succée!
si vous avez des idées de commen faire, je vous en serez tres reconnaissant!!

j'utilise Visual C++ 6.0,/index.html mysql++.lib, la classe ostream me met plein d'erreur, la fonction mysql_escape_string ne fonctionne pas....
je ne sais pas quoi faire!

help me plize!
mici

a++ les gens...
;)

4 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
pas de strlen sur du binaire, surtout dans une image, y a plein de zeros.
BruNews, ciao...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Comme te l'a expliqué BruNews, ca ne marchera jamais à cause des '\0'. Je te suggère une solution, je ne sais pas si ca marche, pour remplacer ton UPDATE.

// Exemple de requête
const char strQuery[]= UPDATE test SET image='?' WHERE login='plop'";

// Création du statement
MYSQL_STMT * mysql_prepare(MYSQL *mysql, const char *query, unsigned long length)

// Attacher le paramètre
int mysql_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)

// Exécution du statement
int mysql_execute(MYSQL_STMT *stmt.

Kaid - kaid.fr.st
Messages postés
24
Date d'inscription
jeudi 27 février 2003
Statut
Membre
Dernière intervention
27 janvier 2004

Salut,

merci de votrte attention...

mais je ne comprend pas trop ton code...

> // Exemple de requête
> const char strQuery[]= "UPDATE test SET image='?' WHERE login='plop'";

la ok, tu fait un template c'est ca?
ou alors je comprend pas... tu met koi dans le '?' ou c'est pour plus tard...

> // Création du statement
> MYSQL_STMT * mysql_prepare(mysql, strQuery, unsigned long length);

la je comprend plus trop....
Les parametres, c koi le unsigned long lenght??
c la longeur de koi?
et puis Visual il me dit: error C2065: 'MYSQL_STMT' : undeclared identifier


> // Attacher le paramètre
> int mysql_bind_param(mysql_prepare, MYSQL_BIND *bind);

tu attache le parametre a un etat declaré avant, la ok
mais, c'est koi le bind?
et puis tjrs: error C2065: 'MYSQL_BIND' : undeclared identifier

[Coded]> // Exécution du statement
> int mysql_execute(mysql_prepare);</td></tr></table>
et la tu execute l'etat, oki...

mais ce que je ne comprend pas trop:
- quand est ce que tu atache le char* buff à la requete??

si tu peux voir cec qui va pas...
mici

tiens tant que j'y suis, j'ai reussi à mettre la classe fstream (prblm de declaration dans plusierus lib)
et j'ai mis le code de l'exemple de mysql++:
ostrstream strbuf; 
ifstream In ("plop.jpg",ios::in | ios::binary);
struct stat for_len; 
if ((In.rdbuf())->is_open())
{ 
    if (stat ("plop.jpg",&for_len) == -1) return false; 
    unsigned int blen = for_len.st_size;
    if (!blen) return false; 
    char  *read_buffer = new char[blen];
    In.read(read_buffer,blen);
    string fill(read_buffer,blen); 
    strbuf  << "UPDATE test SET image='"  << escape << fill  << "' WHERE login='plop'"; 
    query.exec(strbuf.str()); 
    delete[] read_buffer;
}

ET CA MARCHE PAS...
il me met toujours 4caracteres dans le champ image, et pas tout....

AU SECOURS!!!!!!!!!!!!!!!!!!!!!!!!!!

a++ les gens...
;)
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Je t'ai simplement mis une idée, je ne sais pas si c'est possible. N'ayant pas de base MySQL sous la main (n'ayant pas envie d'en installer une non plus), je t'ai simplement mis les prototypes des fonctions MySQL à appeller, que j'ai trouvé dans la documentation. A toi de bien utiliser ces fonctions.

Kaid - kaid.fr.st