selectionner les enregistrements et les compter

selectionner les enregistrements et les compter - PHP - Programmation

Marsh Posté le 23-06-2009 à 23:55:42    

bonjour,
 
je cherche à compter le nombre d'enregistrements et faire une
action différente pour une partie d'entre eux,
le probleme c'est que jarrive bien à les compter mais pas à recuperer les informations
 
voici mon code
 
$query = "SELECT count(*) FROM images WHERE categorie = ".$categorie." ORDER BY ID ";
$result = mysql_query($query)or die(mysql_error());
 
$resultat=mysql_fetch_row($result);
 
echo $resultat[0]; // j'affiche le nombre d'enregistrement  
 
$max= $resultat[0]-1; // je limite le traitement à $resultat[0]-1
 
 for($i=0;$i < $max;$i++)
     {
           echo $i.'<br />'.$resultat[0];
 echo $resultat[1];            // la je devrais recuperer QQ chose mais rien n'apparait
     }  
 
merci de votre aide
 

Reply

Marsh Posté le 23-06-2009 à 23:55:42   

Reply

Marsh Posté le 24-06-2009 à 08:21:34    

Il est censé avoir quoi pour toi dans $resultat[1] ?
Car ta requête ne retourne que le nombre d'enregistrements c'est tout.

Reply

Marsh Posté le 24-06-2009 à 10:09:37    

si tu as bcp d'enregistrements, est-ce que ça vaut vraiment le coup de faire un COUNT(*) ? (je parle en terme d'optimisation).


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 24-06-2009 à 10:51:34    

un SELECT COUNT(ID) serait plus efficace déjà! Et pareil, dans $resultat[1], tu espères avoir quoi :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-06-2009 à 10:57:20    

rufo a écrit :

un SELECT COUNT(ID) serait plus efficace déjà! Et pareil, dans $resultat[1], tu espères avoir quoi :??:


dans la même idée, le order dans un count il sert juste à manger du cpu.

Reply

Marsh Posté le 24-06-2009 à 11:12:56    

tout à fait (j'avais lu GROUP BY au lieu d'ORDER BY)... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-06-2009 à 14:31:44    

dans echo resultat[1] je veux afficher le contenu du champs 1 (qui s'appelle categorie aussi) de la table image
 
y a t'il un moyen de tout faire en une seule requete sql pour  
selectionner les enregistrements
les compter
les afficher  
 
merci!

Reply

Marsh Posté le 24-06-2009 à 14:39:36    

déjà, tu nous montrerais le schéma de ta BD + nous dirais précisément ce que tu veux faire, ensuite on pourrai te répondre... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-06-2009 à 14:40:44    

jerrry a écrit :

dans echo resultat[1] je veux afficher le contenu du champs 1 (qui s'appelle categorie aussi) de la table image
 
y a t'il un moyen de tout faire en une seule requete sql pour  
selectionner les enregistrements
les compter
les afficher  
 
merci!


[:sh@rdar]
1. Tu fais une requête qui sélectionne ce qui t'intéresse.
2. Tu utilises la fonction qui va bien pour compter le nombre d'enregistrements retournés.
3. Tu boucles sur un fetch pour l'affichage.

Reply

Marsh Posté le 24-06-2009 à 15:00:35    

a vue de nez, je dirais: tu vire le count, comme ca la requete ramene les champ, et le count, tu le fais en php (fonction mysql_num_rows je crois).

 


Edit: Grillaid de 20 minutes. Ca m'apprendra à rédiger un msg et revenir le valider 20mn plus tard. :D

Message cité 1 fois
Message édité par pataluc le 24-06-2009 à 15:01:18
Reply

Marsh Posté le 24-06-2009 à 15:00:35   

Reply

Marsh Posté le 24-06-2009 à 22:55:13    

bon je reviens vers vous car la deuxième partie du script l'affichage différents (selon le nombre total d'enregistrement-1 (attention ce nombre total d'enregistrement varie, donc un select avec LIMIT semble exclu)) mais qui sait?
je pencherait plutot pour une boucle dans une boucler sans savoir vraiment comment faire.
 
en clair tous les affichages des valeurs sont les mêmes sauf le dernier
qui doit être différent ,
j'ai ceci mais c'est un peu euh... (merdique?)
 
le but du script faire un marcher un carousel d'images dynamiques il est en javascript j'insere par php des variables dans un tableau,
le script ici bas est volontairement parcellaire le but comprendre l'
affichage conditionnel
 
 
la table images contient X enregistrements
Les X-1 ers enregistrement doivent etre affiche et un ";"doit etre inserer
le dernier affichage ne contient pas de ";"  (point virgule) à la fin
 
 
$query = "SELECT * FROM images WHERE categorie = ".$categorie."  ";
$result = mysql_query($query)or die(mysql_error());
$nombre_rows = mysql_num_rows($result);
 
 
 
echo $nombre_rows; // affichage du résultat
 
$max= $nombre_rows-1;
 
  echo $max;
   echo '<br/>';
  echo '<table>';
$row = mysql_fetch_array($result);
   echo '<tr>';
 $i=0;
       while($i < $max)
     {
          echo $row['image'].';';
     $i++;
     }  
 
      echo $i;
 
merci de votre aide

Reply

Marsh Posté le 25-06-2009 à 13:22:49    

c pas hyper sexy ce que tu fais. vu que tu connais la taille du tableau, fais une boucle for, ou alors, utilise un while classique de lecture de résultat:

Code :
  1. while($row = mysql_fetch_array($result)){
  2.    ...
  3. }


mais sinon, ca me semble pas tout mal... à part peut être d'éviter de ramener * alors que tu n'utilise qu'un seul champ. (select image au lieu de select *)


Message édité par pataluc le 25-06-2009 à 13:24:18
Reply

Marsh Posté le 25-06-2009 à 15:20:43    

c'est normal que t'affiche toujours la même image :??: Par ce que le $row est récupéré en dehors de la boucle là...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 25-06-2009 à 20:43:55    

pataluc a écrit :

a vue de nez, je dirais: tu vire le count, comme ca la requete ramene les champ, et le count, tu le fais en php (fonction mysql_num_rows je crois).
 
 
Edit: Grillaid de 20 minutes. Ca m'apprendra à rédiger un msg et revenir le valider 20mn plus tard. :D


 
oui et non. Si ton tableau PHP ne fait qu'une 100 aine de lignes avec un seul champ, "ça va", mais s'il récupère 250 lignes MySQL avec 15 champs pour chacune, et qu'il soit sur un vieux mutualisé, bonjour la conso de RAM ... Et vive les memory exceeds size machin ...


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 25-06-2009 à 21:55:01    

j'ai un peu avancé
remis tout dans une boucle while mais j'ai un problème, regardez en bas
la boucle d'affiche j'ai deux fois le dernier enregistrement une fois avec virgule, une fois sans (!?)
 
rappel la table images contient X enregistrements
Les X-1 ers enregistrement doivent etre affiche et une "," virgule doit être inserée
le dernier affichage ne contient pas de ","  ( virgule) à la fin
 
je selectionne tous les enregistrements d'une catégorie, ici j'ai 6 enregistrements,( ce nombre varie selon les catégories)
 
les 5 premiers enregistrement doivent etre affichés et une virgule ajoutée
le dernier ne doit pas avoir de virgule apres lui
 
 
 
 
 
j'ai maintenant ceci
$query = "SELECT * FROM images WHERE categorie = ".$categorie."  ";
$result = mysql_query($query)or die(mysql_error());
$nombre_rows = mysql_num_rows($result);
/* echo $nombre_rows; // affichage du résultat */
 
$max= $nombre_rows-1;
  echo $max;
   echo '<br/>';
     
  while($row = mysql_fetch_array($result))
 
  {  
 for($i=0;$i<$max;$i++){
$image= $row['id'].'.jpg';
$titre= $row['titre'];
$maVar = '{url: "'.$image.'", title: "'.$titre.'"},';
 
 }
 echo     $maVar;
 echo'<br/>';
}
$maVar = substr($maVar, 0, -1); // on vire la dernière virgule
 echo     $maVar;
 
qui donne cela:
5
{url: "26.jpg", title: "fff"},
{url: "27.jpg", title: "titre de la sculpture"},
{url: "28.jpg", title: "autre titre"},
{url: "34.jpg", title: "testitre"},
{url: "35.jpg", title: "testitre autre"},
{url: "36.jpg", title: "test titre autre autre"}, // ceci est en trop!?
{url: "36.jpg", title: "test titre autre autre"}
 
 
merci de vos idées constructives!

Reply

Marsh Posté le 25-06-2009 à 23:29:41    

NewsletTux a écrit :


 
oui et non. Si ton tableau PHP ne fait qu'une 100 aine de lignes avec un seul champ, "ça va", mais s'il récupère 250 lignes MySQL avec 15 champs pour chacune, et qu'il soit sur un vieux mutualisé, bonjour la conso de RAM ... Et vive les memory exceeds size machin ...


j'ai pas dit de ramener les 15 champs... et s'il veut pouvoir afficher les éléments il faut bien en ramener au moins 1. et derrière il fait un mysql_num_rows.

Reply

Marsh Posté le 25-06-2009 à 23:37:06    

jerrry a écrit :

j'ai un peu avancé ...


euh... pourquoi t'as imbriqué le for dans le while? sauf si j'y vois plus clair, c'est ca qui te fout la merde. c'est l'un ou l'autre. d'ailleurs dans ton for tu utilise même pas le $i que tu déclare. vire-le.
 
et ca le fait 2 fois parce qu'apres avoir parcouru tout tes résultat, tu refait un echo $mavar.
 
tu devrais revoir un peu boucles, et repenser le truc a partir de ton besoin original, parce que la ton code il est [:yopyopyop]
 
 
et sinon, tu seras gentil d'utiliser les balises [code] quand tu poste http://forum-images.hardware.fr/icones/message/c.gif, histoire de rendre le truc un peu plus lisible. merci.

Reply

Marsh Posté le 26-06-2009 à 01:00:41    

pataluc a écrit :


j'ai pas dit de ramener les 15 champs... et s'il veut pouvoir afficher les éléments il faut bien en ramener au moins 1. et derrière il fait un mysql_num_rows.


tout à fait, mais je voulais juste mettre en lumlière que ton raisonnement, si logique soit-il, peut avoir des limites ... (j'en ai fait les frais sur un serveur free.Fr, sans m'en rendre compte une fois, avec un tableau à 6 champs ...)


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 26-06-2009 à 10:51:52    

:cry:  
 

Code :
  1. while($row = mysql_fetch_array($result))
  2.  
  3.   {
  4. $image= $row['id'].'.jpg';
  5. $titre= $row['titre'];
  6. $maVar = '{url: "'.$image.'", title: "'.$titre.'"},';
  7.   echo     $maVar;
  8. echo'<br/>';
  9. echo'<br/>';
  10. }
  11. $maVar = substr($maVar, 0, -1); // on vire la dernière virgule  
  12. echo     $maVar;

 
 
j'ai deux echo car je veux d'abord afficher les premiers affichage avec une virgule à la fin
puis afficher le code de la derniere image sans la virgule
maintenant que j'ai viré le for j'ai le code est peut etre plus sexy le resultat
est le meme
 
 
{url: "26.jpg", title: "fff"},
 
{url: "27.jpg", title: "titre de la sculpture"},
 
{url: "28.jpg", title: "autre titre"},
 
{url: "34.jpg", title: "testitre"},
 
{url: "35.jpg", title: "testitre autre"},
 
{url: "36.jpg", title: "test titre autre autre"}, // comment puis je ne pas l'afficher?
 
{url: "36.jpg", title: "test titre autre autre"}  
 
merci

Reply

Marsh Posté le 26-06-2009 à 10:58:42    

T'es sur que c'est pas dans ta BDD que tu as deux fois le 36 ?

Reply

Marsh Posté le 26-06-2009 à 11:09:58    

Deamon a écrit :

T'es sur que c'est pas dans ta BDD que tu as deux fois le 36 ?


ben non regarde son code, il fait un echo dans la boucle while, puis encore un echo après la boucle... normal, ca répète le dernier élément.

Reply

Marsh Posté le 26-06-2009 à 11:16:04    

jerrry a écrit :

j'ai deux echo car je veux d'abord afficher les premiers affichage avec une virgule à la fin
puis afficher le code de la derniere image sans la virgule

tu aurais pu le dire plus tôt...
 
voila ce que je te propose (pas testé, mais ca doit pas être loin de ce qu'il te faut):

Code :
  1. $nbligne = mysql_num_rows($result);
  2. $i = 0;
  3. while($row = mysql_fetch_array($result))
  4. {
  5.     $image= $row['id'].'.jpg';
  6.     $titre= $row['titre'];
  7.     echo '{url: "'.$image.'", title: "'.$titre.'"}';
  8.     if ($i++ < $ngligne - 2) echo ',';
  9.     echo'<br/><br/>';
  10. }


Reply

Marsh Posté le 26-06-2009 à 11:26:24    

pataluc a écrit :


ben non regarde son code, il fait un echo dans la boucle while, puis encore un echo après la boucle... normal, ca répète le dernier élément.


 [:ddr555]  
Bon on va dire que j'ai rien dit alors.

Reply

Marsh Posté le 26-06-2009 à 11:28:12    

Deamon a écrit :


 [:ddr555]
Bon on va dire que j'ai rien dit alors.

 


c'est vendredaï. :D


Message édité par pataluc le 26-06-2009 à 11:28:22
Reply

Marsh Posté le 26-06-2009 à 12:33:21    

merci

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed