IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

mySQL/PHP et algorithmique (comment créer un tableau HTML avec le résultat de la requête) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut mySQL/PHP et algorithmique (comment créer un tableau HTML avec le résultat de la requête)
    Salut, et déso si je poste pas au bon endroit ^^

    Soit 3 tables : articles, association et tags ; à l'aide d'une requête avec jointure j'obtiens donc une liste de tout ça.
    Sauf qu'après en PHP j'arrive pas à faire un tableau conforme : il manque les <td> vides.

    Table articles :
    ID STATUS DATE TITRE CORPS
    1 pub 201706071433 titre du billet 1 corps du billet 1
    2 dep 201706091112 titre du billet 2 corps du billet 2

    Table associations :
    IDART IDTAG
    1 2
    1 3
    1 4
    1 5
    1 6
    2 4
    2 3

    Table tags :
    ID TAG
    1 Non classé
    2 cuisine
    3 loisir
    4 maison
    5 mode
    6 musique

    La requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select * from articles
    inner join associations on
    associations.idart = articles.id
    inner join tags on
    associations.idtag = tags.id
    order by id
    Me retourne :
    ID STATUS DATE TITRE CORPS IDART IDTAG TAG
    ...
    2 dep 201706091112 titre du billet 2 corps du billet 2 2 4 maison
    ...
    Jusque là, tout va bien
    Maintenant le code PHP suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <table>
    	<tr>
    		<th>ID</th>
    		<th>Status</th>
    		<th>Date</th>
    		<th>Titre</th>
    		<th>Corps</th>
    		<th>Étiquette 1</th>
    		<th>Étiquette 2</th>
    		<th>Étiquette 3</th>
    		<th>Étiquette 4</th>
    		<th>Étiquette 5</th>
    	</tr>
    <?php
     
    $myBase  = 'sqlite:../mysqlitedatabase/base.sqlite' ;
    $myPDO   = new PDO($myBase) or die("cannot open the database") ;
     
    $listAll = 'select * from articles
    	inner join associations on
    	associations.idart = articles.id
    	inner join tags on
    	associations.idtag = tags.id
    	order by id' ;
     
    $myOldId = '' ;
    $myNewId = '' ;
    $nTags = 0 ;
    foreach ($myPDO->query($listAll) as $row) {
     
    	$myNewId = $row[0] ;
    	if ($myNewId != $myOldId) {
    		$nTags = 1 ;
    		print '<tr>' ;
    		print '<td>'.$row[0].'</td>
    			   <td>'.$row[1].'</td>
    			   <td>'.$row[2].'</td>
    			   <td>'.$row[3].'</td>
    			   <td>'.$row[4].'</td>' ;
    		print '<td>'.$row[8].'</td>' ;
    		} else {
    			$nTags++ ;
    			print '<td>'.$row[8].'</td>';
    			}
    	$myOldId = $myNewId ;
     
    	}
    	print '</tr>' ;
     
    ?>
    </table>
    ...me retourne ce tableau dégueu où il manque les <td> vides :
    Nom : Screenshot at 2017-06-14 14:03:05.png
Affichages : 491
Taille : 29,8 Ko

    Ma question est donc où dois-je insérer la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print '<td>&nbsp;</td>';
    Mercià vous pour votre aide.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La version propre serait de
    - faire une requête pour compter le nombre maximal d'etiquettes
    - lire les résultats, les classer dans un tableau par id
    - écrire le tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <?php
     
    $myBase  = 'sqlite:../mysqlitedatabase/base.sqlite' ;
    $myPDO   = new PDO($myBase) or die("cannot open the database") ;
     
    $query = 'SELECT MAX(nb) FROM
    	(select COUNT(*) as nb from articles
    	inner join associations on
    	associations.idart = articles.id
    	inner join tags on
    	associations.idtag = tags.id
    	GROUP BY id) c';
     
    $sth = $myPDO->query($query);
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    $max_etiquette = $row[0];
     
    ?>
    <table>
    	<tr>
    		<th>ID</th>
    		<th>Status</th>
    		<th>Date</th>
    		<th>Titre</th>
    		<th>Corps</th>
    <?php
    	for ($x = 0; $x < $max_etiquette; $x++) {
    		echo '<th>Étiquette ' .  ($x + 1) . '</th>';
    	}
    ?>
    	</tr>
    <?php
     
    $listAll = 'select * from articles
    	inner join associations on
    	// associations.idart = articles.id
    	inner join tags on
    	associations.idtag = tags.id
    	order by id' ;
     
    foreach ($myPDO->query($listAll) as $row) {
    	if (!isset($result[$row[0]])) {
            $result[$row[0]] = array($row[1], $row[2], $row[3], $row[4]);
    	}
    	$result[$row[0]]['etiquette'][] = $row[8];
    }
     
     
     
    foreach ($result as $id=>$data) {
    	echo '<tr>
    		<td>'.$data[0].'</td>
    		<td>'.$data[1].'</td>
    		<td>'.$data[2].'</td>
    		<td>'.$data[3].'</td>
    		<td>'.$data[4].'</td>
    		<td>'.implode('</td><td>', $data['etiquette']) . '</td>';
    	$n_etiquette = count($data['etiquette']);
    	if ($netiquette < $max_etiquette) {
    		echo str_repeat('<td></td>', $max_etiquette - $n_etiquette);
    	}
    }
    ?>
    </tr>
    </table>
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    Ça me retourne une erreur fatale.
    Mais d'après ton code, ça va me faire un tableau des étiquettes ; or ce que je voudrais au final c'est un tableau avec les articles ET les étiquettes corrspondantes.

    J'galère sévère là

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si tu ne donnes pas l'erreur c'est difficile de t'aider.

    ça va me faire un tableau des étiquettes
    Non ça donne le tableau que tu as demandé.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    Bon OK,
    faut que je creuse ta soluce alors.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    J'ai une erreur à la ligne 16 de ton code ; voila ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $myBase  = 'sqlite:mysqlitedatabase/base.sqlite' ;
    $myPDO   = new PDO($myBase) or die("cannot open the database") ;
     
    $query = 'select max(id) as nb from articles' ;
    $sth = $myPDO->query($query);
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    $max_etiquette = $row[0];
    Ça me renvoie :

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Plutôt comme ça, sans changer la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $row = $sth->fetch(PDO::FETCH_NUM);
    $max_etiquette = $row[0];
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    Entre temps j'ai progressé un peu. J'en suis au moment de remplir le tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
     
    $myBase  = 'sqlite:mysqlitedatabase/base.sqlite' ;
    $myPDO   = new PDO($myBase) or die("cannot open the database") ;
     
    $query = 'select COUNT(*) as nb from tags';
    $max_etiquette = $myPDO->query($query)->fetchColumn() ; // 6
     
    ?>
     
    <table>
    	<tr>
    		<th>ID</th>
    		<th>Status</th>
    		<th>Date</th>
    		<th>Titre</th>
    		<th>Corps</th>
     
    <?php
    	for ($n=0 ; $n<$max_etiquette ; $n++) {
    		echo '<th>Étiquette '.($n+1).'</th>' ;
    		}
    ?>
     
    </tr>
     
    <?php
     
    $listAll = 'select * from articles
    			inner join associations on
    			associations.idart = articles.id
    			inner join tags on
    			associations.idtag = tags.id
    			order by id' ;
     
    foreach ($myPDO->query($listAll) as $row) {
    	$result[$row[0]] = array($row[1], $row[2], $row[3], $row[4]);
    	$result[$row[0]]['etiquette'][] = $row[8];
    	}
     
    foreach ($result as $id=>$data) {
    	echo '<tr>' ;
    	echo '' ;
    	echo '</tr>' ;
    	}
     
    ?>
     
    </table>

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    La dernière boucle !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    foreach ($myPDO->query($listAll) as $row) {
    	$result[$row[0]] = array($row[1], $row[2], $row[3], $row[4]);
    	$result[$row[0]]['etiquette'][] = $row[8];
    	}
     
    foreach ($result as $id=>$data) {
    	echo '<tr>' ;
    	echo '<td>'.$id.'</td>' ;
    	echo '<td>'.$data[0].'</td>' ;
    	echo '<td>'.$data[1].'</td>' ;
    	echo '<td>'.$data[2].'</td>' ;
    	echo '<td>'.$data[3].'</td>' ;
    	echo '</tr>' ;
    	}
    Me reste donc plus qu'à mettre les étiquettes

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    Cette fois c'est bon, enfin j'espère ^^
    Ouf !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <?php
     
    	$myBase  = 'sqlite:mysqlitedatabase/base.sqlite' ;
    	$myPDO   = new PDO($myBase) or die("cannot open the database") ;
     
    	$query = 'select COUNT(*) as nb from tags';
    	$max_etiquette = $myPDO->query($query)->fetchColumn() ; // 6
     
    ?>
     
    <table>
    	<tr>
    	<th>ID</th>
    		<th>Status</th>
    		<th>Date</th>
    		<th>Titre</th>
    		<th>Corps</th>
     
    <?php
    	for ($n=0 ; $n<($max_etiquette-1) ; $n++) {
    		echo '<th>Étiquette '.($n+1).'</th>' ;
    		}
    ?>
     
    </tr>
     
    <?php
     
    	$listAll = 'select * from articles
    				inner join associations on
    				associations.idart = articles.id
    				inner join tags on
    				associations.idtag = tags.id
    				order by id' ;
     
    	foreach ($myPDO->query($listAll) as $row) {
    		if (!isset($result[$row[0]])) {
    			$result[$row[0]] = array($row[1], $row[2], $row[3], $row[4]);
    			}
    		$result[$row[0]]['etiquette'][] = $row[8];
    		}
     
    	foreach ($result as $id=>$data) {
     
    		echo '<tr>' ;
    		echo '<td>'.$id.'</td>' ;
    		echo '<td>'.$data[0].'</td>' ;
    		echo '<td>'.$data[1].'</td>' ;
    		echo '<td>'.$data[2].'</td>' ;
    		echo '<td>'.$data[3].'</td>' ;
     
    		echo '<td>'.implode('</td><td>', $data['etiquette']) . '</td>';
    		$n_etiquette = count($data['etiquette']);
     
    		if ($n_etiquette < $max_etiquette) {
    			echo str_repeat('<td></td>', ($max_etiquette-1) - $n_etiquette);
    			}
     
    		echo '</tr>' ;
     
    		}
     
    ?>
     
    </table>
    J'obtiens un joli tableau bien propre qu'il me reste plus qu'à styler.
    Merci.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    Et maintenant faut que je paginne tout ça !
    J'ai ouvert un fil ici.
    Encore merci pour le coup de main.

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Attention la première requête ne doit pas renvoyer le nombre de tags mais le nombre maximum de tags par article.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mai 2008
    Messages : 121
    Points : 65
    Points
    65
    Par défaut
    Ça a pourtant l'ai de fonctionner : j'ai des articles avec 5 tags, d'autres avec 2 et le reste avec 1 seul ; et tout s'affiche correctement...

    Je sens la tuile là... Ou bien ?

    $nbArtsQ = 'select count(*) as nbArts from articles' ;
    C'est pas bon ?

    Je remets le code final et propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <?php
     
    	$myBase  = 'sqlite:mysqlitedatabase/base.sqlite' ;
    	$myPDO   = new PDO($myBase) or die("cannot open the database") ;
     
    	$nbTagsQ = 'select COUNT(*) as nb from tags';
    	$nbTags  = $myPDO->query($nbTagsQ)->fetchColumn() ;
     
    	$listAll = 'select * from articles
    				inner join associations on
    				associations.idart = articles.id
    				inner join tags on
    				associations.idtag = tags.id
    				order by articles.id' ;
     
    ?>
     
    <h2>Gestion des articles</h2>
     
    <p>Cliquez sur un article pour le gérer.</p>
     
    <table>
    	<tr>
    		<th>ID</th>
    		<th>Status</th>
    		<th>Date</th>
    		<th>Titre</th>
    		<th>Corps</th>
     
    <?php
    	for ($n=0 ; $n<($nbTags-1) ; $n++) {
    		echo '<th>Étiquette '.($n+1).'</th>' ;
    		}
    ?>
     
    </tr>
     
    <?php
     
    	foreach ($myPDO->query($listAll) as $row) {
    		if (!isset($result[$row[0]])) {
    			$result[$row[0]] = array($row[1], $row[2], $row[3], $row[4]);
    			}
    		$result[$row[0]]['etiquette'][] = $row[8];
    		}
     
    	foreach ($result as $id=>$data) {
     
    		echo '<tr class="CL_rows" onClick="console.log('.$id.')">' ;
    		echo '<td>'.$id.'</td>' ;
    		echo '<td>'.$data[0].'</td>' ;
    		echo '<td>'.$data[1].'</td>' ;
    		echo '<td>'.$data[2].'</td>' ;
    		echo '<td>'.$data[3].'</td>' ;
     
    		echo '<td>'.implode('</td><td>', $data['etiquette']) . '</td>';
    		$n_etiquette = count($data['etiquette']);
     
    		if ($n_etiquette < $nbTags) {
    			echo str_repeat('<td></td>', ($nbTags-1) - $n_etiquette);
    			}
     
    		echo '</tr>' ;
     
    		}
     
    ?>
     
    </table>

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ah ... ta table "tags" c'est la liste des tags possibles ... ok alors.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/01/2018, 16h08
  2. Réponses: 0
    Dernier message: 21/05/2012, 14h42
  3. [SQL-Server] Cocher les cases d'un tableau HTML selon les résultats d'une requête
    Par arthuro45 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/08/2010, 14h13
  4. Réponses: 1
    Dernier message: 19/06/2007, 12h43
  5. Réponses: 1
    Dernier message: 29/04/2006, 16h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo