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 :

Acces en Base avec problème d'insertion


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Acces en Base avec problème d'insertion
    bonjour

    j'ai un problème avec le processus d'insertion des donnée d'une zone de texte contenant une ou plusieurs apostrophes.


    lancerv1.py
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    # coding: utf-8  
    '''
    Created on 11 déc. 2017
     
     @author: eric
    '''
    import string
    import sys
    import datetime
    import csv
    import os
     
     
     
    from Tables import *
    from Explorateur import *
    from base import *
     
     
    if __name__ == '__main__':
        nom_fichier_path_in = explorateur_window (".//") # Recherche via explorateur
        if os.path.isfile(nom_fichier_path_in):
     
            # Ouverture du fichier destination
            nom_fichier_in = os.path.basename(nom_fichier_path_in) # Retourne le nom du fichier
            nom_fichier_path = os.path.dirname(nom_fichier_path_in) # Retourne le répertoire complet
            list_nf = os.path.split(nom_fichier_path_in) # Fractionne le chemin d'acc�s. Retourne un 
            projet = Creation_table()  # Base de données
            projet.nomrepertoire= nom_fichier_path
            projet.creer_table()
            print(projet.dbNAME)      
     
     
            fic = exercice()
            fic.libelle ="regarde l'endive"
            fic.numero =2
            fic.montant = 26.2
            print(fic)
            fic.db_insertion(projet)
     
            fic.libelle ="L'homme est vivant "
            fic.numero =3
            fic.montant = 8.25
            print(fic)
            fic.db_insertion(projet)
     
            fic.libelle ="D'or de d'argent"
            fic.numero = 4
            fic.montant = 9879.15
            print(fic)
            fic.db_insertion(projet)
     
            fic.libelle ="4 millions d'euros"
            fic.numero = 5
            fic.montant = 56
            print(fic)
            fic.db_insertion(projet)
            fic.db_insertion(projet)
    Tables.py

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    # coding: utf-8  
    import sqlite3
    import os
     
     
    class Creation_table(object):
     
        """ Structure des tables  """
     
        def __init__(self):
            self.dbNAME ='DB_primer.sq3'  
            self.nomrepertoire =None
            self.Base =None
     
        def creer_table(self):
          # Supression du fichire des la base et reconception
     
            self.dbNAME =self.nomrepertoire+'/'  +self.dbNAME
     
             # print("Lancer de la base SQLite:"+self.dbNAME )
            if(os.path.isfile(self.dbNAME)== True): #Cette méthode retourne true si le chemin spécifié 
                os.remove(self.dbNAME) # pour supprimer un fichier 
     
     
            self.Base =sqlite3.connect(self.dbNAME)  # ouverture DB
     
            curseur = self.Base.cursor() # appel au curseur
     
            table ="""CREATE TABLE Produit_0110 (
            numero INETGER,
            libelle nvarchar(150),
            montant  real);"""
     
            if(table!=""):
                try:
                    curseur.execute(table)
                    self.Base.commit()
                except:
                    print("Problème table")  
     
            self.Base.close()
    base.py

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    # coding: utf-8  
    from Tables import *
    '''
    Created on 11 déc. 2017
     
    @author: eric
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            '''
               CREATE TABLE exercice (
                numero INTEGER,
                libelle nvarchar(100),
                montant real);
     
            '''
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
     
        def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(" + str( self.numero) + ","
            rq += "'" + self.libelle + "',"
            rq += str( self.montant) + ")"
            print(rq)
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq)
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")

    le problème des insert est le suivant

    voici le résultat du print(rq)

    numero :2
    libelle : regarde l'endive
    montant : 26.2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Produit_0110 (numero, libelle, montant)  VALUES(2,'regarde l'endive',26.2)
    Insertion hs Produit_0110




    j'ai cherché une autre solution

    base.py
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # coding: utf-8  
    from Tables import *
    '''
    Created on 11 déc. 2017
     
    @author: eric
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            '''
               CREATE TABLE exercice (
                numero INTEGER,
                libelle nvarchar(100),
                montant real);
     
            '''
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
        def __csv_donnee__(self):
            resulta = [self.numero, self.libelle,self.montant]
            return resulta
        pass
     
        def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq += "  VALUES(?,?,?)"
     
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq ,  __csv_donnee__()) 
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")
    malheureusement


    numero :2
    libelle : regarde l'endive
    montant : 26.2
    Insertion hs Produit_0110
    numero :3
    libelle : L'homme est vivant
    montant : 8.25
    Insertion hs Produit_0110
    numero :4
    libelle : D'or de d'argent
    montant : 9879.15
    Insertion hs Produit_0110
    numero :5
    libelle : 4 millions d'euros
    montant : 56
    Insertion hs Produit_0110
    Insertion hs Produit_0110

    base.py (version3) et cette version marche sans prolème mais si vous avez des idees d'amélioration

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    # coding: utf-8  
    from Tables import *
    '''
    Created on 11 déc. 2017
     
    @author: eric
    '''
    from builtins import str
     
    class exercice(object):
        '''
        classdocs
        '''
     
        def __init__(self):
            '''
               CREATE TABLE exercice (
                numero INTEGER,
                libelle nvarchar(100),
                montant real);
     
            '''
            self.numero= None
            self.libelle =None
            self.montant = None
     
        def __str__(self):
            resultat = 'numero :' + str(self.numero) +'\n'
            resultat += 'libelle : ' + self.libelle +'\n'
            resultat += 'montant : '+str(self.montant)
            return resultat
     
        def __csv_donnee__(self):
            resulta = [self.numero, self.libelle,self.montant]
            return resulta
        pass
     
        def liste_donnee(self):
            resulta = (self.numero, self.libelle,self.montant)
            return resulta
        pass
     
        pass
     
     
        def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(?,?,?)"
     
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq ,  self.liste_donnee()) 
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Je n'ai pas lu tout le code, mais si ta chaine de caractère contient des apostrophes, il ne faut pas utiliser l'apostrophe aussi pour la délimiter !

    Donc quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rq += "'" + self.libelle + "',"
    Si self.libelle contient une apostrophe ca se passe mal c'est sûr !
    Ecrit plutôt comme ceci, pour délimiter ta chaine avec des guillements et non des apostrophes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rq += '"' + self.libelle + '",'
    Voire même avec des délimiteurs apostrophes triplés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rq += '''"%s"'''%self.libelle
    qui permettent de gérer aussi bien les chaines qui contiennent des apostrophes et celles qui contiennent des guillemets.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    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 688
    Par défaut
    Salut,

    Le problème n'est pas tant du côté des apostrophe que dans celui de l'utilisation de l'API.
    En effet, écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(" + str( self.numero) + ","
            rq += "'" + self.libelle + "',"
            rq += str( self.montant) + ")"
            curseur.execute(rq)
    c'est assembler la chaîne de caractère soi même. Une opération qui est fortement déconseillée (pour des questions de sécurité) dans les premiers paragraphes de la documentation.
    Il est recommandé d'utiliser la substitution de paramètre (avec '?' pour sqlite3) comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            rq = "INSERT INTO Produit_0110 (numero, libelle, montant) VALUES(?,?,?)"
            curseur.execute(rq, (self.numero,  self.libelle, self.montant))
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Le problème n'est pas tant du côté des apostrophe que dans celui de l'utilisation de l'API.
    En effet, écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(" + str( self.numero) + ","
            rq += "'" + self.libelle + "',"
            rq += str( self.montant) + ")"
            curseur.execute(rq)
    c'est assembler la chaîne de caractère soi même. Une opération qui est fortement déconseillée (pour des questions de sécurité) dans les premiers paragraphes de la documentation.
    Il est recommandé d'utiliser la substitution de paramètre (avec '?' pour sqlite3) comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            rq = "INSERT INTO Produit_0110 (numero, libelle, montant) VALUES(?,?,?)"
            curseur.execute(rq, (self.numero,  self.libelle, self.montant))
    - W

    effectivement voila pourquoi je suis partie sur ce concepte dans la derniere version de base.py

  5. #5
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut problème
    J'ai visiblement des anomalies


    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
    22
    def db_insertion(self,nombase):
     
            rq = "INSERT INTO Produit_0110"
            rq += " (numero, libelle, montant)"
            rq +="  VALUES(?,?,?)"
     
            try:
                #print(nombase.dbNAME)
     
                nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
                try:
                    curseur = nombase.cursor() # appel au curseur
                    try:
                        curseur.execute(rq ,  self.liste_donnee()) 
                    except:
                        print("Insertion hs Produit_0110")
                    nombase.commit()
                except:
                    print("problème de curseur")
                nombase.close()   
            except:
                print("acces Base impossible")
    J'ai dans certain cas ce retour "Insertion hs Produit_0110"
    A priori dans l'interprétation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     curseur.execute(rq ,  self.liste_donnee())
    mais comment puis-je voir ce qui cause problème.

    Comment remonter l'erreur ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Bonjour

    Tu pourrais déjà soit retirer ton try/except soit lever l'exception à nouveau pour avoir un message plus clair

    Sinon, as tu vérifié ce que retourne self.liste_donnee() et quel est son type ?

  7. #7
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    Citation Envoyé par DonKnacki Voir le message
    Bonjour

    Tu pourrais déjà soit retirer ton try/except soit lever l'exception à nouveau pour avoir un message plus clair

    Sinon, as tu vérifié ce que retourne self.liste_donnee() et quel est son type ?

    J'ai creer un autre cas

    une table fait de 21 champ de type nvarchar(5).
    et la donnée que retourne self.liste_donnee()
    soit
    ['0140', 'R', 'TETS', '08180', '', '', 'OPLU', '45556', 'TEI', 'L5499', '', '1900-01-01', 'None', 'S', 'zz', '', '', '', '1', '15', '']
    soit
    ['0140', 'R', 'TETS', '08180', '', '', 'OPLU', '45556', 'TEI', 'L5499', '', '1900-01-01', None, 'S', 'zz', '', '', '', '1', '15', '']

    avec


    avec un insert et values (?, ,?) 21 ? autant que de champ nvarchar

  8. #8
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    exemple

    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
    22
    23
    24
    25
         CREATE TABLE L140 (
                z1 nvarchar(4),
                z2 nvarchar(1),
                z3  nvarchar(10),
                z4 nvarchar(10),
                z5 nvarchar(10),
                z6 nvarchar(10),
                z7 nvarchar(10),
                z8 nvarchar(10),
                z9 nvarchar(10),
                z10 nvarchar(5),
                z11  nvarchar(5),
                Date_debut_Effet nvarchar(10),
                Date_Fin_Effet  nvarchar(10),
                z14 nvarchar(5),
                z15 nvarchar(5),
                z16 nvarchar(5),
                z17 nvarchar(5),
                z18 nvarchar(5),
                z19 nvarchar(1),
                z20 nvarchar(3),
                z21 nvarchar(5));
     
    CREATE INDEX [IFK_LM] ON [L140] 
            (z1, z2, z3, z5,z7,z8);

    la zone nombase.dbNAME est lie a une base de donnée sqllite3 même si cela n'est pas clairement noté dans cette exemple


    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
     
     rq = """INSERT INTO L140   
            (z1, z2, z3, z4, z5,z6  
            , z7, z8, z8, z10, z11,   
            Date_debut_Effet, Date_Fin_Effet, z14, z15,  
             z16, z17, z18, z19, z20, z21)  
            VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); """
     
     resulta = ['0140', 'R', 'ABSAN9987a', '00110', '', '', 're', '88997', 'LolTE', 'Li899', '', '1900-01-01', "None", 'S', 'zB', '', '', '', '1', '10', '']
     
     nombase =sqlite3.connect(nombase.dbNAME)  # ouverture DB
     curseur = nombase.cursor() # appel au curseur
     curseur.execute(rq,resulta)
     nombase.commit()
     nombase.close()

    curseur.execute(rq,resulta)
    sqlite3.OperationalError: near "(": syntax error

    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resulta = ('0140', 'R', 'ABSAN9987a', '00110', '', '', 're', '88997', 'LolTE', 'Li899', '', '1900-01-01', "None", 'S', 'zB', '', '', '', '1', '10', '')
    même résultat

    curseur.execute(rq,resulta)
    sqlite3.OperationalError: near "(": syntax error

  9. #9
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut --
    J'ai fait d'autre essai avec d'autre base qui fonctionne et pour celle-ci problème ...

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    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 688
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Comment remonter l'erreur ?
    Pour utiliser correctement try...except, il faut apprendre à s'en servir et les tuto. sont là où se trouvent ces informations.
    Ceci dit la documentation du module sqlite3 (que je vous ai déjà indiqué) contient aussi des exemples de gestion des erreurs. Vous y trouveriez aussi une façon efficace pour gérer les transactions avec un context manager...
    A vous de voir...

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

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/03/2015, 16h30
  2. Réponses: 11
    Dernier message: 21/05/2012, 12h42
  3. [MySQL] problème d'insertion de données à une base avec le php
    Par bibaa dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 19/08/2010, 01h11
  4. Accès à la base avec le N° personnel
    Par maxeur dans le forum Sécurité
    Réponses: 8
    Dernier message: 17/02/2007, 00h37

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