Introduction à la base de données

créé le .

Formaweb vous explique, à travers 5 parties, le fonctionnement d'une base de données. Ce sujet est traité pour les bases de données de type SQL. Il présente des requêtes PHP pour interroger la base de données et en tirer des informations ou exécuter des requêtes. En dehors du fait que le langage soit en PHP et que ce soit une bases de données SQL, vous pouvez très bien suivre cet enseignement afin de comprendre le fonctionnement général d'une base de données. Il faudra alors adapter les requêtes pour les bases de données VBA (ou excel).

Vidéo de présentation de la baase de données

Comprendre le principe d'une base de données

Le meilleur exemple pour illustrer une base de données est notre annuaire téléphonique. L'annuaire regroupe des noms de personnes selon leur localité et vous fournit leur numéro de téléphone. Lorsque vous créez votre compte sur un site, vous faites exactement la même chose. Toutes ces informations sont stockées dans une base de données généralement de type MySQL. Sauf qu'en informatique, il est possible de faire bien plus complexe. Lorsque vous passez votre première commande sur un site, la commande est stockée dans la base de données. Ainsi il sera possible de les retrouver dans le futur. Nous pourrons également comparer ce que vous achetez avec des personnes du même âge par exemple. Nous pourrons savoir à quelle fréquence, vous achetez tel ou tel article. Bien évidemment, vous ne recréez pas à chaque commande un nouveau compte. Toutes les commandes sont reliées au même compte client. Il arrive également que, lorsque vous allez sur une site d'achat, vous faites des commentaires sur un article. Tout cela va alors être enregistré dans une liste de commentaire et le votre sera relié à votre compte. Vous comprenez donc désormais qu'il y a, dans notre exemple, 3 types d'annuaires : le compte client, vos commandes, vos commentaires. Ces annuaires, dans un langage technique, sont appelées des tables. Toutes ces tables font partie de la même base de données. Et la base de données est elle-même enregistrée dans un serveur de base de données.
Voici un exemple de représentation d'une base de données avec toutes ces tables. Certaines bases de données sont plus petites et d'autres vraiment beaucoup plus grandes. Vous trouverez en fin de ces explications une image d'une base de données. Cette représentation a été réalisée avec le logiciel workbench accessible sur cette page : https://www.mysql.fr/products/workbench/ Cette base de données permettait à des personnes de publier des dessins sur un site et d'y ajouter ou non de la pub. Il permettait également d'avoir un statut membre de dessinateur ou de publicitaire et de mettre des descriptions aux pubs et sur les dessins. Il faut bien penser qu'un dessin appartienne à une catégorie voir une sous catégorie. Vous l'avez compris. Créer de toute pièce les tables d'une base de données nécessite une réflexion poussée du fonctionnement du site et de ses besoins.

Les données

Pas de données en double

Si vous devez copier plusieurs fois la même information dans votre base de données, c'est qu'elle n'est pas bien optimisée. Exemple pour le genre homme ou femme. A chaque utilisateur, il peut être intéressant de noter son sexe. Prenons un exemple à l'échelle de 1000 utilisateurs. 1000 fois 6 lettres (homme ou femme) prendra plus de place de stockage que 1000 fois le chiffre 1 ou 2 en admettant que ces chiffres soient les identifiants de la table "sexe" ayant pour valeur 1 = homme et 2 =femme. Eviter les données en double signifie également qu'il est inutile de répéter à plusieurs reprise que c'est un homme ou qu'il habite dans une région ou...

Présence de toutes les datas

Si vous faites un formulaire de données, assurez vous tout simplement que toutes les données enregistrées apparaissent bien dans la base de données. Faites une liste de tout ce dont vous avez besoin d'enregistrer et assurez vous que tout est bien dans les tables.

Toutes les propriétés dépendent de l’identifiant de façon pleine et entières

Dans une table, toutes les valeurs, toutes les données doivent dépendre de la table. Il est anormal de retrouver l'age du client dans la table commande.

Les titres des données

Pas de polysème ou de synonyme

Un polysème est un mot qui a plusieurs significations. Les termes utilisés pour noter la table doivent être clairs et explicites. Lorsque vous appelerez les données enregistrées, vous ne devrez avoir aucun doute sur leur valeur. Attention aux synonymes. Bien souvent, si des synonymes sont présents dans la table c'est qu'il y a répétitions d'informations.

Un nom par entité et par relation

Une table de relation doit avoir un titre tel que "a_ecrit" afin que la relation soit claire et explicite. Soignez ces termes, ils vous seront d'une aide précieuse. Le nom de l'entité a également son importance.

Les identifiants

Des identifiants uniques

Un identifiant n'est autre qu'un numéro de ligne. Certaines personnes préfèrent choisir cet identifiant. Mais il est totalement déconseillé de choisir son identifiant à moins d'avoir tout compris d'une base de données. Je vous conseille fortement de créer un identifiant unique et auto-incrémenté. Auto incrémenté signifique que le premier identifiant sera le 1 puis le 2, puis le 3... et que vous ne le choisirai pas. C'est en créant une entrée dans la base de donnée que cet identifiant sera automatiquement créé par votre serveur.

Des identifiants correctement choisis

Chaque utilisateur, chaque commentaire , chaque commande a son identifiant. Il doit absolument être unique pour chaque table. Il ne peut y avoir 2 commandes ayant le numéro 1, cela va de soi. Mais l'identifiant de la commande ne peut avoir pour titre juste ID. Il doit être plus claire tel que ID_commande.

Les identifiants sont reconnaissables et soulignés

Lorsque vous faites votre shéma des tables et des liaisons, vous devez être capable du premier coup d'oeil de repérer les identifiants sur chacune des tables. Si un doute existe, retravaillez la forme ou le fond de la table.

Les liaisons entre les tables

Les cardinalités sont bien posées

La cardinalité est le fait de s'assurer que sur une table il peut y avoir 1 ou plusieurs données qui y sont associées. Exemple : un client peut faire 0 ou plusieurs commandes. Cette liaison doit être indiquée dans votre shéma de table.

Une relation porteuse est différente d’une solution d’appartenance

Une relation est dite porteuse lorsqu'elle lie différentes tables entre elle et qu'il est possible d'y ajouter des informations. telle que la liaison entre la table commande et la table produit à laquelle on associe la quantité de produits achetés.

La grande majorité des sites se connectent à une base de données pour collecter et réutiliser ces données. Pour se connecter à celle-ci, vous devez posséder un fichier de connexion. Dans ce fichier de connexion, vous y mettrez le nom du serveur de votre base de données, le nom de la base, le nom d'utilisateur et le mot de passe. Le principe de ce code est d'essayer de se connecter mais si cela tombe en échec, d'obtenir l'erreur. C'est uniquement si tout va bien que vous pourrez continuer et récupérer tout le contenu de votre base de données.

<?php
try
{
	// On se connecte à MySQL
	$bdd = new PDO('mysql:host=nom_du_serveur;dbname=nom_de_la_base', 'nom_du_user', 'mot_de_passe', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch(Exception $e)
{
	// En cas d'erreur, on affiche un message et on arrête tout
		die('Erreur : '.$e->getMessage());
}
?>

Si vous avez un serveur de bases de données privées, celui-ci a un numéro de port. Il vous faudra donc adapter le code de cette manière : Bien évidemment, vous modifierez le numéro de port pour le votre !

$bdd = new PDO('mysql:host=nom_du_serveur;port=30000;dbname=nom_de_la_base', 'nom_du_user', 'mot_de_passe', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Comprendre le principe d'une base de données à travers son shéma

Cette base de données enregistre uniquement des données par rapport à des dessins. Mais ces dessins appartiennent à une catégorie voir une sous catégorie et il est important de créer les relations entre elles. Comme vous pouvez le voir sur cette représentation, il est attribué au dessin une catégorie et une sous catégorie. Mais elles sont distinctes. Nous pourrions estimer qu'une sous catégorie appartienne forcément à une catégorie. Mais j'ai tenu à les séparer dans cet exemple pour pouvoir imaginer qu'une sous catégorie tel que les éléphants puisse appartenir autant à la catégorie " animaux du zoo" que "animaux d'asie" ou "animaux d'afrique"... La table de liaison permet alors d'attribuer une sous catégorie à plusieurs catégories. Si j'avais estimé qu'une sous-catégorie n'avait qu'une seule catégorie parente, alors je n'aurai fait qu'une table au lieu de 3 en rajoutant le champs "id_parent".

base de données

Cette base de données, toujours pour le même site, permet à des personnes de publier des dessins sur un site et d'y ajouter ou non de la publicité. La base de données permet également à l'éditeur d'avoir un statut membre de dessinateur ou de publicitaire et de mettre des descriptions aux pubs et sur les dessins. Vous comprenez alors qu'en ajoutant un simple élément tel que l'auteur, on doit rajouter des tables et des champs pour la connexion, les commentaires, les logs... la base de données devient vite alors plus complexe. Cet exemple, bien qu'il puisse être impressionnant, est très simple dans son architecture. Certaines bases de données nécessiterait toute votre table de salon pour les afficher tout en gardant une police d'écriture assez petite. Mais si vous connaissez le fonctionnement d'une base de données, vous comprendrez alors beaucoup plus facilement le fonctionnement des CMS tels que Wordpress.

base de données

Une fois la connexion établie à votre base de données, vous pouvez interroger cette table et en retirer toutes les informations souhaitées. Ces informations pourront alors être triées et manipulées. Voici quelques script php permettant de :

  • interroger la base de données
  • mettre à jour la base de données.
  • compter le nombre d'élément dans une base de données.
  • récupérer le dernier identifiant créé

Nous ne sommes pas partisan de supprimer des données sans une extrême précaution. Il faut savoir que toutes les données sont connectées entre elles. Par exemple, sur un blog, si vous supprimez un auteur de commentaire, il faut d'abord obligatoirement supprimer les commentaires. Sans cela, l'opération ne fonctionnera pas. Nous ne vous mettrons donc pas en ligne comment supprimer ces informations. Si vous comprenez les exemples ci-dessous, vous trouverez le code pour DELETE des données. Enfin, nous ne présenterons du code qu'en version PDO ( version objet). En effet, les anciennes requêtes ne sont plus compatibles sur du php 5.6. et les hébergeurs ne permettent plus, pour la plupart, d'utiliser du php 4.4. Nous ne vous montrerons donc pas comment créer des requêtes qui ne sont plus tolérées par la majorité des hébergeurs.

entrer de nouvelles données

<?php
$sql_new =$bdd->prepare('INSERT INTO `nom_de_la_table`(`nom_du_champs_1`,`nom_du_champs_2`,`nom_du_champs_3`) VALUES (:nom_de_la_valeur_1,:nom_de_la_valeur_2,'0,00');');
	try{
		$sql_new->execute(array(
		':nom_de_la_valeur_1' => $id,
		':nom_de_la_valeur_2' => $_POST['retour_du_formulaire']
		));
	}
	catch(Exception $e) //en cas d'erreur
		{
			//on affiche un message d'erreur ainsi que les erreurs
			$sql_new->errorInfo();
			echo 'Tout ne s\'est pas bien passé, voir les erreurs ci-dessous<br />';
			echo 'Erreur : '.$e->getMessage().'<br />';
			echo 'N° : '.$e->getCode();
		}
	}
	else {echo "aucun nouvel enregistrement <br />";}
?>

Ne pas utiliser de requetes préparée aujourd'hui est dommage et surtout dangereux en terme de sécurité. Toutefois, il arrive que nous bloquons sur l'enregistrement d'une requete dans la base de données. Il peut alors être intéressant de la tenter à l'ancienne manière :

<?php
$requete='INSERT INTO `nom_de_la_table`(`nom_du_champs_1`,`nom_du_champs_2`,`nom_du_champs_3`) VALUES ("valeur_1","valeur_2","valeur_3")';
echo 'requete : '.$requete;
$bdd->exec($requete);
?>

Interroger la base de données

Afficher un résultat

<?php
$sqlAff="SELECT * FROM nom_de_la_table";
$affiche=$bdd->query($sqlAff); 
$affiche->setFetchMode(PDO::FETCH_OBJ); 
while( $ligne = $affiche->fetch() )
	{
	  echo 'donnees : '.$ligne->nom_du_champ.'<br />';
	};
$affiche->closeCursor(); 
?>

Faire un menu déroulant

<?php
$sqlAff="SELECT * FROM nom_de_la_table order by label_cat asc";
$affiche=$bdd->query($sqlAff); 
$affiche->setFetchMode(PDO::FETCH_OBJ); 
echo '<select name="categorie" id="categorie" class="categorie">';
while( $ligne = $affiche->fetch() )
	{
	  echo '<option value="'.$ligne->nom_du_champ_1.'" class="'.$ligne->nom_du_champ_2.'">'.$ligne->nom_du_champ_3.'</option>';
	};
echo "</select>";
$affiche->closeCursor(); 
?>

Récupérer des données sous forme de variables inscrites dans un tableau

<?php
$info='SELECT * FROM nom_de_la_table WHERE nom_du_champs ="'.$id.'"';

$requete=$bdd->prepare($info);
$requete->bindValue(':id_user',$id);
$requete->bindValue(':nom_du_champ_1',$nom_du_champ_1);

$requete->execute();
$donnees=$requete->fetch();
//si on a retrouvé un enregistrement
if (is_array($donnees)){
	//remplir le tableaux $tabval avec les noms de la base de donnée
	$tabval["id"]=$donnees["id_user"];
	$tabval["nom"]=$donnees["nom_du_champ_1"];
	};
?>

Faire une mise à jour

<?php
$requeteMAJ = "UPDATE nom_de_la_table SET 
	`nom_de_la_valeur_1` = $nom_de_la_valeur_1,
	`prenom` = $prenom,
	`mdp` = '$mdpM'
	WHERE `id_user` = $id";
	
	$bdd->query($requeteMAJ);
?>

Si vous souhaitez simplement rajouter +1 à une valeur, vous pouvez fonctionner de la sorte : ( en adaptant les variables bien entendu ).

<?php

$requeteMAJ = 'UPDATE `tbl_stat` SET  `vue` = vue+1 WHERE  `id_newsletter` = "1"';
$bdd->query($requeteMAJ);

?>

avoir le dernier id créé

Lorsque vous réalisez une insertion dans votre base de données, vous avez normalement créé un id ( un identifiant) unique et auto incrémenté. Vous ne connaissez donc pas cet identifiant sauf si vous intérrogez la base de données. Pour cela, vous avez deux cas de figure. Le premier cas est lorsque vous souhaitez tout simplement savoir quel est le dernier identifiant créé dans votre base. Ce peut être une méthode pour connaitre le nombre d'enregistrement mais ce n'est pas la meilleure. Voici donc la requête pour obtenir l'id maximum, le plus grand id créé. Cette exemple de requête peut également être utilisé pour connaitre, par exemple, le prix le plus grand enregistré dans votre base. En effet, elle vous indique le maximum. Dans la mesure ou votre identifiant unique est auto incrémenté, le dernier sera le plus grand identifiant. Dans cet exemple, nous admettons que id est le titre de l'identifiant mais ce pourrait être id_client par exemple.( idem pour latable).

<?php
$idmax = 'SELECT max(id) as max FROM latable ';

$affichePmax=$bdd->query($idmax);
	$affichePmax->setFetchMode(PDO::FETCH_OBJ);
		while( $lignePmax = $affichePmax->fetch() )
		{ 
echo 'dernier id créé : '.$lignePmax->max.'<br />';
		}
?>

Vous remarquerez que pour plus de simplicité, nous avons utilisé as max.Cela permet de définir un nom plus simple pour récupérer l'id. Mais dans cette situation, il est presque obligatoire pour le récupérer via le code dans la boucle. Maintenant, admettons que vous venez de lancer une requête et que vous souhaitez avoir l'id créé par la requête. Si vous avez besoin de récupérer cet identifiant juste après votre requête, vous pouvez l'obtenir en utilisant ce code :

$lastid=$bdd->lastInsertId();
echo $lastid;			

Compter le nombre d'enregistrement

Il est très intéressant de pouvoir compter le nombre de cas identique ou le nombre de client ayant plus de 30 ans... etc. Pour cela, vous pouvez utiliser le terme count(*) dans votre requête php. Ce terme permet en effet de compter les situations désirées. Pensez à utiliser le terme where pour définir clairement et précisément la requête.

<?php
$registrantexiste = 'SELECT count(*) as qte FROM  latable  WHERE 1=1';
$verif=$bdd->query($registrantexiste);
$verif->setFetchMode(PDO::FETCH_OBJ);

while( $existe = $verif->fetch() )
{
	$resultat =$existe->qte;
	echo $resultat;
}
?>

Vous remarquerez que pour plus de simplicité, nous avons utilisé as qte.Cela permet de définir un nom plus simple pour récupérer la quantité. Mais dans cette situation, il est presque obligatoire pour le récupérer via le code dans la boucle. Voici une autre solution éventuellement plus rapide.

$compte="SELECT `id` FROM `nom_de_table` WHERE 1=1 ;
$calcul = $bdd->prepare($compte);
$calcul->execute();
$count = $calcul->rowCount();
echo $count;



Vous notre contenu ?

Lisez toute l'info de Formaweb avec votre café

Erreur : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known