PHP, boucle et base de donnée

Petit nouveau ! | 2 Messages

07 juil. 2016, 11:12

Bonjour à tous,

je galère un peu pour afficher certaines données d'une base en utilisant les boucles.

Mon tableau source ressemble à cela:

fichier - taille - durée d'envoi - preneur
fichier1 - 1024 - 50 - preneur1
fichier1 - 1024 - 25 - preneur2
fichier1 - 1024 - 55 - preneur3
fichier2 - 2048 - 20 - preneur1
fichier2 - 2048 - 30 - preneur3

et je souhaite afficher un tableau au format suivant:

fichier - taille - preneur1 - preneur2 - preneur3
fichier1 - 1024 - 50 - 25 - 55
fichier2 - 2048 - 20 - N/A - 30

Toutes les données se trouvent dans la même table.

J'ai une première requête sql qui me sort la liste des preneurs de façon unique:

Code : Tout sélectionner

SELECT DISTINCT preneur FROM tableau
et j'ai une seconde requête qui me sort la liste des fichiers, la taille, la durée, les preneurs

Code : Tout sélectionner

SELECT DISTINCT fichier,taille,duree,preneur FROM tableau
Ensuite pour afficher les entêtes du tableau je prend ma première requête et utilise while
echo"<tr><th>Fichier</th><th>taille</th><th>Dure</th>";
        while($row = $result->fetch_assoc()) {
                echo "<th>".$row["preneur"]."</th>";
                }
   echo "</tr>";
là ou cela se complique c'est pour les données du tableaux qui doivent passe de colonnes en lignes.
J'arrive à afficher correctement les fichiers, taille et durée mais je galère pour afficher la durée par "preneur"
while($row2 = $result2->fetch_assoc()) {

             echo "<tr><td align=\"center\">".$row["fichier"]."</td><td align=\"center\">".$row["taille"])."</td>";
              Si preneur1 afficher durée preneur1, si preneur2, afficher durée preneur2
              Si preneur 3 n'a pas pris le fichier afficher NA
    }

Voilà j'espère avoir présenté correctement mon problème.

Merci d'avance pour votre aide.

Manu

Mammouth du PHP | 1967 Messages

07 juil. 2016, 11:23

tu devrais ajouter une étape entre la récupèration des données de la 2eme requète et l'affichage

tu crée un tableau php multidimensionel qui ressemble ceci
[fichier 1]
[preneur1] 50
[preneur2] 75
[preneur3] 25
[fichier 2]
[preneur1] 55
[preneur2] 52
[preneur3] 125
chaque ligne t'apportant les données fichier, preneur et duré :
$tab[$fichier][$preneur] = $dure;
en adaptant à ta requète bien sur.

ensuite la construction de ton tableau html sera plus simple.
tu parcours à 2 niveau ton tableau avec un double foreach imbriqué et tu fait l'affichage donnée par donnée
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 2 Messages

07 juil. 2016, 12:33

tu crée un tableau php multidimensionel qui ressemble ceci
[fichier 1]
[preneur1] 50
[preneur2] 75
[preneur3] 25
[fichier 2]
[preneur1] 55
[preneur2] 52
[preneur3] 125
chaque ligne t'apportant les données fichier, preneur et duré :
$tab[$fichier][$preneur] = $dure;
Merci Spols.

Donc cela se traduit pour moi par le code suivant pour le tableau:
$tab[$row["fichier"]][$row["preneur"]] = [$row["duree"];
tu parcours à 2 niveaux ton tableau avec un double foreach imbriqué et tu fais l'affichage donnée par donnée
là je pêche un peu, je comprend le principe:

Un premier foreach au niveau du fichier et un deuxième au niveau du preneur mais je n'arrive pas à le transposer en code. :(

Mammouth du PHP | 1967 Messages

07 juil. 2016, 13:40

il faudrait que tu stock la liste des preneurs dans un tableau aussi pour tenir compte des fichiers qui n'ont pas été pris par tous.
et la taille peut aussi être stocké dans ton tableau comme ceci
[fichier 1]
[taille] 1024
[preneur1] 50
[preneur2] 75
[preneur3] 25
[fichier 2]
[taille] 2048
[preneur1] 55
[preneur2] 52
[preneur3] 125
foreach ($tab as $file => $file_tab) {
echo "<tr><td align=\"center\">".$file."</td><td align=\"center\">".$file_tab["size"])."</td>";
foreach ($owner_tab as $owner) {
if (empty($file_tab[$owner]) echo "<td align=\"center\">na</td>";
else  echo "<td align=\"center\">".$file_tab["owner"]."</td>";
}
}
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 juil. 2016, 14:38

salut,

Il faut que tu stock dans un tableau le résultat de la requête N° (avec PDO fetchAll).
tu boucles dessus pour l'afficher une première fois

ça donne un truc dans le genre
<?php

$sql = 'SELECT DISTINCT preneur FROM tableau';
// si PDO  $preneurs = $result->fetch_all();
$preneurs = [];
while (($data = $result->fetch_assoc()) !== false) {
    $preneurs[] = $data['preneur'];
}
$result->close();

$sql = 'SELECT DISTINCT fichier,taille,duree,preneur FROM tableau';
$file = [];
while (($data = $result->fetch_assoc()) !== false) {
    if (isset($file[$data['fichier']])) {
        $d = $file[$data['fichier']];
    } else {
        $d['taille'] = $data['taille'];
    }
    $d[$data['preneur']] = $data['duree'];
    $file[$data['fichier']] = $d;
}

// affichage
foreach ($file as $fileName => $data) {
    echo '<tr>';
    echo '<td>',$fileName,'</td>';
    foreach ($data as $d) {
        echo '<td>',$d,'</td>';
    }
}
 ?>
@+
Il en faut peu pour être heureux ......