Boucle while pour bot discord

Résolu/Fermé
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 - 3 mars 2022 à 13:33
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 - 4 mars 2022 à 23:00
Bonjour,

J'aimerais effectuer une boucle sur une requête afin que mon bot sur discord me liste toutes les entrées d'une seul table sur 1 seul champ.

Je m'éxplique, j'ai une table avec 3 champs (id, sigle, description), j'aimerais que mon bot me liste tous les sigles seulement.

Voici le code que j'ai actuellement qui me permet mais je ne vois pas comment faire pour ajouter la boucle :

//listage des sigle déjà enregistré
	else if (message.content.startsWith(prefix + "allsigle")){
		message.delete();
		pool.query(`SELECT * FROM abreviation`, function (err, results) {
			if ( results[0] ) {
				pool.query(`SELECT * FROM abreviation`, function(err) {
				if ( err ) throw err;
					})
				 let embed = {
				color: 0x000000,
				title: '__**Liste complète des abréviations connues du bot actuellement: **__',
				description: '**' + (`${results[0].sigle}`) + '**' + '\n',
				timestamp: new Date(),
			};
				message.channel.send({ embed: embed });
			  console.log(`${message.author.username} a consulté la liste des sigles`)
			}
			else {
					message.channel.send(`${message.author}` + 'Sigle inconnu actuellement !');
				  console.log(`${message.author.username} a tenté de regarder un sigle inexistant.`)
				 
				}
					
		})
			return;
	}	


Actuellement, si je tape la commande +allsigle, il me donne le premier sigle de ma table, comment l'adapter pour obtenir toutes les entrées ?

Merci pour votre réponse.
A voir également:

3 réponses

David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
4 mars 2022 à 11:43
Bonjour,

Je viens montrer un test qui ne fait pas planter le bot mais qui ne m'affiche pas toutes les entrées de ma table :

//listage des sigle déjà enregistré
	else if (message.content.startsWith(prefix + "allsigle")){
		message.delete();
		var suffix = message.content.split(" ").slice(1).join(" ");
		pool.query(`SELECT * FROM abreviation`, function (err, results) {
			if ( results[0] ) {
				pool.query(`SELECT * FROM abreviation`, function(err) {
				if ( err ) throw err;
					})
					while (`${results[0].sigle}` > 0)
						{
							let embed = {
								color: 0x000000,
								title: '__**Liste complète des abréviations connues du bot actuellement: **__',
								description: '**' + (`${results[0].sigle}`) + '**' + '\n',
								timestamp: new Date(),
							};
							message.channel.send({ embed: embed });
							console.log(`${message.author.username} a consulté la liste des abréviations`)
					}
			}
			else {
					message.channel.send(`${message.author}` + 'Je ne connais pas encore toutes les abréviations de coc, mon encyclopédie s\'enrichit de jours en jours grâce à toi !');
				  console.log(`${message.author.username} a tenté de regarder la liste des abréviations.`)
				 
				}
					
		})
			return;
	}		


Help me please.
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
4 mars 2022 à 12:46
J'ai essayé ça aussi :

//listage des sigle déjà enregistré
	else if (message.content.startsWith(prefix + "allsigle")){
		message.delete();
		var suffix = message.content.split(" ").slice(1).join(" ");
		pool.query(`SELECT * FROM abreviation`, function (err, results) {
			if ( results[0] ) {
				pool.query(`SELECT * FROM abreviation`, function(err) {
				if ( err ) throw err;
					})
					var nbr_entree = 0;
						while (`${nbr_entree}` < `${results[0].sigle}` ) {
							nbr_entree++;
							let embed = {
								color: 0x000000,
								title: '__**Liste complète des abréviations connues du bot actuellement: **__',
								description: '**' + (`${results[0].sigle}`) + '**' + '\n',
								timestamp: new Date(),
							};
						message.channel.send({ embed: embed });
						}
						console.log(`${message.author.username} a consulté la liste des abréviations`)
			}
			else {
					message.channel.send(`${message.author}` + 'Je ne connais pas encore toutes les abréviations de coc, mon encyclopédie s\'enrichit de jours en jours grâce à toi !');
				  console.log(`${message.author.username} a tenté de regarder la liste des abréviations.`)
				 
				}
					
		})
			return;
	}


Et ça fonctionne pas, la boucle ne m'affiche pas la liste de ma table, par contre ma console m'affiche bien le message que je veux qu'elle m'affiche.
0
Salut,
pourquoi ne pas faire cela directement au niveau de la base de donnée, lors de la requête SQL?
Cela semble plus logique et éviterait d'avoir à faire des contorsions en PHP et est assez simple à écrire:

SELECT nomduchamp FROM nomdelatable;



https://sql.sh/cours/select
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
4 mars 2022 à 20:42
bonjour,

Merci pour ton aide, alors j'ai fais comme tu m'as dis :

else if (message.content.startsWith(prefix + "allsigle")){
		message.delete();
		var suffix = message.content.split(" ").slice(1).join(" ");
		pool.query(`SELECT sigle FROM abreviation`, function (err, results) {
			if ( results[0] ) {
				pool.query(`SELECT sigle FROM abreviation`, function(err) {
				if ( err ) throw err;
					})
					var nbr_entree = 0;
							let embed = {
								color: 0x000000,
								title: '__**Liste complète des abréviations connues du bot actuellement: **__',
								description: '**' + (`${results}[0].sigle`) + '**' + '\n',
								timestamp: new Date(),
							};
						message.channel.send({ embed: embed });
						console.log(`${message.author.username} a consulté la liste des abréviations`)
			}
			else {
					message.channel.send(`${message.author}` + 'Utilise la commande +commandes pour obtenir ce que je peux faire !');
				  console.log(`${message.author.username} a tenté de regarder la liste des abréviations.`)
				 
				}
					
		})
			return;
	}

Sauf que le problème c'est qu'il ne met pas les champs de la tables mais une liste de [object Object],[object Object],

une idée ?
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1 > David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022
4 mars 2022 à 20:50
Que je fasse :

(`${results}[0].sigle`)
ou ça :
(`${results}[0]`)
ça m'affiche le bon nombre de résultat mais pas le nom mais [object Object],[object Object],

help me please
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524 > David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022
4 mars 2022 à 21:21
Ajoute un console.log(results); pour voir la structure de la variable.
A priori results est un tableau d'objet (la liste des sigles), donc results[0] retourne le premier sigle, results[1] le deuxième, etc. Il faudrait plutôt faire une boucle.
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1 > Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022
4 mars 2022 à 21:36
Bonsoir et merci pour ta réponse,

Justement c'est ça le problème, c'est que je ne sais pas comment la faire la boucle avec node js.

Voici mon code :

//listage des sigle déjà enregistré
	else if (message.content.startsWith(prefix + "allsigle")){
		message.delete();
		var suffix = message.content.split(" ").slice(1).join(" ");
		pool.query(`SELECT sigle FROM abreviation`, function (err, results) {
			if ( results[0] ) {
				pool.query(`SELECT sigle FROM abreviation`, function(err) {
				if ( err ) throw err;
					})
					var nbr_entree = 0;
							let embed = {
								color: 0x000000,
								title: '__**Liste complète des abréviations connues du bot actuellement: **__',
								description: '**' + results + '**' + '\n',
								timestamp: new Date(),
							};
						message.channel.send({ embed: embed });
						console.log(`${message.author.username} a consulté la liste des abréviations`)
						console.log(results)
			}
			else {
					message.channel.send(`${message.author}` + 'Utilise la commande +commandes pour obtenir ce que je peux faire !');
				  console.log(`${message.author.username} a tenté de regarder la liste des abréviations.`)
				 
				}
					
		})
			return;
	}	


j'ai bien tous les bons résultats dans ma console, ça me met ça :
RowDataPacket < sigle: 'nom' >, (91 fois puisqu'il y à 91 lignes dans ma table)

Si tu peux m'aider pour faire cette boucle, je suis preneur.
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524 > David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022
4 mars 2022 à 22:06
Bonsoir,

La variable pool correspond à quel paquet npm (require) ? La documentation doit avoir des exemples.
C'est normal que tu exécutes deux fois la même requête sql à la suite ?
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
4 mars 2022 à 21:22
Je précise que lorsque je met

console.log(results), j'ai bien tous ce que je veux mais je n'arrive pas à ce le bot me l'affiche aussi sur le salon ou je fais ma commande.

je comprend plus rien.
0