[RESOLU] Présenter dans un tableau

Eléphanteau du PHP | 18 Messages

08 févr. 2024, 10:54

Bonjour,
Pour mon apprentissage PHP-MySQL, j’ai créé une base d’entraînement depfr (à partir d’une liste des départements français), et une requête :

Code : Tout sélectionner

$sth = $dbh->prepare(" SELECT cod, nom, chef_lieu, cree FROM depa WHERE cod = '$variable' OR nom = '$variable' OR chef_lieu = '$variable' "); $sth-> execute(); $resultat = $sth→fetchAll(PDO::FETCH_NUM);
Avec

Code : Tout sélectionner

$reponse = implode(" ", $resultat[0]); echo $reponse ;
j’obtiens sur une nouvelle page une ligne de texte en réponse, par exemple :
05 Hautes-Alpes Gap 1790

Avec

Code : Tout sélectionner

$resultat = $sth->fetchAll(PDO::FETCH_BOTH);
puis

Code : Tout sélectionner

print_r($resultat);
cela devient :

Code : Tout sélectionner

Array ( [0] => Array ( [cod] => 05 [0] => 05 [nom] => Hautes-Alpes [1] => Hautes-Alpes [chef_lieu] => Gap [2] => Gap [cree] => 1790 [3] => 1790 ) )
Comment pourrais-je avoir cela sous forme d’un tableau à deux lignes (intitulés/résultat) et quatre colonnes ?
...et mieux, que celui-ci figure sur la page de demande ?
Je tâtonne, mais ne trouve pas comment désigner mon résultat pour pouvoir ensuite le disposer graphiquement comme voulu.
Merci pour le coup de main !

Avatar du membre
Mammouth du PHP | 1609 Messages

08 févr. 2024, 13:19

Salut,

Avec un fetchAll(PDO::FETCH_NUM), la variable $resultat est un tableau de tableaux.

Chaque élément du tableau $resultat représente une ligne du résultat qui est elle même un tableau ou chaque élément est une colonne de la ligne.
Comment pourrais-je avoir cela sous forme d’un tableau à deux lignes (intitulés/résultat) et quatre colonnes ?
Un tableau en html se fait avec la balise table et les balises qui vont avec (thead, tr, th, td, tfoot).
...et mieux, que celui-ci figure sur la page de demande ?
La base, avoir tout le code dans la même page en l'organisant comme il faut avec des if aux bons endroits pour exécuter/afficher ou non tel ou tel bloc de codes.

De manière plus sophistiqué avec un peu d'ajax en javascript (XmlHttpRequest).
Je tâtonne, mais ne trouve pas comment désigner mon résultat pour pouvoir ensuite le disposer graphiquement comme voulu.
La base :
foreach ($resultat as $ligneColonnes) {
    // ici tu es sur une ligne du résultat
    foreach ($ligneColonnes as $colonne) {
        // ici tu es sur une colonne de la ligne
    }
   // mais avec seulement 4 colonnes tu peux aussi utiliser $ligneColonnes[0], 
   // $ligneColonnes[1], $ligneColonnes[2] et $ligneColonnes[3] et te passer
   // du deuxième foreach
}
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 18 Messages

09 févr. 2024, 09:28

Merci pour ta réponse.
« la variable $resultat est un tableau de tableaux ». D’accord. Comment faire pour qu’elle se traduise par un tableau visuel pour le public ? C’est ça la question.
Avec foreach, je peux être sur une ligne du résultat, puis sur une colonne de la ligne. Qu’y faire ? Qu’y mettre pour que s’y affiche la partie correspondante du résultat ? Et qu’ensuite, donc, cela devienne un visuel communicable… simple et accessible à tous.
La requête trouve une réponse. Je peux faire un tableau html. Concrètement, comment mettre les résultats de ma requête dedans ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 févr. 2024, 10:59

Bonjour,

Mon conseil : fais ton tableau d'abord en pur HTML avec 2 ou 3 lignes en dur, puis une fois que tu as conçu ton tableau en statique, tu ajouteras du code PHP pour le rendre dynamique.

Et une fois que tu as un tableau avec les bonnes données avec PHP, tu pourras utiliser une librairie JS comme datatables.net, qui pourra rendre ton tableaux HTML basique en tableau interactif avec mise en forme/tri/pagination/recherche...
https://datatables.net/
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 18 Messages

09 févr. 2024, 14:16

Merci, mais toute ma question est justement là : quel code PHP dois-je utiliser pour le rendre dynamique, c’est-à-dire
que s’y affiche les réponses à la requête (ici contenues dans $resultat) ?

Mammouth du PHP | 2703 Messages

09 févr. 2024, 16:54

Saian a répondu.

ynx
Mammouth du PHP | 586 Messages

09 févr. 2024, 17:45


Eléphanteau du PHP | 18 Messages

11 févr. 2024, 14:07

Bonjour,
Je suis débutant en PHP. La réponse de Saian, de mon point de vue, ne répond pas à la question : pour avoir un tableau, il faut créer un tableau, certes. Avec Foreach je peux aller dans me positionner dans un tableau de résultats. D'accord, mais qu'est-ce que j'y mets pour y avoir ces dits résultats ?
Merci ynx pour l'exemple. Je vais essayer de le réaliser, voir si à la fin je parviens à avoir un tableau html contenant les réponses à une requête ! Il me semblait au départ que c'était une question simple, mais avec mes faibles connaissances...

Eléphanteau du PHP | 18 Messages

13 févr. 2024, 08:38

Ça marche ! En imitant la démarche proposée, j'ai réussi à faire paraître les résultats de la recherche en tableau. Et c'est mieux construit que ce que j'aurais pu bricoler par moi-même.
Il me reste maintenant à trouver comment améliorer cela, que sur la page réponse on ait la possibilité d'agir : effacer, enregistrer, copier les réponses,… du JavaScript, ou comme le conseille @rthur, avec DataTables... intéressant mais sans doute trop complexe pour moi qui ne suis pas un développeur (un "plug-in for the jQuery Javascript library") !
N'y aurait-il pas un autre modèle que je pourrais imiter ?

ynx
Mammouth du PHP | 586 Messages

13 févr. 2024, 13:50

Le plugin DataTables permet de manipuler les données du tableau dans le navigateur (trier, filtrer, rechercher, ...) mais ne permet pas de modifier les données (pas de bouton effacer, modifier, créer, ...).

Pour modifier les données du tableau, on crée généralement plusieurs pages pour chaque action : par exemple create.php pour créer une données, read.php pour afficher une seule donnée, edit.php pour modifier et delete.php pour supprimer une donnée.
Ces 4 opérations de bases (Create, Read, Update, Delete) sont regroupées dans l'acronyme CRUD.

Tu peux essayer de suivre cet article pour créer ton propre CRUD : https://nouvelle-techno.fr/articles/liv ... rud-en-php

Eléphanteau du PHP | 18 Messages

14 févr. 2024, 15:55

Merci, je regarderai cela.
Dans l'immédiat, j'ai un problème de présentation du tableau de réponse. Si il n'y a qu'une seule ligne de réponse, il s'affiche 1 ligne en-dessous de l'intitulé "Résultat de votre recherche : ". Mais si il y en a 20 lignes, le tableau commence 20 lignes plus bas, il est invisible ! Quand je modifie dans le fichier css, ou dans <table > en html, les commandes d'emplacement sont prises en compte, mais ne peuvent entamer ce gigantesque espace vertical... D'où vient-il ? Comment se fait-il qu'il soit apparemment proportionnel à la dimension du tableau ?
Deuxième question, le 'if' trouvé dans l'exemple modèle est inapproprié. Il faudrait placer comme condition la présence ou non d'une réponse. Mais je ne sais pas le faire, ne sachant comment celle-ci peut être désignée.

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"> <head> <title>DEPARTEMENTS</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link href="tabstyle.css" rel="stylesheet" type="text/css" /> </head> <body> <h3> Résultat de votre recherche : </h3> <?php // je me connecte à la base require_once('connexion.php'); $connexion=connect_bd(); $variable = $_POST['recherche']; // j'effectue le tri $sql="SELECT cod, nom, chef_lieu, cree FROM depa WHERE cod = '$variable' OR nom = '$variable' OR chef_lieu = '$variable' OR cree = '$variable' "; if(!$connexion->query($sql)) echo "Pb d'accès aux données"; else { ?> <table id="tableau" align="center" valign="top"> <thead> <tr> <th class="row-1 row-cod">n°</th> <th class="row-2 row-nom">Département</th> <th class="row-3 row-chef_lieu">Chef-lieu</th> <th class="row-4 row-cree">Créé en<th> </tr> </thead> <tbody> <?php foreach ($connexion->query($sql) as $row) echo "<tr><td>".$row['cod']."</td> <td>".$row['nom']."</td> <td>".$row['chef_lieu']."</td> <td>".$row['cree']."</td></tr><br/>\n"; ?> </tbody> </table> <?php } ?> </body> </html>

Mammouth du PHP | 2703 Messages

14 févr. 2024, 17:16

virer <br/>

en utilisant fetchAll, il est possible de tester la taille du tableau pour savoir s'il y a des résultats.

Eléphanteau du PHP | 18 Messages

20 févr. 2024, 15:50

Bonjour ynx,
Merci de m’avoir indiqué de supprimer ce <br /> ! Il était présent dans l’exemple/modèle qui m’a permis de disposer en tableau mes résultats de requête [https://www.univ-orleans.fr/iut-orleans ... p-pdo.html]. Je ne sais pas comment un saut de ligne peut avoir cet effet, mais désormais mon tableau se place correctement.
Quant à tester la présence d’une réponse, avec fetchAll, j’avais trouvé ça dans un précédent modèle, donnant une réponse en ligne :

Code : Tout sélectionner

try{ // je me connecte à la base $dsn = 'mysql:host=localhost;dbname=depfr'; $user = 'root'; $password = ''; $dbh = new PDO($dsn, $user, $password); $variable = $_POST['recherche']; // j'effectue le tri $sth = $dbh->prepare(" SELECT cod, nom, chef_lieu, cree FROM depa WHERE cod = '$variable' OR nom = '$variable' OR chef_lieu = '$variable' "); $sth-> execute(); $resultat = $sth->fetchAll(PDO::FETCH_NUM); if (empty($resultat)) {
mais avec :

Code : Tout sélectionner

require_once('connexion.php'); $connexion=connect_bd(); $variable = $_POST['recherche']; // j'effectue le tri $sql="SELECT cod, nom, chef_lieu, cree FROM depa WHERE cod = '$variable' OR nom = '$variable' OR chef_lieu = '$variable' OR cree = '$variable' "; if(
...je ne sais pas comment poser la question ! Comment créer l’équivalent de ce $sth devenant $resultat ? J’ai tenté sans succès jusqu’à présent.

ynx
Mammouth du PHP | 586 Messages

20 févr. 2024, 16:36

Au passage : Evite d'injecter des variables php dans une requête sql car tu risques d'avoir des injections sql, utilises plutôt des paramètres nommés dans la requête (":param1" par exemple) et lie le paramètre avec la valeur que tu veux lui affecter dans la méthode execute().
Plus d'infos : https://www.php.net/manual/fr/pdo.prepa ... ements.php

L'équivalent avec fetchAll pourrait ressembler à ceci (code non testé) :
<?php

require_once 'connexion.php';

$connexion = connect_bd();

$sql="SELECT cod, nom, chef_lieu, cree FROM depa
WHERE cod = :param1
OR nom = :param1
OR chef_lieu = :param1
OR cree = :param1";

$sth = $connexion->prepare($sql);

$sth->execute([
	':param1' => $_POST['recherche'],
]);

$results = $sth->fetchAll(PDO::FETCH_ASSOC);

if (empty($results)) {
	echo 'Aucun résultat';
} else {
	
	foreach ($results as $row) {
		echo $row['cod'] . ' : ' . $row['nom'];
	}
	
}

Eléphanteau du PHP | 18 Messages

20 févr. 2024, 17:52

J'ai essayé, mais cela coince.
Dans mon fichier, avant d'effectuer la requête (le tri), on définit la variable de tri, c'est-à-dire l'argument de recherche entré par l'utilisateur : $variable = $_POST['recherche'];
Et ensuite on fait chercher si cette variable est présente dans telle ou telle rubrique.
Je pense qu'il faut donc dire ce qu'est :param1 dès le départ (l'argument de recherche initialement entré, ce que j'appelais $variable). Ensuite 'execute', le tri, est possible. Le résultat s'affiche comme il convient en tableau.
Reste à trouver comment définir $results pour pouvoir faire 'if (empty($results))'.