Bonjour à tous,
J'ai aujourd'hui une page php qui affiche parfaitement dans une table html les données en provenance
d'une base de donnée Mysql. Ces données sont des chiffres d'affaires rangés ainsi :
id_ca (ex : 01)
mois_ca (ex : 06)
annee_ca (ex: 2016)
chiffre_affaire (ex : 123456)
J'ai décidé de transformer cette page pour utiliser PDO (et travailler plus tard avec l'objet DateTime).
Malheureusement, la commande mysql_data_seek($sql2,0); que j'utilisais avant et qui me permettait
de remettre le pointeur au début et faire en sorte que ma boucle "for" classe toutes mes données dans
l'ordre ne fonctionne plus !
Je dois donc repenser la structure, mais je n'ai aucune idéé sur la manière de m'y prendre !
Je ne parviens pas à trouver d'infos sur la procédure à suivre pour stocker des données d'une table
entière dans un tableau array et ensuite les ressortir en bloc ou au compte goute, (ou en ré utilisant
une partie de ma boucle for précédente)...
J'ai fais ça en guise de test, cela ne fonctionne pas :
$requete=$DB->query("SELECT * from chiffreaffaire");
$chiffreaffaire=array();
$donnees = $requete->fetchAll(PDO::FETCH_ASSOC);
foreach($donnees as $row){
$chiffreaffaire = array(
'mois'=>$row['mois_ca'],
'annee'=>$row['annee_ca'],
'ca'=>$row['chiffre_affaire']
);
}
echo '<pre>';
echo $chiffreaffaire[27];
echo '</pre>';
$requete->closeCursor();
die();
Merci de me dire si je suis sur la bonne piste et comment afficher par exemple le chiffre d'affaire du 27°
élément, et uniquement celui là !
Merci d'avance pour votre aide !
Bonsoir,
Sauf que la $chiffreaffaire vaudra toujours la dernière ligne de la table.
Il faut bien utiliser un tableau à 2 dimensions :
foreach($donnees as $row){
$chiffreaffaire[] = array(
'mois'=>$row['mois_ca'],
'annee'=>$row['annee_ca'],
'ca'=>$row['chiffre_affaire']
);
}
Normalement le résultat du fetchAll est déjà un tableau à 2 dimensions
Pour s'en assurer, faire un var_dump($donnees);
on peut aussi modifier le mode du fetch pour l'avoir en numérique ou en 'associatif' ou les deux.
Il faut aussi trier le résultat pour avoir un ordre chronologique
"SELECT * FROM chiffreaffaire ORDER BY annee_ca, mois_ca"
Merci à vous deux pour votre aide...
Effectivement, Huggy, $données est un tableau et var_dump m'en affiche tout son contenu...
array(180) { [0]=> array(4) { ["id_ca"]=> string(1) "2" ["mois_ca"]=> string(1) "8" ["annee_ca"]=> string(4) "2001" ["chiffre_ca"]=> string(4) "123456" }...etc...
et PDO::FETCH_ASSOC m'a donc fait l'association => ma partie foreach($donnees as $row){ est donc inutile...
Mais comment en extraire un élément ? - exemple le chiffre d'affaire d'aout 2015 ?
Comment également ordonner l'extraction de la totalité...
J'avais cette usine à gaz avant :
<tbody> <!-- Corps du tableau -->
<?php
// Déclaration de l'array 'mois' :
$mois = array('JANVIER','FEVRIER','MARS','AVRIL','MAI','JUIN','JUILLET','AOUT','SEPTEMBRE','OCTOBRE','NOVEMBRE','DECEMBRE');
// Déclaration des array totaux annuels :
$total= array();
for ($m=1; $m<13; $m++){
$total[$annee] = '0';
?><tr>
<td align="left"> <?php echo $mois[$m-1]; ?> </td><?php
for ($annee=2018; $annee>2009;--$annee) {?>
<td align="right"><?php
while ($data = mysql_fetch_array($sql2)){
if ($data['annee_ca']==$annee && $data['mois_ca']==$m){
$total[$annee]= $total[$annee]+$data['chiffre_ca'];
echo number_format($data['chiffre_ca'], 2, ',', '.');
}
}
echo ' ' . '</td>';
mysql_data_seek($sql2,0);
}
}?>
</tbody>
Je pense devoir ré écrire cette partie, cela ne me dérange pas, au contraire, pour en faire une
partie plus claire !
@Advancid : j'ai une fatal error sur la première ligne, la formulation de la récupération
je suppose...
@Carouge10 :
Pour qu'il se passe quelque chose, j'ai ajouté ça
$ca[$row['annee_ca']] = array(
à
$chiffreaffaire[] = array(
Sinon le tableau array ne se remplissait pas !
J'ai de mon côté cherché l'inspiration dans ce que vous m'avez donné comme infos...
J'ai du mieux avec ça :
(Infos : Désolé pour le changement de nom de quelques variables ou champs depuis le début de ce
post)
// EXERCICE
// Déclaration tableau
$ca = array();
// Requète :
$sql = 'SELECT * from chiffreaffaire';
// Exécution :
$req = $DB->query($sql);
// Récupération données :
$donnees = $req->fetchAll(PDO::FETCH_ASSOC);
// Affectation des données récupérées dans un tableau
foreach($donnees as $row){
$ca[$row['annee_ca']] = array(
'mois'=>$row['mois_ca'],
'ca'=>$row['chiffre_ca']
);
}
// Appel d'un enregistrement :
echo 'Un enregistrement au hasard : ' . '<br />';
echo 'Mois : ' . $ca[2010]['mois'] . '<br />';
echo 'Chiffre d\'affaire : ' . $ca[2010]['ca'] . '<br />';
// Vérification de la totalité des enregistrements :
echo '<br />' . 'Tableau complet : ' ;
echo '<pre>';
print_r($ca);
echo '</pre>';
die();
Sauf que le tableau complet fait 12 lignes au lieux de 150 et que je n'enregistre que
le dernier mois comme valeur (comme l'avait prédit Carouge10) :
Un enregistrement au hasard :
Mois : 12
Chiffre d'affaire : 31806
Tableau complet :
Array
(
[2001] => Array
(
[mois] => 12
[ca] => 9078
)
[2002] => Array
(
[mois] => 12
[ca] => 32813
)
Etc...
Une idée ?
@Advancid :
Alors je ne sais pas ce que j'ai fichu mais j'ai refais un copier/coller de ton code et
je n'ai plus le fatal error !?! (désolé)
J'avais pourtant bien ma requête (qui est la même que la tienne) en début de code...
EN TOUS CAS, CA FONCTIONNE ! Merci !
Un echo $donnees[2010][05]; m'affiche bien le chiffre d'affaire correspondant.
Maintenant il faut utiliser je suppose des boucles "for" pour afficher mes chiffres
de manière ordonnée ?
@Carouge10
Ta solution (que j'arrive mieux à lire que celle de Advancid compte tenu de mes connaissances PHP)
me donne pour un var_dump($données) :
array(180) { [0]=> array(4) { ["id_ca"]=> string(1) "2" ["mois_ca"]=> string(1) "8" ["annee_ca"]=> string(4) "2001" ["chiffre_ca"]=> string(4) "1241" } [1]=> array(4) ...etc...etc
Sauf que $chiffreaffaire[] se remplit avec des [1], [2], ...et que je ne sais pas bien comment ensuite je vais
appeler les années dans mes boucles ? => Avec un if ?
Je viens de faire un essai avec le même code mais avec :
$resultatRequete = $requete->fetchAll();
au lieu de ça :
$resultatRequete = $requete->fetchAll(PDO::FETCH_ASSOC);
et le résultat affiché au var_dump est le même !
Est-ce parceque l'association est faite dans la boucle foreach ?
Merci Advancid : c'est très clair !
Tu devrais ré écrire la doc de PHP ! :-)
(Je regarde dans la journée cette histoire de boucle FOR pour afficher mon tableau et reviens clôturer
ce post si je n'ai plus de question !)
Encore merci à vous 3 pour votre aide et particulièrement Advancid pour avoir résolu mon problème...
Ma page PHP utilise maintenant PDO de cette manière :
<?php
// Connexion à la base de donnée :
require_once('connexion.php');
$requete=$DB->query("SELECT * from chiffreaffaire");
$resultatRequete = $requete->fetchAll();
$donnees = array();
$total = array();
$mois_tableau = array('NULL','JANVIER','FEVRIER','MARS','AVRIL','MAI','JUIN','JUILLET','AOUT','SEPTEMBRE','OCTOBRE','NOVEMBRE','DECEMBRE');
foreach($resultatRequete as $donnee) {
$annee = $donnee['annee_ca'];
$mois = $donnee['mois_ca'];
$chiffreAffaire = $donnee['chiffre_ca'];
if (!array_key_exists($annee, $donnees)) {
$donnees[$annee] = array();
}
if (!array_key_exists($annee, $total)) {
$total[$annee] = 0;
}
$total[$annee] += $chiffreAffaire;
$donnees[$annee][$mois] = $chiffreAffaire;
}
?>
.../...
<tbody> <!-- Corps du tableau -->
<?php
for ($m=1; $m<13; $m++) { ?>
<tr>
<td align="left">
<?php echo $mois_tableau[$m]; ?>
</td><?php
for ($an=2018; $an>2009;--$an) {?>
<td align="right">
<?php echo number_format($donnees[$an][$m], 2, ',', '.') . ' ';?>
</td><?php
}?>
</tr><?php
}
?>
</tbody>
<tfoot> <!-- Pied de tableau -->
<th>TOTAUX</th>
<th align="right"><?php echo number_format($total[2018], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2017], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2016], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2015], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2014], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2013], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2012], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2011], 2, ',', '.') . ' '; ?></th>
<th align="right"><?php echo number_format($total[2010], 2, ',', '.') . ' '; ?></th>
</tfoot>
J'ai renommé les variables $mois en $mois_tableau et $annees en $an pour éviter un conflit avec celle
de l'array... Le code est beaucoup plus propre que celui sans PDO et je pense bien
meilleur en terme de perf !
Encore MERCI !