PHP/MySQL : afficher le nombre d'id dans une table

PHP/MySQL : afficher le nombre d'id dans une table - PHP - Programmation

Marsh Posté le 20-11-2023 à 11:36:54    


Bonjour à tous et à toutes,
 
J'essaye d'apprendre php/MySQL toute seule en créant une bibliothèque numérique. Cela fait longtemps que je bloque sur l'affichage du nombre d'"id" rattaché à chaque livre de ma bibliothèque. J'espère que vous pourrez m'aider à comprendre ainsi qu'à apprendre de mes erreurs...  
 
Pour commencer, j'ai importé une liste de livres créée sur Excel dans une table que j'ai nommée "inventory" et qui comprend les colonnes suivantes : id (int; unsigned; auto increment); lastname; firstname; title; subtitle; collection; editor; comment; abstract; date; isbn.  
 
Dans mon dossier www>my_library> J'ai deux fichiers php qui sont "db-connect.inc.php" et "index.php".  
 

  • Dans mon fichier "db-connect.inc.php", il y a :


<?php
$servername = "localhost";
$username = "xxxx";
$password = '';
$dbname = "my_library";
 
try {
  $db = new PDO("mysql:host=localhost; dbname=my_library;", 'xxxx','',
  array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ));
  echo 'Connexion established!';
}  
catch (PDOException $e) {
  echo "Error: " . $e->getMessage() . "<br/>";
  die();
}
 
?>  
 

  • Dans mon fichier "index.php", il y a :


<?php  
include "db-connect.inc.php";
ini_set('default_charset', 'utf8');
?>
 
et :  
 
<?php $id=$_GET['id']?>  
<?php  
      echo ("I have" );
      $total_books = $db->prepare("SELECT COUNT(id) FROM inventory AS Count_inventory WHERE id=(SELECT MAX($id) FROM `inventory`)" );
      $total_books->execute();
      $result = array($total_books);
      echo count($result);
      echo ("books in my library." );
?>
 
 
Le résultat devrait être de 53 livres. Cependant, ma requête MySQL ne me permet pas encore d'afficher la dernière valeur de ma colonne d'ID. Je voudrais optimiser le temps de réponse du serveur en lui demandant de sélectionner seulement la dernière valeur de la colonne id (et pas toute la colonne "id" ), car, dans la version finale de mon projet, ma table contiendra plusieurs milliers de livres.  
 
Merci par avance pour votre bienveillance...


---------------
â
Reply

Marsh Posté le 20-11-2023 à 11:36:54   

Reply

Marsh Posté le 20-11-2023 à 11:59:11    

Tu devrais t'aider d'un tuto, car là si tu lance toute seule tu vas devoir apprendre un (trop ^^) grand nombre de truc en même temps...
Utilises les balises code du forum (le bouton c/c++), ce sera plus clair.
 
Dans ton premier fichier db-connect.inc.php tu initialises des variables de connexion, mais tu ne les utilises pas.
Dans un projet conséquent on a en général un fichier de configuration à la racine de type config.php dans lequel il y'a les informations essentiel (dont souvent le mode de bugage, l'accès à la base de donnée, le charset, etc.).
Et ensuite tu à une classe de gestion de la base de donnée qui s'occupe de créer la connexion en utilisant les variables.
 
Dans ton autre fichier ta manière de calculer le nombre de livres est inutilement compliqué et également fausse.
Si tu veux compter tes lignes valide, tu peux utiliser COUNT(id) mais il faudra alors utiliser en WHERE prenant toutes tes lignes, pas l'unique ligne ayant l'id le plus grand (ce que fait ton  WHERE id=(SELECT MAX($id) FROM `inventory`)).
https://sql.sh/fonctions/agregation/count
Sinon si tu est en mode listing de tes livres et que de toute façon tu vas les afficher, tu peux récupérer le nombre total de lignes remonté par ta requete avec rowCount()

Code :
  1. $all_books = $db->prepare("SELECT * FROM inventory WHERE 1 " );
  2. $all_books->execute();
  3. $count = $all_books->rowCount();


---------------
D3
Reply

Marsh Posté le 21-11-2023 à 04:34:28    

Bonjour,
 
Merci Mechkurt pour ta réponse. Comme j'ai au moins une année pour me former en MySQL/PHP avant de commencer mon projet "officiellement", me fiant à cette citation de Conficius "Celui qui déplace la montagne, c'est celui qui commence à enlever les petites pierres.", alors je vais continuer à regarder tous les tutos qui me sont nécessaires...  
 
Dans un premier temps (en attendant de me documenter davantage et de faire davantage de tests), ci-après je réponds à certains éléments de ton message :
 

  • Concernant le contenu des fichiers : j'ai renommé mon fichier "db-connect.inc.php" par "config.php". J'avais déjà créé un fichier pour le débogage que j'avais intitulé "phpinfo.php" : si je comprends bien, habituellement, ce fichier n'existe mais son contenu est intégré au fichier "config.php"? Idem pour le charset : pas la peine de le préciser sur chaque fichier, il doit être contenu dans le fichier "config.php"?


  • Concernant les droits de ma classe de gestion de bdd : je vais commencer par me documenter davantage sur le sujet car grâce à toi je découvre ce concept.


  • Concernant ma requête : avant de poster mon message sur ce forum, j'avais rédigé la requête MySQL qui suit :  
Code :
  1. SELECT COUNT(id) FROM inventory AS  Count_inventory WHERE id;


Elle m'affichait bien le résultat attendu de 53 livres. Comme effectivement je dois de toute manière afficher la liste de mes livres sur la même page web, je vais sûrement utiliser rowCount().
 

Reply

Marsh Posté le 21-11-2023 à 08:10:51    

relphe a écrit :

Bonjour,
 
Merci Mechkurt pour ta réponse. Comme j'ai au moins une année pour me former en MySQL/PHP avant de commencer mon projet "officiellement", me fiant à cette citation de Conficius "Celui qui déplace la montagne, c'est celui qui commence à enlever les petites pierres.", alors je vais continuer à regarder tous les tutos qui me sont nécessaires...  


Si tu dois créer à partir de zéro un outil qui deviendra officiel, tu devrais ptet te former directement sur un framework complet plutôt que tout réapprendre et construire à partir de zéro...
En faisant tout tu vas devoir "te battre" a chaque étape, affichage, pagination des résultats, écran de saisie, etc...
Sans compter les problèmes de sécurité.
Il te sera bien plus simple de créer ta bibliothèque en python en partant sur Django ou Symfony en php, par exemple, y'en a d'autre... ^^

relphe a écrit :


Dans un premier temps (en attendant de me documenter davantage et de faire davantage de tests), ci-après je réponds à certains éléments de ton message :
 

  • Concernant le contenu des fichiers : j'ai renommé mon fichier "db-connect.inc.php" par "config.php". J'avais déjà créé un fichier pour le débogage que j'avais intitulé "phpinfo.php" : si je comprends bien, habituellement, ce fichier n'existe mais son contenu est intégré au fichier "config.php"? Idem pour le charset : pas la peine de le préciser sur chaque fichier, il doit être contenu dans le fichier "config.php"?

Par exemple pour wordpress, un .htaccess demande de rediriger toutes les requêtes vers l'index.php, qui inclut wp-config.php (les variables), qui inclut wp-settings.php (les initialisations de classes).
https://github.com/WordPress/WordPress

relphe a écrit :


  • Concernant les droits de ma classe de gestion de bdd : je vais commencer par me documenter davantage sur le sujet car grâce à toi je découvre ce concept.

Il est d'usage de faire une surcouche à PDO pour pouvoir facilement changer le type d'accès au donnée, mais pour un petit projet et en phase d'apprentissage tu peux tout à fait bosser directement avec PDO qui est déjà une classe.

relphe a écrit :


  • Concernant ma requête : avant de poster mon message sur ce forum, j'avais rédigé la requête MySQL qui suit :  
Code :
  1. SELECT COUNT(id) FROM inventory AS  Count_inventory WHERE id;


Elle m'affichait bien le résultat attendu de 53 livres. Comme effectivement je dois de toute manière afficher la liste de mes livres sur la même page web, je vais sûrement utiliser rowCount().
 


Ça fonctionne car ton "WHERE id" est toujours vrai, donc remonte toutes tes lignes, tu aurais mis "WHERE 1" ou pas de clause WHERE cela fonctionnerait aussi.
Enfin si tu avais une ligne avec un id qui valait 0 (ou NULL), elle ne remonterait pas vu que ça donnerait WHERE 0, mais je doute que l'une de tes id de ligne ait cette valeur. :o  
 
Bon courage, et n'hésite pas à nous en dire plus sur ta demande, tu est en formation ? en reconversion ? A quoi vas servir ton projet ?
On pourra mieux te conseiller...


Message édité par mechkurt le 21-11-2023 à 08:12:19

---------------
D3
Reply

Marsh Posté le 22-11-2023 à 04:21:59    


Je crois bien qu’il va falloir que je me réoriente vers Python, en premier lieu pour des raisons de sécurité. Je veux maîtriser chacun des aspects de mon projet et, dans ce but, comme je l’ai déjà écrit, je suis disposée à apprendre tout ce qu’il faudra en informatique. Je ne veux donc pas choisir une technologie parce qu’elle est plus simple à utiliser, mais parce qu’elle est la plus performante.  
 
Concernant ma présentation, si cela peut vous aider à mieux me conseiller, voici ce que je peux vous en dire : issue des sciences humaines, je veux à présent me spécialiser dans l’informatique grâce à mon projet de développement d’un système de gestion des bibliothèques scolaires qui fera, je l’espère, l’objet d’un partenariat avec l’éducation nationale. Dès l’année prochaine, j’aimerais être en mesure de présenter un travail suffisamment élaboré à mon futur codirecteur de thèse. Toutefois, si je me rends compte que l’année prochaine je ne suis toujours pas prête, alors je prendrai plus de temps afin de lui présenter un travail qui soit professionnel.  
 
Merci pour votre accueil sur ce forum...

Reply

Marsh Posté le 22-11-2023 à 08:42:22    

L'avantage d'utiliser Python (avec Django) c'est que globalement vous n'aurez qu'un langage à apprendre, ce qui est largement faisable en 1 an.
Toute la partie d'accès au donnée sera transparente et vous n'aurez pas à la gérer, toute ce que vous devrez faire sera de déclarer votre objet comme persistant.
Sinon pour faire l'équivalent seul et en php/mysql, il faudra apprendre le php, le SQL, et dans une moindre mesure, le html, le css et le javascript...
 
Avec ce tuto vous devriez pouvoir faire votre application de bibliothèque plutôt facilement (il faudra sans doute faire les tutos prérequis):
https://openclassrooms.com/fr/cours [...] ork-django


---------------
D3
Reply

Marsh Posté le 27-11-2023 à 13:57:07    

Bonjour,
A mon avis, la requête devait plutôt être :

Code :
  1. SELECT COUNT(id) AS Count_inventory FROM inventory;


 
Je vois pas trop l'intérêt de mettre un alias à une table qui est plus long que le nom de la table elle-même :/
 
Il y a un gros aspect du projet dont mechkurt n'a pas parlé a priori et qui est très important voire primordial dans une logiciel de gestion (donc avec une BD) : c'est la structure de la BD justement.
 
Quand je lis "j'ai nommée "inventory" et qui comprend les colonnes suivantes : id (int; unsigned; auto increment); lastname; firstname; title; subtitle; collection; editor; comment; abstract; date; isbn.", j'ai très peur de la tête que doit avoir les tables de la BD.
Une BD, ce n'est pas un fichier Excel. Chaque table doit avoir une forme normalisée (la 3NF de Codd, en général) : https://fr.wikipedia.org/wiki/Forme [...] me_normale
Traduction : tu vas avoir plusieurs tables, chaque table étant une entité. Tu auras donc  
- une entité "Auteur" (avec un id, nom, prénom...),  
- une entité "Livre" (avec un id, un titre, ...., l'id de l'édition),  
- une entité "Livre-Auteur" (avec un id, l'id du livre et l'id d'un des auteurs du livre). Tu auras dans cette table autant d'entrées pour un livre qu'il a d'auteurs.
- une entité "Edition" (ou éditeur, pareil, avec un id, un nom...)
 
Là où ça va devenir rigolo, c'est quand tu vas commencer à devoir gérer  
- des recueils de nouvelles ou des recueils de livres. En effet, un recueil est un assemblage de plusieurs oeuvres parues chacune de leur côté sous la forme d'un livre.
- des oeuvres parues dans différentes langues ou chez différents éditeurs ou en différentes éditions.
 
En fonction de jusqu'à quel niveau de détail tu veux gérer les choses, il va falloir adapter ton MCD (modèle conceptuel de données). Tu pourrais avoir une table "Oeuvre" qui contienne les infos sur l'oeuvre en elle-même et en suite un lien entre elle et ses différentes déclinaisons d'éditions de livres à travers le monde (voire aussi en films). Je connais très bien le sujet car ma femme travaille sur ce type de logiciel depuis plusieurs années déjà.
 
Après, vu que c'est pour gérer une bibliothèque, avant de réinventer la roue, ça serait bien de regarder ce qui existe déjà :
https://www.lesnumeriques.com/telec [...] vres-27882
https://fr.wikipedia.org/wiki/Alexa [...] ion_GNOME)
https://www.capterra.fr/directory/3 [...] n/software
http://waterbear.info/
 
Parce que vu que c'est pour l'Education Nationale, il va falloir déjà savoir comment sera fait le support (maintenance) dans le temps. Ben oui, quand PHP va monter de version ou Mysql et que ton appli marchera plus, qui sait qui va faire les correction de code source :??:
 
Pour résoudre de nombreux problèmes (genre, mon MCD est pas top, je dois le reprendre et recoder pleins de partie de mon soft, joie !  :cry: ), je vais te donner le conseil suivant :
- pour faire la partie descriptive des oeuvres, utilise le logiciel libre Mediawiki + l'extension Semantic Mediawiki + l'extension Gloassary. Ainsi, tu feras les fiches de chaque bouquin avec ce système de taxonomie. Si tu as besoin de rajouter des attributs sur chaque fiche, ça sera très facile. Tu auras donc des articles de type livre, des articles de type auteur... Bref comme les entités présentées précédemment.
- pour gérer les emprunts, tu fais un logiciel web juste pour ça. Grâce à l'API REST de Mediawiki, ton soft pourra se récupérer les infos des articles dans Mediawiki et grâce à la taxonomie, tu pourras récupérer ds infos encore plus précises pour chaque auteur, livre... A noter que tu pourras très facilement, dans un article de type "auteur", lister tous les articles de type "livre" dont la personne est auteur ;)
 
Gros avantage : moins de codage à faire et surtout, en cas de changement de logiciel de gestion des emprunts, la base de connaissances sur les livres reste la même. Les 2 sont découplés mais fonctionnent de concert. :) Mediawiki étant un logiciel livre utilisé par Wikipedia, ça va rassurer l'Education Nationale pour le support (notamment pour l'aspect sécurité puisqu'il y a régulièrement de nouvelles versions qui suivent aussi la monté en version de PHP et MySQL :o).
 
Tu peux même mettre en place un système de déploiement automatisé (CI-CD) avec Git, Docker, Ansible. Tu fais un script qui déploie l'OS du serveur, prend la bonne version de Mediawiki ainsi que celle des extensions dont tu as besoin, fait les modifs de conf du fichier de conf d'Apache (ou Nginx, je suis pas sectaire :D), injecte la dernière sauvegarde de la BD dans l'instance déployée, fait les modifs du fichier de conf de Mediawiki, fait les tests de bon fonctionnement et non régression...
Comme ça, ça sécurise drôlement le déploiement d'une nouvelle version de Mediawiki et de ton appli de réservations de livres. ;)
 
En présentant ton projet de cette manière à ton codirecteur de thèse, ça fait sérieux, professionnel et montre que tu as réfléchi à pas mal d'aspects de la vie du produit et pas juste le codage de l'appli. En plus, ça utilise des technos relativement récentes et une approche moins classique que ce qu'on a l'habitude de voir chez les débutants en dév...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-11-2023 à 15:04:15    

Bonjour,
 
Tu sembles vraiment calé et j'ai l'impression que tu connais bien les enjeux d'un SIGB! Merci d'avoir pris le temps de m'écrire un message avec autant d'explications...
 
Depuis les derniers messages de mechkurt, j'ai commencé des cours de Python. Je ne pars "pas tout à fait" de zéro dans la mesure où j'ai déjà codé plusieurs sites web en html, css avec un peu de javascript (je ne l'ai pas mentionné plus tôt car cela est à mes yeux clairement insuffisant pour le développement de mon projet actuel). Pour ce qui est de la table Inventory, il s'agit d'une première table d'essai afin de m'exercer à extraire les données. J'avais déjà identifié les tables de mon MCD, mais pas la difficulté que tu soulignes et qui est représentée entre autres par :  
- des recueils de nouvelles ou des recueils de livres;  
- des œuvres parues dans différentes langues ou chez différents éditeurs ou en différentes éditions.
 
J'aimerais permettre à l'utilisateur la saisie d'un large éventail de données et donc que ma base de données dispose d'un MCD adéquate. Je devrais à mon avis faire un plan détaillé sur support papier avant de les créer. En même temps, je veux permettre aux utilisateurs de paramétrer leur utilisation, au maximum et de manière guidée, afin d'éviter le bruit documentaire ainsi qu'une utilisation pas assez intuitive.  
 
J'ai déjà été voir ce qui se faisait ailleurs (y compris à l'international) et j'ai recueilli les avis de multiples professionnels dans différents types de structures. Cela fait longtemps que je réfléchis à mon projet et, en outre, je sais déjà à quoi ressemblera l'ergonomie et le graphisme de mon SIGB. J'ai également déjà réfléchis à sa maintenance dans le temps. A l'heure actuelle, mon principal problème est sa réalisation technique. Le combo Mediawiki + l'extension Semantic Mediawiki + l'extension Gloassary me semble excellent! Je le retiens.

Reply

Marsh Posté le 28-11-2023 à 16:00:37    

Effectivement, avant de commencer le moindre codage, la première chose à faire est de rédiger le spécification de ton système (ici, ton logiciel et peut-être combiné à Mediawiki + quelques extensions). Ne néglige pas cette phase extrêmement importante ! Ca va représenter environ 1/3 du temps total de ton projet. Pour avoir encadré quelques stagiaires (et avoir été débutant et stagiaire moi-même en dév), cette durée paraît souvent très grande voire hallucinante. Pourtant, il n'en est rien, c'est une métrique relativement classique dans le domaine du dév dans les grandes ESN. Cette phase est trop souvent négligée, d'où les retards à cause de modifs à faire en fin de projet voire une livraison d'un produit qui ne répond pas au besoin.
 
Comme je te le disais, si tu délègues à Medaiwiki avec de la taxonomie tout l'aspect structuration des informations relatives aux oeuvres, livres, auteurs, éditeurs... c'est ça de moins à devoir modéliser et coder dans ton appli. Et si tu dois prendre en compte de nouvelles infos (attributs en plus) ou qu'un attribut passe d'une valeur unique (relation 1-1) à une liste de valeurs (relation 1-n), ben t'as juste à rajouter un séparateur pour mettre les valeurs à ton attribut. Alors que dans une BD, ton champ va se transformer en une table + du recodage :/
Doc de l'extension : https://www.semantic-mediawiki.org/ [...] ne_queries
Par ailleurs, tu peux contraindre la valeur ou l'unité de tes attributs pour pas qu'on puisse mettre n'importe quoi. Et en bonus, cette extension sait même faire des conversions (genre : ton attribut est en pieds, tu fais une recherche sur cet attribut sur un intervalle exprimé en mètres, ben pas de problème, les conversions se font en interne  :bounce: )
 
Par ailleurs, pour guider la création de nouveaux articles de type "livre" ou "auteur" ou ..., tu peux faire des modèles de saisie pour préinitialiser la création de l'article. Pour ça, faut l'extension "Multiboilerplate".
 
Tu pourras aussi créer des modèles de type "infobox" pour afficher de manière homogène les diverses infos mises dans les attributs des articles de type livre, auteur... Une infobox par type, comme s'est fait sur wikipedia ;)
 
Les catégories qu'on peut mettre sur un article te serviront aussi pour préciser les courants littéraires des auteurs, le genre des livres... Tu peux faire ça sous forme d'arborescence. Pour aider à la saisie, l'extension "MsCatSelect" te sera utile.
 
Si je connais très bien tout ça, c'est que ça fait depuis 2010 que je fais de la gestion de connaissances avec Mediawiki et que récemment, j'en ai mis en place une pour une grosse organisation française (plus de 7000 utilisateurs, avec définition des règles de nommage des articles, structuration de types d'articles, modèles...).
 
Tu pourras même mettre en place des portails thématiques.
 
Bref, à mon sens, tu pourras mettre en forme beaucoup plus de contenu et plus facilement que dans un logiciel que tu pourrais développer. Et avec Mediawiki, il te sera beaucoup plus simple de rendre multimédia cette base de connaissances de bibliothèque (images pour les couvertures, 4ème de couverture des livres, photo des auteurs, vidéos, sons...) qu'avec un logiciel développé. ;)
 
Pour l'authentification, tu pourras même te brancher sur le LDAP de l'établissement s'il en a un. Sinon, comptes locaux ou mise en place d'un LDAP.
 
Il te restera plus qu'à coder l'appli de réservation. Comme clé primaire des bouquins, tu pourras utiliser les ID de la table "page" de Mediawiki. En cas de LDAP, tu pourras utiliser une authentification commune afin de partager les ID des utilisateurs entre Mediawiki et ton appli.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed