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

Python Discussion :

Insertion de texte dans une bdd avec mysql connector [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 98
    Par défaut Insertion de texte dans une bdd avec mysql connector
    Bonjour,

    J'utilise le module mysql.connector pour communiquer avec une bdd mysql.

    La connexion se passe bien mais je voudrais faire une requête pour insérer du texte contenant plusieurs apostrophes et guillemets et cela plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    content = "Ici ça marche"
    query = ("INSERT INTO `mabase`.`matable`(`key`, `value`) VALUES('test', '" + content + "')")
    cursor_new.execute(query_create_pad)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    content = "Ici ça marche plus car je rajoute un ' "
    query = ("INSERT INTO `mabase`.`matable`(`key`, `value`) VALUES('test', '" + content + "')")
    cursor_new.execute(query_create_pad)
    Il faudrait échapper le contenu de content mais j'ai beaucoup d'apostrophes et guillemets. Il existe un moyen simple d'échapper la ligne pour l'insérer directement ? Ou une autre méthode ?

    Merci par avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Salut,

    Citation Envoyé par Daviloppeur Voir le message
    Il faudrait échapper le contenu de content mais j'ai beaucoup d'apostrophes et guillemets. Il existe un moyen simple d'échapper la ligne pour l'insérer directement ? Ou une autre méthode ?
    Il pourrait y avoir des difficultés pour écrire une chaîne de caractères "littérale" contenant des " et des '.
    Mais dans votre cas, "content" est déjà construite et la question est de la passer telle qu'elle est... au pilote de la base de donnée.
    Pour çà, il faut commencer par ouvrir un tuto. qui explique comment le faire avec mysql.connector.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    regarde les binds de variable, un petit exemple tiré d'un de mes codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    parameters = {
    	"id": m.id,
    	"author_id": m.author.id,
    	"channel_id": m.channel.id,
    	"created_at": int(m.created_at.timestamp()),
    	"reactions": json.dumps([(str(r.emoji), r.count) for r in m.reactions]),
    }
    await db.execute("""REPLACE INTO message VALUES(:id, :author_id, :channel_id, :created_at, :reactions)""", parameters)
    dans mon cas j'utilise aiosqlite mais le principe est le même, execute peux prendre un second paramètre.
    tu peux aussi utiliser des ? à la place des :key si tu passe un tuple/liste à la place d'un dictionnaire.

    Et surtout évite d'utiliser %s comme on peut voir encore, c'est déprécié maintenant.

    Edit, avec le triple quote aucun problème avec des guillemets ou apostrophes

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Salut,

    Citation Envoyé par flapili Voir le message
    Et surtout évite d'utiliser %s comme on peut voir encore, c'est déprécié maintenant.
    C'est pas déprécié pour les pilotes de base de données...
    Et si aiosqlite permet de construire ses requêtes d'une certaine façon, mysql.connector pourra en avoir choisi une autre (donc ouvrir la documentation... avant de dire des bêtises).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    C'est pour éviter (ou du moins limiter) des attaques par injection SQL il est recommandé d'utiliser les placeholders question mark (?) ou les named placeholders (:key) plutôt que le %s.
    Les placeholders questions mark sont supportés par quasiment tous les SGBD(R), attention ce n'est pas encore le cas pour les named où c'est suivant les envies de la maison ...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Citation Envoyé par flapili Voir le message
    C'est pour éviter (ou du moins limiter) des attaques par injection SQL il est recommandé d'utiliser les placeholders question mark (?) ou les named placeholders (:key) plutôt que le %s.
    Il est juste recommandé de ne pas construire et passer une chaîne de caractères mais de faire faire le boulot au pilote.
    Pour çà, il faut bien sûr qu'il y ait de quoi lui préciser quoi faire et choisir un ou plusieurs "paramstyle".

    Citation Envoyé par flapili Voir le message
    Les placeholders questions mark sont supportés par quasiment tous les SGBD(R), attention ce n'est pas encore le cas pour les named où c'est suivant les envies de la maison ...
    Pas de bol, mysql.connector ne supporte que named et format (et pas qmark).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 41
    Par défaut
    Il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    key = 'test'
    content = "Ici ça marche plus car je rajoute un ' "
    query = ("INSERT INTO `mabase`.`matable`(`key`, `value`) VALUES(%s, %s)")
    cursor_new.execute(query,(key,content))
    Les %s vont être remplacés à l'exécution par le code qui va bien en tenant compte du contenu.
    D'une manière générale, il ne faut jamais utiliser des requêtes avec des contenus, mais utiliser les chaînes de formatage (%s), afin d'éviter des problèmes de piratage de bdd.
    Surtout s'il s'agit d'un serveur web.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Citation Envoyé par jmbain Voir le message
    Il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    key = 'test'
    content = "Ici ça marche plus car je rajoute un ' "
    query = ("INSERT INTO `mabase`.`matable`(`key`, `value`) VALUES(%s, %s)")
    cursor_new.execute(query,(key,content))
    Vous avez essayé? çà fonctionne?
    Quand je vois des "`" dans INSERT INTO `mabase`.`matable`(`key`, `value`) VALUES(%s, %s)", je suis sûr que non...

    Si vous voulez faire le boulot du PO autant le faire correctement et çà commence par lire un tuto. puis coder et tester,...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 41
    Par défaut
    La question portait sur le contenu de "content".
    Bien sûr que ma réponse fonctionne ! C'est de l'utilisation courante de bdd en python.
    S'il y a des erreurs ailleurs dans le code, je compte sur vous pour nous indiquer la correction...
    On obtiendra ainsi un sujet complet et utile.

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 41
    Par défaut
    Qu'est-ce que c'est au fait le PO ?

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Citation Envoyé par jmbain Voir le message
    S'il y a des erreurs ailleurs dans le code, je compte sur vous pour nous indiquer la correction...
    On obtiendra ainsi un sujet complet et utile.
    Si vous n'avez pas le temps d'installer MySQL, mysql.connector, et de tester.... moi non plus.
    Un sujet contiendrait: "voilà j'ai codé ... en m'inspirant de la documentation et çà retourne le message d'erreur tartemolle (ou autre)."
    C'est ce qu'aurait pu répondre l'auteur du Post Originel à ma suggestion...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 98
    Par défaut
    Merci pour vos réponses.
    J'ai réussi à faire marcher mon programme en suivant vos indications.

    J'avais vu cette documentation, mais étais passé trop rapidement dessus.

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

Discussions similaires

  1. [AJAX] Insertion dans une BDD avec code Ajax/PHP
    Par cobra85 dans le forum jQuery
    Réponses: 5
    Dernier message: 17/10/2013, 20h35
  2. Réponses: 0
    Dernier message: 07/01/2013, 08h12
  3. pb Insertion d'éléments dans une table avec mySql++
    Par donkeyquote dans le forum C++
    Réponses: 1
    Dernier message: 24/02/2008, 00h39
  4. Insertion de données dans une BDD Oracle avec VB.NET
    Par DashRendar dans le forum Accès aux données
    Réponses: 7
    Dernier message: 23/01/2008, 08h47
  5. Insertion de texte dans une base mysql
    Par Greggggggg dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 28/07/2006, 22h16

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