[RESOLU] affichage d'une requete sql / php

Eléphanteau du PHP | 20 Messages

29 sept. 2014, 11:13

Bonjour,
J'ai une table Resto qui se présente ainsi:


idCAResto int(10) UNSIGNED Non
date date Non 0000-00-00
typeRepas int(11) Non 0
nbRepas int(11) Non 0


ma requete sql:
$sql="select distinct date,nbRepas,typeRepas from caresto where month(date)='09'   ";
retourne ce résultat :

idCAResto date typeRepas nbRepas
1 2014-09-01 3 6
2 2014-09-01 4 2
3 2014-09-01 1 3
4 2014-09-01 9 1
5 2014-09-01 11 37
6 2014-09-01 5 3
7 2014-09-02 5 2
etc.....
Ma question est la suivante:
je souhaite afficher par date unique les colonnes typesRepas et NbRepas.à savoir
pour le
2014-09-01
ligne 1 ( typeRepas et nbrepas )
ligne 2 ( typerepas et nbrepas )
etc sans la répétition des dates
pour le
2014-09-02
ligne 7 ( typeRepas et nbrepas )
etc...
ainsi de suite
sans les repetitions des dates.
ça doit être au niveau du php et non de la requete sql, mais j'arrive pas.

Merci infiniment de votre aide

Mammouth du PHP | 571 Messages

29 sept. 2014, 12:23

bonjour,
au lieu de faire 12 requêtes( correspondant aux 12 mois) comme tu le fais en ce moment.Je te propose d'en faire une seule.A partir du résultat de la requête tu dois pouvoir construire un tableau multi-dimensionnel dont clés correspondent aux années, mois.
$sql="select  `date`,nbRepas,typeRepas, year(`date`) annee, month(`date`) mois from caresto order by year(`date`) , month(`date`)  ";
$sth=$dbh->prepare($sql);
$sth->execute();

$tabResto = array();
while($row = $sth->fetch()){
  $tabResto[$row['annee']][$row['mois']] = $row;
}
var_dump($tabResto);
//parcourir avec 2 boucles $tabResto pour afficher

Eléphanteau du PHP | 20 Messages

29 sept. 2014, 13:36

Je te remercie pour ta reponse, mais j'ai un message d'erreur.

Fatal error: Call to a member function on a non-object in c:\program files\easyphp1-8\www\carte resto\resultat_date.php on line 34

Mammouth du PHP | 571 Messages

29 sept. 2014, 15:43

je vois que tu n'utilises pas l'extension PDO mais le principe reste le même.
Mais on peut faire encore plus simple:

$link = mysql_connect("localhost", "user", "password")
    or die("Impossible de se connecter : " . mysql_error());

$sql="select  `date`,nbRepas,typeRepas from caresto order by `date`  ";
// Exécution de la requête
$result = mysql_query($sql);
if (!$result) {
    die('Requête invalide : ' . mysql_error() );
}

$dateCourante='';

while ($row = mysql_fetch_assoc($result)) {
 //la date précédente est différente de la date en cours(date extraite de la bd) alors on affiche la date en cours
  if( $dateCourante != $row['date'] ){
    $dateCourante = $row['date'];
    echo '<h3>'.$dateCourante.'</h3>';
  }
  echo $row['typeRepas'], '-', $row['nbRepas'],'<br>';
}


Eléphanteau du PHP | 20 Messages

30 sept. 2014, 08:35

Je te remercie pour ta reponse. J avance doucement mais sûrement.
Maintenant il faut que j arrive à mettre tout cela sous forme d'un tableau.
Du genre
Un tableau pour le mois entier.
Colonne Type resto avec chaque jour son nbre Repas.
Du style . Exemple
Type Resto. Date du jour
------------- -----1/09------------2/09-----3/09 etccc
Etudiants------nbResto---nbResto-----nbResto etc..
Professeurs -----nbResto----nbResto-----nbResto
Etccc

Si tu as une idée je suis preneur .
Merci encore

Mammouth du PHP | 571 Messages

01 oct. 2014, 11:58

On est bien loin de ta question initiale car ta dernière question n'a pas grand chose à voir avec la 1ère.Quant à la reponse à ta question, pour construire un tableau dynamique voilà comment faut s'y prendre:

 $sql="select  `date`,nbRepas,typeRepas, typeResto from caresto   where month(date)=9 ";
$result = mysql_query($sql);
$tab = array();
$tabDate = array();
while ($row = mysql_fetch_assoc($result)) {

 if(!isset( $tabDate ) ) {
   $tabDate[$row['date']] = $row['date']; 
 }
   $tab[$row['typeResto']][$row['date']] = $row['nbRepas'];
}

echo '<table><thead><tr><th></th>';
foreach( $tabDate as $date ){
 echo '<th>'. $date. '</th>'; //en-tête de colonne
}
echo '</thead></tr>';

foreach( $tab as $typeResto=>$values){
 echo '<tr>
	   <td>'.$typeResto .'<td>';  //1ère colonne
 foreach( $tabDate as $date ){
  
     if(array_key_exists($date, $values)) 
       echo '<td>'.$values[$date].'</td>';
     else
       echo '<td>0</td>';
 }
 echo '</tr>';
}
echo '</table>';


Eléphanteau du PHP | 20 Messages

01 oct. 2014, 13:07

D'abord merci de m'avoir répondu et de l’intérêt que tu portes à mon problème.
Je me suis trompé dans le message precedent c'est typeRepas et non type Resto

il m'affiche donc ce message d'erreur !
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\carte resto\resultat_date1.php on line 37

Mammouth du PHP | 571 Messages

01 oct. 2014, 14:08

avant d'exécuter la requête SQL assures que tu es connecté sur le serveur(mysql_connect()), que tu as sélectionné la bd:

 $link = mysql_connect("localhost", "user", "password")
    or die("Impossible de se connecter : " . mysql_error());

// Connexion à la base de données bd
$db_selected = mysql_select_db('bd', $link);
if (!$db_selected) {
   die ('Impossible de sélectionner la base de données : ' . mysql_error());
}
 $sql="select  `date`,nbRepas,typeRepas, typeResto from caresto   where month(date)=9 ";
// Exécution de la requête
$result = mysql_query($sql);
if (!$result) {
    die('Requête invalide : ' . mysql_error() );
}

$tab = array();
$tabDate = array();
while ($row = mysql_fetch_assoc($result)) {

 if(!isset( $tabDate ) ) {
   $tabDate[$row['date']] = $row['date'];
 }
   $tab[$row['typeResto']][$row['date']] = $row['nbRepas'];
}

echo '<table><thead><tr><th></th>';
foreach( $tabDate as $date ){
 echo '<th>'. $date. '</th>'; //en-tête de colonne
}
echo '</thead></tr>';

foreach( $tab as $typeResto=>$values){
 echo '<tr>
           <td>'.$typeResto .'<td>';  //1ère colonne
 foreach( $tabDate as $date ){
 
     if(array_key_exists($date, $values))
       echo '<td>'.$values[$date].'</td>';
     else
       echo '<td>0</td>';
 }
 echo '</tr>';
}
echo '</table>';




Eléphanteau du PHP | 20 Messages

01 oct. 2014, 14:15

Je n ai pas dans ma table le champ typeResto c'est une erreur de ma part.
J arrive sans aucun souci à me connecter à ma bdd.
Les champs que j'ai dans la table caresto sont les suivants
Date
typeRepas
nbRepas

Et la date est sous la forme 2014-09-30
TypeRepas et nbRepas sont des entiers.

Mammouth du PHP | 571 Messages

01 oct. 2014, 14:34

tu peux enlever typeResto dans la requête SQL.Dans le code tu peux remplacer typeResto par typeRepas

Eléphanteau du PHP | 20 Messages

01 oct. 2014, 15:46

j'avais déjà fait cela ,
il m'affiche juste une colonne du champs
typeRepas
3
4
1
9
11
5
12
6
Je suis en train de verifier pk..

pour rappel
Les resultats de ma table sont sous cette forme dans la bdd
idCAResto date typeRepas nbRepas
1 2014-09-01 3 6
2 2014-09-01 4 2
3 2014-09-01 1 3
4 2014-09-01 9 1
5 2014-09-01 11 37
etc..

merci vraiment pour ta patience et ta gentillesse

Mammouth du PHP | 571 Messages

01 oct. 2014, 16:04

je vois d'où vient l'erreur.en fait le tableau $tabDate est vide car les dates extraites de la bd ne sont jamais chargées dans ce tableau.voilà le code corrigé



 $link = mysql_connect("localhost", "user", "password")
    or die("Impossible de se connecter : " . mysql_error());

// Connexion à la base de données bd
$db_selected = mysql_select_db('bd', $link);
if (!$db_selected) {
   die ('Impossible de sélectionner la base de données : ' . mysql_error());
}
 $sql="select  `date`,nbRepas,typeRepas from caresto   where month(date)=9 ";
// Exécution de la requête
$result = mysql_query($sql);
if (!$result) {
    die('Requête invalide : ' . mysql_error() );
}

$tab = array();
$tabDate = array();
while ($row = mysql_fetch_assoc($result)) {

 if(!isset( $tabDate[$row['date']] ) ) { //!!!! 
   $tabDate[$row['date']] = $row['date'];
 }
   $tab[$row['typeResto']][$row['date']] = $row['nbRepas'];
}

echo '<table><thead><tr><th></th>';
foreach( $tabDate as $date ){
 echo '<th>'. $date. '</th>'; //en-tête de colonne
}
echo '</thead></tr>';

foreach( $tab as $typeResto=>$values){
 echo '<tr>
           <td>'.$typeResto .'<td>';  //1ère colonne
 foreach( $tabDate as $date ){
 
     if(array_key_exists($date, $values))
       echo '<td>'.$values[$date].'</td>';
     else
       echo '<td>0</td>';
 }
 echo '</tr>';
}
echo '</table>';

j'en suis désolé.ça doit pouvoir fonctionner maintenant

Eléphanteau du PHP | 20 Messages

01 oct. 2014, 16:15

t'es un chef.
Je ne sais comment te remercier.
Maintenant je vais le peaufiner.
Car les typeRepas en realité c'est sous cette forme que je vais faire.

if ($typeRepas=='1')
{
$var1="Enseignant";
}

etc...


et la date je vais la faire
sous la forme de 1/09 ou lieu quelle soit entiere

merci vraiment pour tout.
si je n'arrive pas je reviendrai vers toi

Eléphanteau du PHP | 20 Messages

01 oct. 2014, 18:12

Je bloque avec la date
car je souhaite la date sous cette forme
01-09 ou juste le date du jour.
j'ai utilisé cette fonction là
$date=date("m-d");
mais rien ne change.

sinon est -il possible de faire la somme de nbRepas par jour
exemple

colonne nbRepas par jour
rajouter une ligne en bas de chaque colonne qui me fait la somme total..3+12+126+56 = Somme Total 197

1/09
3
12
126
56
197

Merci infiniment, je profite de ta gentillesse

Mammouth du PHP | 2278 Messages

01 oct. 2014, 18:23

Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD