IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

C et sqlite, caractères d'échappement dans une requête SQL


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut C et sqlite, caractères d'échappement dans une requête SQL
    Bonjour,

    J'ai un programme en C qui travail avec une bdd sqlite. J'ai plusieurs requêtes SQL stockées dans des variables (chaîne de caractères). Je me suis aperçu qu'envoyer une chaîne de caractères avec une apostrophe renvoyait une erreur.
    D'après mes quelques recherches, c'est un problème très connu. Il faut doubler le caractère qui pose problème avant d'envoyer la requête.
    J'ai donc cherché s'il existe une fonction pour faire cela simplement. J'en ai trouvé en php, en python, en java, pour access, ... mais pas en C !

    Ma question est donc : existe-t-il une fonction en C qui permet de doubler un caractère dans une chaîne de caractères ? Ou alors faut-il en bricoler une ?

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Bon, j'en conclus qu'il n'y a pas de fonction toute prête. J'en ai bricolé une qui fonctionne. Elle est sûrement améliorable.

    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
        int i=0;
        int j=0;
        char str[250]="la chaîne que vous voulez vérifier"; // chaîne de caractères à vérifier
        char strNew[250]=""; // nouvelle chaîne de caractères avec caractère doublé
        char c=39; // caractère à rechercher en ascii (base décimale), 39 = ' (simple quote / apostrophe)
     
        for(i=0 ; str[i] != '\0'; i++)
    	{
    		if (str[i] == c)
    		{
    			strNew[j]=str[i];
    			strNew[j+1]=str[i];
    			j=j+2;
    		}
    		else
    		{
    			strNew[j]=str[i];
    			j=j+1;
    		}
    	}
    	str=strNew;

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Salut

    J'avais un peu cherché mais j'étais tombé sur des fonctions php. C'est quand-même bizarre qu'un tel truc "fondamental" n'existe pas en C.

    Quoi qu'il en soit, ta fonction est foireuse. Déjà ta zone de départ fait 250 c. et ta zone d'arrivée aussi bien qu'elle ait des caractères en plus. Rien que ça c'est rédhibitoire. En plus tu ne recopies pas le '\0'. Si ça marche c'est vraiment du hasard.
    Si tu veux t'amuser avec sqlite 3mn ça peut le faire mais pas si tu veux un truc fonctionnel et pérenne...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char *escape_string(char *string)
    {
    	char *new;
    	size_t i, j;
     
    	// Compter combien il y a de quotes simples (pour connaitre la taille de la chaine finale)
    	for (i=0, j=0; string[i] != '\0'; i++)
    		if (string[i] == 0x27) j++;
     
    	// Allocation chaine finale
    	if ((new=malloc((i+j+1) * sizeof(char))) == NULL) return NULL;
     
    	// Remplissage chaine finale
    	for (i=0, j=0; string[i] != '\0'; i++, j++)
    	{
    		new[j]=string[i];
    		if (string[i] == 0x27)
    		{
    			j++;
    			new[j]=0x27;
    		}
    	}
    	new[j]='\0';
    	return new;
    }

    Et tu t'en sers de la façon suivante
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *n=escape_string("ta requête sql");
    if (n == NULL)
    {
    	// traitement du pb
    	return; // le plus probable
    }
    ... (utilisation de n)...
    free(n);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    Les 250 caractères c'est pour mes besoins et même si je ne rajoute pas un caractère dans la nouvelle chaîne, je suis sur qu'elle ne dépassera pas (sur le principe je suis bien d'accord que ce n'est pas rigoureux). Mais c'est à adapter en fonction de ses propres besoins.

    Par contre j'ai complètement oublié le caractère de fin de chaîne. C'est étonnant car cela fonctionne pourtant très bien.

    Je vais modifier tout cela pour avoir une fonction plus propre.

    Merci pour les remarques.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] Échappement dans une requête préparée
    Par shadeoner dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/05/2010, 21h16
  2. Caractère d'échappement dans une shell complex
    Par trungsi dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 17/03/2010, 16h57
  3. Caractère d'échappement dans une requête ?
    Par RudyWI dans le forum VBA Access
    Réponses: 4
    Dernier message: 23/04/2008, 22h26
  4. limitation de caractére dans une requête SQL sous Acces
    Par amka dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/08/2006, 15h15
  5. pb:inserer des caractère en arabe dans une bd sql server
    Par l_faiza dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/12/2005, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo