kikifrance Posté 18 Janvier 2008 Posté 18 Janvier 2008 Salut ! Je récupère des valeurs contenu dans un champs SQL, le champs se nomme prodlist. dans prodlist, j'ai 98,99,100. Je souhaite faire la somme de ces chiffres... J'arrive à récupérer ces données, les afficher en colonne, mais pas à les additionner... Une idée ? Au passage, je suis autodidacte((comprendre nul)) en langage PHP et je programme à l'arrache malheureusement...
Alonnka Posté 18 Janvier 2008 Posté 18 Janvier 2008 - Tu définis une variable qui vaut 0 avant ta boucle. - A chaque boucle tu lui ajoutes ta valeur. - A la fin de ta boucle tu l'affiches.
captain_torche Posté 18 Janvier 2008 Posté 18 Janvier 2008 De manière générale, il vaut mieux éviter de boucler sur un jeu de résultats, alors qu'on pourrait obtenir le même résultat en une seule requête : SELECT SUM(prodlist) FROM ta_table Accessoirement, je suis également un autodidacte. mais ce n'est pas pour cela que je dirai que je suis nul, bien au contraire !
Alonnka Posté 18 Janvier 2008 Posté 18 Janvier 2008 Moi j'ai proposé ça car apparemment il disait afficher chaque ligne donc une adition à chaque boucle ne me paraissait pas plus compliquer. Apres si il veut juste la somme en effet la requête seule suffit largement. +1 pour les autodidacte .
kikifrance Posté 18 Janvier 2008 Auteur Posté 18 Janvier 2008 En fait, je ne pensais pas à cette solution là. La réalité est plus compliquée, j'avais simplifier car j'envisageais un résultat à partir de la boucle... Je vais reformuler. Je dois récupérer les valeurs du champs prodlist. Ces valeurs sont une liste d'objets possédés par des utilisateurs. Chaque objet à une valeur différente. Par exemple, l'objet 98 vaut 13, le 99 vaut 14 et le 100 vaut 15. Les valeurs sont inscrites dans une autre table nommée valeur. Avec la configuration de mon site, je pensais à ce début de code inachevé que je ne sais plus continuer... CODE $list=$userrow["prodlist"]; $itemslist = explode(",",$userrow["list"]); $querystring = ""; foreach($itemslist as $a=>$ { $querystring .= "id='$b' OR "; } $querystring = rtrim($querystring, " OR "); $itemsquery = doquery("SELECT * FROM {{table}} WHERE $querystring ", "valeur"); while ($row = mysql_fetch_array($itemsquery)) { $result.=$row["valeur"]; }
Bigb06 Posté 18 Janvier 2008 Posté 18 Janvier 2008 Je ne vais pas réellement répondre a ta question, mais plutot donner une méthode générale pour ce genre de problème, à savoir stocker une liste d'"objets" dans un champ. donc dans votre cas il y a deux tables: une table user qui contient un champ liste d'objets une table objet pour simplifier les développements futurs, accélerer les traitements il vaut mieux ce schéma: une table user avec une clé primaire id une table objet avec une clé primaire une table intermédaire liste_objets avec deux champs: user et objet (qui sont des références aux clés primaires des tables user et objet) De cette facon, pour obtenir simplement la liste des objets du user toto select * from liste_objets where user='toto' qui va retourner user / objet toto / 98 toto / 99 toto / 100 Pour avoir la somme, en une seule requete select sum(prix) from liste_objets,objet where liste_objets.objet=objet.id and liste_objets.user='toto' Les performances entre cette solution, et celle que vous développez sont incomparables.
kikifrance Posté 18 Janvier 2008 Auteur Posté 18 Janvier 2008 bon finalement j'ai un code qui marche grace a votre aide, je pense que j'initialisait mal la valeur $valeursomme comme suivant... Qu'en pensez-vous ? CODE $valeursomme=0; $itemslist = explode(",",$userrow["prodlist"]); $querystring = ""; foreach($itemslist as $a=>$ { $querystring .= "id='$b' OR "; } $querystring = rtrim($querystring, " OR "); $itemsquery = doquery("SELECT * FROM {{table}} WHERE $querystring ", "valeur"); while ($row = mysql_fetch_array($itemsquery)) { $valeursomme=$valeursomme+$row["valeur"]; } $updatequery = doquery("UPDATE {{table}} SET somme='$valeursomme' WHERE id='".$userrow["id"]."' LIMIT 1", "users");
kikifrance Posté 18 Janvier 2008 Auteur Posté 18 Janvier 2008 Le problème c'est que je ne souhaitais pas rajouter un champs dans ma table user. Ce qui aurait été simple aussi. A propos, une question est-ce lourd d'avoir une table users avec énormément de champs ? Est-ce que ça ralenti le site ?
Bigb06 Posté 18 Janvier 2008 Posté 18 Janvier 2008 ?? Tu n'as pas besoin de rajouter des champs, tu vas meme pouvoir enlever le champ prodlist. Par contre tu vas devoir ajouter une table avec deux champs
Alonnka Posté 18 Janvier 2008 Posté 18 Janvier 2008 Bonsoir, CODE $valeursomme=0;$itemslist = explode(",",$userrow["prodlist"]); $querystring = ""; foreach($itemslist as $a=>$ { $querystring .= "id='$b' OR "; } $querystring = rtrim($querystring, " OR "); $itemsquery = doquery("SELECT * FROM {{table}} WHERE $querystring ", "valeur"); while ($row = mysql_fetch_array($itemsquery)) { $valeursomme=$valeursomme+$row["valeur"]; } $updatequery = doquery("UPDATE {{table}} SET somme='$valeursomme' WHERE id='".$userrow["id"]."' LIMIT 1", "users"); Si c'est ça que tu cherches à faire captain_torche avait raison : CODE $itemslist = explode(",",$userrow["prodlist"]);$querystring = ""; foreach($itemslist as $a=>$ { $querystring .= "id='$b' OR "; } $querystring = rtrim($querystring, " OR "); $totalquery = doquery("SELECT SUM(valeur) FROM {{table}} WHERE $querystring ", "valeur"); $total = mysql_result($totalquery,0); $updatequery = doquery("UPDATE {{table}} SET somme='$total' WHERE id='".$userrow["id"]."' LIMIT 1", "users"); Je ne sais pas pour MySQL mais pour MS SQL il n'y a même pas besoin de s'occupé à boucler sur $userrow["prodlist"] pour transformer les "," en "OR" car on peut écrire "WHERE id in ($userrow["prodlist"])" les nombres séparés par des virgules passent très bien.
wawa Posté 18 Janvier 2008 Posté 18 Janvier 2008 (modifié) Je ne sais pas pour MySQL mais pour MS SQL il n'y a même pas besoin de s'occupé à boucler sur $userrow["prodlist"] pour transformer les "," en "OR" car on peut écrire "WHERE id in ($userrow["prodlist"])" les nombres séparés par des virgules passent très bien. C'est pareil pour MySql puisqu'on envoi une chaine qui contient la requete en paramètre alors on peut très bien faire : $chaine = "WHERE test IN ( "; $chaine .= $userrow["prodlist"];$chaine .= ")";mysql_query($chaine); Modifié 18 Janvier 2008 par wawa
kikifrance Posté 18 Janvier 2008 Auteur Posté 18 Janvier 2008 Plus je comprends de plus en plus, moins je comprends rien... Bon je vais tacher de peaufiner vos idées. Chacune me parait bonne. Mais personne ne réponds à ma question: Y'a t'il une incidence sur la performance du site si la table est pleine de champs ou alors est-il préférable de la diviser en 2, avec users et users 2 par exemple...
Alonnka Posté 18 Janvier 2008 Posté 18 Janvier 2008 (modifié) Je te la refait alors . Ton code, à la fin, il donne ça : $totalquery = doquery("SELECT SUM(valeur) FROM {{table}} WHERE id IN ($userrow["prodlist"])", "valeur");$total = mysql_result($totalquery,0); En faite dans la requête SQL : WHERE id = '98' OR id = '99' OR id = '100' C'est la même chose que : WHERE id IN (98,99,100) Donc il est inutile de faire tout ton bricolage pour transformer ta liste de produits. Quand au SELECT et bien SUM(valeur) veux dire que tu veux la somme du champ "valeur". Voila, j'espère que tu as compris . Mais personne ne réponds à ma question: Y'a t'il une incidence sur la performance du site si la table est pleine de champs ou alors est-il préférable de la diviser en 2, avec users et users 2 par exemple... Normalement non, - Si tu index les champs sur lesquels tu fais souvent des WHERE - Si tu fait des "SELECT champ1, champ2" plutot que des "SELECT *" Modifié 18 Janvier 2008 par Alonnka
kikifrance Posté 20 Janvier 2008 Auteur Posté 20 Janvier 2008 Merci pour votre aide, aussi pour m'éclaircissement des dernières infos... Et ok pour les grandes tables...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant