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

Android Discussion :

Erreur SQLite requête select


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 103
    Points : 59
    Points
    59
    Par défaut Erreur SQLite requête select
    Bonjour,

    Je fais une requête SELECT mais l'erreur suivante s'affiche:
    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
    06-11 11:27:11.051: E/AndroidRuntime(873): FATAL EXCEPTION: main
    06-11 11:27:11.051: E/AndroidRuntime(873): android.database.sqlite.SQLiteException: near ""Petot"": syntax error: , while compiling: SELECT nbpizzaencours FROM client WHERE nomLIKE "Petot"
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1564)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1449)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1405)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1485)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at com.example.cartedefidelite.clientBDD.getNbpizzawithNom(clientBDD.java:99)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at com.example.cartedefidelite.FideliteActivity$1.onClick(FideliteActivity.java:39)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.view.View.performClick(View.java:3480)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.view.View$PerformClick.run(View.java:13983)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.os.Handler.handleCallback(Handler.java:605)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.os.Handler.dispatchMessage(Handler.java:92)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.os.Looper.loop(Looper.java:137)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at android.app.ActivityThread.main(ActivityThread.java:4340)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at java.lang.reflect.Method.invokeNative(Native Method)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at java.lang.reflect.Method.invoke(Method.java:511)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    06-11 11:27:11.051: E/AndroidRuntime(873): 	at dalvik.system.NativeStart.main(Native Method)
    Et voici le code:
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    public class FideliteActivity extends AffichageClientActivity /*implements View.OnClickListener*/ {
    	clientBDD clibdd = new clientBDD(this);
    	EditText nombre;
    	Button detail;
    	Button ok;
    	String nomduclient;
     
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.fidelite);
    		//récupération de la valeur de l'edittext
    		Bundle objetbundle = this.getIntent().getExtras();
    	    nomduclient = objetbundle.getString("nomclient");
    		detail = (Button) findViewById(R.id.Detail);
    		ok = (Button) findViewById(R.id.valider);
    		nombre = (EditText) findViewById(R.id.nb);
    		ok.setOnClickListener(validerListener);
    		detail.setOnClickListener(detailclientListener);
    	}
     
    	private OnClickListener validerListener = new OnClickListener(){
    		public void onClick(View v){
    			if(v==ok){
    			//récupération de la valeur dans l'EditText
    			String nb = nombre.getText().toString();
    			int nbpizz = Integer.parseInt(nb);
    			//connexion à la BDD et récupération du nombre de pizza existant
    			cliBDD.open();
    			cli = cliBDD.getNbpizzawithNom(nomduclient);
    			int nbexist = cli.getNbpizzaencours();
     
    			//calcul plus affichage des avantages fidelité
    			nbexist = nbexist + nbpizz;
    			if(nbexist >=30)
    			{
    				Toast.makeText(
    						FideliteActivity.this,
    						"3 pizzas gratuites!",
    						Toast.LENGTH_LONG).show();
    				nbexist = nbexist-30;
    			}
    			else if(nbexist >=20){
    				Toast.makeText(
    						FideliteActivity.this,
    						"2 pizzas gratuites!",
    						Toast.LENGTH_LONG).show();
    				nbexist = nbexist-20;
     
    			}else if(nbexist >=10){
    				Toast.makeText(
    						FideliteActivity.this,
    						"1 pizza gratuite!",
    						Toast.LENGTH_LONG).show();
    				nbexist = nbexist-10;
    			}
    			else{
    				Toast.makeText(
    						FideliteActivity.this,
    						"Pas de pizza gratuite pour cette fois!",
    						Toast.LENGTH_LONG).show();
    			}
     
    			//mis à jour de la BDD
    			//cliBBD.updateClient(int id, client cli);
     
     
    			//fermeture de la BDD
    			cliBDD.close();
     
    			}
    		}
    	};
     
    	private OnClickListener detailclientListener = new OnClickListener(){
    		public void onClick(View v){
    		Intent versDetail = new Intent(getApplicationContext(),
    		    DetailClientActivity.class);
    			versDetail.putExtra("nomclient",nomduclient);
    			startActivity(versDetail);
     
    		}
    	};
     
    }
    Ainsi que ma fonction
    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
    public client getNbpizzawithNom(String nom) {
    		Cursor c = bdd.query(TABLE_CLIENT, new String[] { COL_PIZZAENCOURS },
    				COL_NOM + "LIKE \"" + nom + "\"", null, null, null, null);
    		return cursorToClient(c);
    	}
    public client cursorToClient(Cursor c) {
    		if (c.getCount() == 0) {
    			return null;
    		}
    		c.moveToFirst();
    		client cli = new client();
    		cli.setId(c.getInt(NUM_COL_ID));
    		cli.setNom(c.getString(NUM_COL_NOM));
    		cli.setPrenom(c.getString(NUM_COL_PRENOM));
    		cli.setAdresse(c.getString(NUM_COL_ADRESSE));
    		cli.setCp(c.getString(NUM_COL_CP));
    		cli.setVille(c.getString(NUM_COL_VILLE));
    		cli.setMail(c.getString(NUM_COL_MAIL));
    		cli.setTel(c.getString(NUM_COL_TEL));
    		cli.setNbpizzaencours(c.getInt(NUM_COL_PIZZAENCOURS));
    		cli.setNbpizzatotal(c.getInt(NUM_COL_PIZZATOTAL));
    		c.close();
    		return cli;
     
    	}
    Donc, je me suis dit que c'était comme la dernière fois, puisque j'ai rajouté cette fonction après, et que je devais donc désinstaller/réinstaller l'appli de l'émulateur, seulement l'erreur persiste

    Comment remédier à ce problème?

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Rajoute un espace avant "LIKE"

  3. #3
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    while compiling: SELECT nbpizzaencours FROM client WHERE nomLIKE "Petot"

    remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ursor c = bdd.query(TABLE_CLIENT, new String[] { COL_PIZZAENCOURS },
    				COL_NOM + "LIKE \"" + nom + "\"", null, null, null, null);
    tu fais COL_NOM + "LIKE \"" il te manque un espace.

    devrait resoudre le soucis

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 103
    Points : 59
    Points
    59
    Par défaut
    En effet, c'est mieux! Merci!
    Seulement, j'ai encore une erreur:
    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
    06-11 11:55:15.897: E/CursorWindow(1015): Failed to read row 0, column 1 from a CursorWindow which has 1 rows, 1 columns.
    06-11 11:55:15.947: E/AndroidRuntime(1015): FATAL EXCEPTION: main
    06-11 11:55:15.947: E/AndroidRuntime(1015): java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.database.CursorWindow.nativeGetString(Native Method)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.database.CursorWindow.getString(CursorWindow.java:451)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at com.example.cartedefidelite.clientBDD.cursorToClient(clientBDD.java:111)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at com.example.cartedefidelite.clientBDD.getNbpizzawithNom(clientBDD.java:101)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at com.example.cartedefidelite.FideliteActivity$1.onClick(FideliteActivity.java:39)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.view.View.performClick(View.java:3480)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.view.View$PerformClick.run(View.java:13983)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.os.Handler.handleCallback(Handler.java:605)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.os.Handler.dispatchMessage(Handler.java:92)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.os.Looper.loop(Looper.java:137)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at android.app.ActivityThread.main(ActivityThread.java:4340)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at java.lang.reflect.Method.invokeNative(Native Method)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at java.lang.reflect.Method.invoke(Method.java:511)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    06-11 11:55:15.947: E/AndroidRuntime(1015): 	at dalvik.system.NativeStart.main(Native Method)

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Je ne sais pas si c'est lié mais:
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (c.getCount() == 0) {
    			return null;
    		}
    		c.moveToFirst();
    Un simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (!c.moveToFirst())
       return null;
    suffit....

    Et aussi on ne construit jamais (ou presque) les requêtes SQL programmatiquement (pour éviter les problème au dessus):
    Au lieu de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Cursor c = bdd.query(TABLE_CLIENT, new String[] { COL_PIZZAENCOURS },
    				COL_NOM + " LIKE \"" + nom + "\"", null, null, null, null);
    on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private static final String WHERE_PIZZA_LIKE =  COL_NOM+" LIKE ?";
     
    Cursor c = bdd.query(TABLE_CLIENT, new String[] { COL_PIZZAENCOURS }, WHERE_PIZZA_LIKE, new String[] { nom }, null, null, null);
    Celà évite de s'embeter à "escaper" soit meme les paramètre (une string est délmitée par ' et non " en SQL).

    Pour finir, tu demandes une seule colonne: COL_PIZZAENCOURS, mais dans la fonction cursorToClient il y a plein d'autres colonnes d'utilisées => ca va planter.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 103
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Pour finir, tu demandes une seule colonne: COL_PIZZAENCOURS, mais dans la fonction cursorToClient il y a plein d'autres colonnes d'utilisées => ca va planter.
    L'erreur semble venir de là en effet, mais en fait j'ai une autre fonction qu'utilise toute les colonnes, alors je me suis dit que je pouvais réutiliser celle là
    Voilà les fonctions:
    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
    public client getClientwithNom(String nom) {
    		Cursor c = bdd.query(TABLE_CLIENT, new String[] { _ID, COL_NOM,
    				COL_PRENOM, COL_ADRESSE, COL_CP, COL_VILLE, COL_MAIL, COL_TEL,
    				COL_PIZZAENCOURS, COL_PIZZATOTAL }, COL_NOM + " LIKE \"" + nom
    				+ "\"", null, null, null, null);
    		return cursorToClient(c);
    	}
     
    	public client getNbpizzawithNom(String nom) {
    		Cursor c = bdd.query(TABLE_CLIENT, new String[] { COL_PIZZAENCOURS },
    				COL_NOM + " LIKE \"" + nom + "\"", null, null, null, null);
    		return cursorToClient(c);
    	}
     
    	public client cursorToClient(Cursor c) {
    		if (c.getCount() == 0) {
    			return null;
    		}
    		c.moveToFirst();
    		client cli = new client();
    		cli.setId(c.getInt(NUM_COL_ID));
    		cli.setNom(c.getString(NUM_COL_NOM));
    		cli.setPrenom(c.getString(NUM_COL_PRENOM));
    		cli.setAdresse(c.getString(NUM_COL_ADRESSE));
    		cli.setCp(c.getString(NUM_COL_CP));
    		cli.setVille(c.getString(NUM_COL_VILLE));
    		cli.setMail(c.getString(NUM_COL_MAIL));
    		cli.setTel(c.getString(NUM_COL_TEL));
    		cli.setNbpizzaencours(c.getInt(NUM_COL_PIZZAENCOURS));
    		cli.setNbpizzatotal(c.getInt(NUM_COL_PIZZATOTAL));
    		c.close();
    		return cli;
     
    	}
     
    }
    Donc voilà, est-ce que je peux réutiliser la fonction public client cursorToClient(Cursor c) en utilisant seulement la colonne COL_PIZZAENCOURS où dois je procéder autrement?
    Je vois pas trop comment faire..

    Et je vais suivre tes conseils pour les requêtes, si c'est mieux donc, merci!

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Solution 1. Utiliser des fonctions différentes.

    Solution 2. Utiliser une seule fonction, mais vérifier à chaque fois que la colonne est présente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int idx;
    Client ret = new Client(); // <= En JAVA, un nom de type commence TOUJOURS par une majuscule !
    idx = cursor.getColumnIndex(COL_NOM);
    if (idx >= 0 && !cursor.isNull(idx)) ret.setNom(cursor.getString(idx));
    idx = cursor.getColumnIndex(COL_ID);
    if (idx >= 0 && !cursor.isNull(idx)) ret.setId(cursor.getInt(idx));
    ...
    Solution 3. Toujours utiliser le même tableau de colonnes (ce qui au passage permet d'être en phase avec les NUM_xxxx)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private static String[] ALL_COLS = { _ID, COL_NOM,
    				COL_PRENOM, COL_ADRESSE, COL_CP, COL_VILLE, COL_MAIL, COL_TEL,
    				COL_PIZZAENCOURS, COL_PIZZATOTAL };
    Et utiliser ALL_COLS dans chaque query...

    Je n'aime pas la solution 2 car elle retourne des objets non complets....
    La solution 1 permet de retourner d'autres types d'objets (complets) mais multiplie la quantité de types.
    La solution 3 quant à elle récupère plus de données de la DB (donc est légèrement, mais très légèrement plus lente).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 103
    Points : 59
    Points
    59
    Par défaut
    Je pense donc opter pour la solution 1, mais comment convertir un cursor en entier?

Discussions similaires

  1. [AC-2010] erreur script : requête select
    Par vittirivizzik dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/08/2012, 14h14
  2. [MySQL] Erreur dans ma requête SELECT
    Par tentsuken dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2008, 18h07
  3. Erreur lors de la conversion d'une requête SELECT en DELETE
    Par SamLeChiseuji dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/07/2007, 15h09
  4. [Erreur de syntaxe (opérateur absent)] requête select
    Par wiss20000 dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 19/03/2007, 14h55
  5. [MySQL] Erreur de syntaxe sur ma requête SELECT
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 08/03/2006, 11h50

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