Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2012
    Messages : 23
    Points : 3
    Points
    3

    Par défaut requête sqlite3 select

    bonjour,

    Je dispose d'une base de données qui contient la table "info" par exemple :

    Code :
    1
    2
    3
    4
     
    réf ,  numero, groupe, sexe, âge, main
    u'11A', u'11', u'A', u'male', u'21', u'right-hander')
    (u'15D', u'15', u'D', u'female', u'50', u'right-hander')
    Lorsque j'utilise la requête :

    Code :
    "select * from info where numero = %s" %value
    (value = "11") ==> ça fonctionne
    Code :
    "select * from info where sexe = %s" %value
    (value = "male") ==> ça fonctionne

    mais lorsque j'utilise

    Code :
    "select * from info where réf = %s" %value"
    (value = "11A") ==> j'obtiens l'erreur suivante : unrecognized token: "11A"

    Je ne sais plus quoi faire ... avez vous une idée SVP ?

    Merci par avance pour vos réponses.

  2. #2
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 395
    Points : 7 556
    Points
    7 556

    Par défaut

    Salut

    "select * from info where numero = %s" % value, construit la requête SQL qui sera être exécutée par SQlite.

    Le "%s" transformera en suite de caractères le paramètre passé dans "value".
    Charge à l’interpréteur de la commande (Sqlite) d'y retrouver le String, Int, Date,... attendu par le type des colonnes de la table info.

    Par défaut, un string devra être entre quotes et un nombre "sans".
    Voir n'importe quel tuto SQL "basique".

    On devrait donc écrire:
    • "select * from info where sexe = '%s'" % value
    • "select * from info where numero = %s" % value

    et donc:
    • "select * from info where réf = '%s'" % value"

    => sqlite aurait du raler de recevoir une chaine de caractères sans quote.
    Il essaie de rattraper le coup en supposant:
    • 11: commence par un nombre
    • male: commence par un caractères dans a-zA-Z, essayons string

    Avec 11A cette heuristique ne fonctionne plus et çà râle!

    Vous avez certainement lu la documentation Python sur sqlite.
    Il y est écrit:
    Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack (see http://xkcd.com/327/ for humorous example of what can go wrong).
    Dit autrement, oubliez les explications que je vous ai donné pour faire marcher votre code: construire ses requêtes SQL de cette façon n'est pas une bonne habitude à prendre.

    Prenez le temps d'apprendre à utiliser proprement l'API Sqlite chez D.Hellmann par exemple.

    Cordialement,

    - W
    Architectures Post-Modernes

  3. #3
    Invité de passage
    Homme Profil pro
    Inscrit en
    avril 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2012
    Messages : 23
    Points : 3
    Points
    3

    Par défaut

    Je te remercie pour tes explications et le lien de D. HELLMANN que je ne connaissais pas.

    Je t'avoue que j'ai peu de temps pour réalisé une application, alors j'essaye lorsque je lis plusieurs fois la même info je ne vais pas chercher midi à 14h.

    Merci bien

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •