lab.elastik

Se connecter à la db

Pour se connecter à la BDD il faut 4 infos:

  • le nom du serveur
  • le nom de la BDD
  • le user
  • le mdp

Ces informations diffèrent selon que l’on travaille en local ou en remote (sur le serveur)

				
					try
{	// connexion en local
	$db = new PDO('mysql:host=localhost;dbname=coursphp2022;charset=utf8', 'root', 'root');

	// connexion serveur
	// $db = new PDO('mysql:host=localhost;dbname=coursphp2022;charset=utf8', 'userserver', 'passwordserver');
	
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
				
			

En général je mets en commentaire les infos sur serveur et vice-versa.

Comme on va bcp tester en local et sur le serveur, ça va être compliqué de chaque fois commenter et décommenter la bonne connexion sur toutes les pages. L’idée est donc de créer un fichier unique de connexion, par exemple connexion.php et l’inclure ce fichier sur toutes les pages. 

				
					 require "connexion.php";
				
			

Une fois que ce fichier existe, on peut l’inclure sur toutes les pages où on en a besoin (les pages où on fait des opérations avec la BDD) et on l’upload sur le serveur en ayant décommenté les accès serveur. Une fois que c’est fait, on décommente les infos de connexion en local et on ne touche plus jamais à ce fichier. Et surtout on ne l’upload plus jamais.

Faire une requête dans la BDD et afficher les résultats. Opération SELECT

Considérant que nous avons la table etudiants avec la structure suivante

Dans l’ordre, on va

  1. se connecter à la BDD
  2. préparer la requête
  3. exécuter la requête
  4. stocker tous les résultats obtenus dans un array
				
					//1) connexion DB
 require "connexion.inc.php";
 
//2) préparer la requête
 $sqlQuery = 'SELECT * FROM etudiants';
 $marequete = $db->prepare($sqlQuery);
 
//3) exécuter requête
 $marequete->execute();

//4) stocker tous les résultat obtenus dans un array
 $etudiants = $marequete->fetchAll();
				
			

Dans le cas où la requête contient une condition WHERE, on va devoir 

  1. utiliser des markers
  2. alimenter des markers avec les données que l’on veut (généralement récupérées en $_GET ou $_POST)

Dans l’exemple ci-dessous, je vais aller chercher les infos d’un étudiant sur base de son id. Il faut donc considérer que j’ai passé l’id de l’étudiant par exemple via un lien sur la page précédente

				
					<a href="etudiants.php?id=3">Lien vers page etudiants.php</a>
				
			

Et donc sur la page etudiants.php je vais donc

  • récupérer l’id mis dans le lien sur la page précédente (3 dans mon exemple)
  • créer un marker
  • exécuter ma requête en alimentant le maker id avec l’id reçu en $_GET 
				
					
// récupérer l'id passé en $_GET et le stocker dans une variable
$idetudiant = $_GET["id"];

//1) connexion DB
 require "connexion.inc.php";
 
//2) préparer la requête et utiliser un marker
 $sqlQuery = 'SELECT * FROM etudiants WHERE id = :markerid';
 $marequete = $db->prepare($sqlQuery);
//3) exécuter requêteen alimentant le markerid avec l'id passé en get
 $marequete->execute([
    'markerid' => $idetudiant
]);
// On va donc aller chercher les informations pour l'étudiant avec l'id passé en *$_GET (3 dans ce cas)

//4) stocker tous les résultat obtenus dans un array
 $etudiants = $marequete->fetchAll();
				
			

Une fois nos résultats stockés dans une array $etudiants dans notre cas, nous allons boucler à travers cet array pour afficher les contenus qui nous intéressent.

On va donc créer une boucle foreach à travers nos résultats $etudiants pour en extraire une ligne à chaque itération.

				
					 //5) On boucle à travers les résultats avec une boucle FOREACH

foreach ($etudiants as $etudiant) {

} // fin de la boucle
				
			

Et dans chaque itération, pour chaque ligne,
le contenu sera disponible sous la forme $etudiant[nom-de-la-colonne-de-la-table]

p.ex. pour le nom, ce sera 

$etudiant[nom]

pour l’age

$etudiant[age]

etc.

Il suffit alors d’afficher le contenu comme on le veut. On le fait p.ex. en HTML et puis on remplace les contenus par le contenu dynamique.

D’abord le HTML

				
					<?php foreach ($etudiants as $etudiant) { ?>
<img decoding="async" class="vignette" src="img/visuel-a-venir.png" alt="">
<h1>LEMAL EMMANUEL</h1>
<p><a href="mailto:TRUC@BIDULE.COM">TRUC@BIDULE.COM</a></p>
<p>49 ans</p>
<p>VOICI MA BIO TRALALALA</p>
<?php } // fin de la boucle  ?>
				
			

Puis on dynamise avec le PHP

				
					<?php foreach ($etudiants as $etudiant) { ?>
<img decoding="async" class="vignette" src="img/visuel-a-venir.png" alt="">
<h1><?php echo $etudiant['nom']; ?> <?php echo $etudiant['prenom']; ?></h1>
<p><a href="mailto:<?php echo $etudiant['email']; ?>"><?php echo $etudiant['email']; ?></a></p>
<p><?php echo $etudiant['age']; ?> ans</p>
<p><?php echo $etudiant['bio']; ?></p>
<?php } // fin de la boucle  ?>
				
			

Évidemment pour avoir un affichage correct, vous devez faire appel à vos compétences en HTML & CSS. Il faudrait par exemple inclure dans la boucle une div qui elle même se trouve p.ex. dans un container en Flex flex-direction: row;. Toutes les div générées dans la boucle seraient alors côte à côte.

Faire une requête croisée. LEFT JOIN

Considérant que nous avons la table travaux avec la structure suivante. Nous stockons dans notre table travaux l’id de l’étudiant (qui provient de l’id de la table etudiants) dans le champ idetudiant.

 

table travaux

table etudiants

Lorsque nous allons faire une requête dans notre table travaux, nous allons y récupérer la valeur de idetudiant, et sur base de cet id, aller chercher dans la table etudiants les informations de la ligne dont l’id est égal au champ idetudiant de la table travaux. Ou en résumé

travaux.idetudiant  = etudiants.id  

Lorsqu’on écrit travaux.idetudiant, cela signfie table: travaux / champ: idetudiant

nomtable.nomchamp

Tout ce qui va changer par rapport à ce qui a déjà été décrit ci-dessus, c’est le point 2) la requête.

ATTENTION: àpd ci-dessous, ma requête est faite dans ma table travaux, et non plus etudiants.

				
					//2) préparer la requête et utiliser un marker
 $sqlQuery = 'SELECT * FROM travaux WHERE id = :markerid';

				
			

Je vais commencer par écrire ma requête sur plusieurs lignes:

				
					$sqlQuery = 'SELECT *,
FROM travaux
WHERE id = :markerid
';
				
			

Ensuite je vais ajouter LEFT JOIN où je définis dans quelle table je veux comparer quel champ avec quel champ de la table principale, dans notre cas 

travaux.idetudiant = etudiants.id

				
					$sqlQuery = 'SELECT *,
FROM travaux
LEFT JOIN etudiants ON travaux.idetudiant = etudiants.id
WHERE id = :markerid
';
				
			

Dans certains cas, cela s’avère suffisant. Mais comme lorsque nous allons récupérer les valeurs dans la boucle sous la forme $travail[‘nom’], comme dans les 2 tables nous avons un champ/colonne nom, le système ne saura plus de quel champ nom il s’agit. Celui dans la table travaux, ou celui dans la table etudiants ?

Pour contourner cela, nous allons donc créer des alias.

On va dire que le champ nom de la table etudiants, donc etudiants.nom on va l’apeller nomdeletudiant.

Et travaux.nom on va l’appeler nomdutravail.

				
					$sqlQuery = 'SELECT *,
etudiants.nom AS nomdeletudiant,
travaux.nom AS nomdutravail
FROM travaux
LEFT JOIN etudiants ON travaux.idetudiant = etudiants.id
WHERE id = :markerid
';
				
			

Et donc ensuite, lorsqu’au point 5 (boucle foreach) on récupère les valeurs sous cette forme

$travail[nomduchamp]

on peut utiliser

$travail[nomdeletudiant]

et

$travail[nomdutravail]

Insérer des valeurs INSERT et uploader un fichier

Considérant que nous avons la table travaux avec la structure suivante. Nous allons y insérer des valeurs récupérées par un formulaire.

Nous allons donc au préalable construire le formulaire dont la valeur de idetudiant sera alimentée par la table étudiants.  Attention: comme nous allons aussi envoyer des fichiers dans le formulaire, il est important de le signaler avec enctype= »multipart/form-data »

				
					<form action="insert-travail.php" method="POST"  enctype="multipart/form-data" >
     <input  type="text" name="nomtravail" placeholder="nom du travail">
     <input  type="file" name="photo">
     <button type="submit" >ajouter le travail</button>
</form>
				
			

Pour rappel, un champ HTML select contient des options et est structuré de cette façon

				
					<select name="etudiant">
<option value="1">Aerts Anais</option>
<option value="6">Bah Ibrahima </option>
<option value="16">Bidule Truc</option>
</select>
				
			

Comme vous voulons que ce soit dynamique, nous allons alimenter ce select avec une query dans la table étudiants et

  • utiliser l’id comme value
  • le nom et le prénom comme valeurs à afficher
  • nous allons ordonner le tout par nom de famille (ORDER BY nom)
  • et mettre les premières lettres en Majuscule avec la fonction ucfirst()
				
					
<select name="etudiant" >
<?php

//2) préparer la requête
$sqlQuery = 'SELECT * FROM etudiants ORDER BY nom';
$marequete = $db->prepare($sqlQuery);

//3) exécuter requête
$marequete->execute();
$etudiants = $marequete->fetchAll();

foreach ($etudiants as $etudiant) {
?>

<option value="<?php echo $etudiant['id']; ?>"><?php echo ucfirst($etudiant['nom']); ?> <?php echo ucfirst($etudiant['prenom']); ?></option>

<?php } ?>

</select>
				
			

Dans le fichier qui va traiter les données et les injecter dans la BDD nous allons d’abord récupérer les données envoyées en $_POST et les stocker dans des variables. Attention: les données du fichier arrivent sous forme d’un array dans $_FILES et contient 4 valeurs

$_FILES[nom-du-champ][name]

$_FILES[nom-du-champ][type]

$_FILES[nom-du-champ][tmp_name]

$_FILES[nom-du-champ][size]

Nous allons stocker dans une variable le nom du fichier

				
					//2) récupère les données envoyées par le formulaire
$nomtravail = $_POST["nomtravail"];
$idetudiant = $_POST["etudiant"];
$nomphoto = basename($_FILES['photo']['name']);
				
			

Ensuite, nous allons

  • préparer la requête
  • exécuter la requête à l’aide de markers (déjà utilisés dans un SELECT avec une condition WHERE)

La structure pour insérer est la suivante

INSERT INTO nom-de-table (champ1, champ2) VALUES (:marker1, :marker2) »;

ensuite on alimente les markers lors de l’exécution de la requête.

				
					// //3) préparer la requête   );
 $sqlQuery = " INSERT INTO travaux (nom, idetudiant, photo, une) VALUES (:nom, :idetudiant, :photo, :une)";
 $marequete = $db->prepare($sqlQuery);

 
//4) exécuter requête
$marequete->execute(array(
    'nom' => $nomtravail,
    'idetudiant' => $idetudiant,
    'photo' => $nomphoto,
    'une' => 0
)); 
				
			

Comme nous avons stocké le nom du fichier dans le champ photo, il nous reste juste à

  • uploader le fichier dans un dossier définie
  • changer le nom du fichier car le système utilise le nom temporaire $_FILES[nom-du-champ][tmp_name] pendant le traitement

Dans l’exemple ci-dessous je vais uploader le fichier dans un dossier uploads qui se trouve un niveau au-dessus du fichier de traitement.

La fonction move_uploaded_file prend deux arguments

  • le fichier à traiter: $_FILES[nom-du-champ][tmp_name]
  • L’endroit où le mettre et le nom  à lui donner
				
					 move_uploaded_file($_FILES['photo']['tmp_name'], '../uploads/' . basename($_FILES['photo']['name']));
				
			

Le nom du fichier est maintenant stocké dans la BDD, et lorsque nous voudrons l’afficher, il suffira de mettre la valeur du champ dans l’attribut SRC d’une balise image, précédé du chemin vers le dossier contenant tous les fichiers uploadés.

				
					<img decoding="async" src="uploads/<?php echo $travail['photo']; ?>" alt="<?php echo $travail['sujet']; ?>">
				
			

Faire une query sur base d'un filtre en GET

				
					
<ul>
    <li><a href="TRAVAUX-EN-CLASSE.php?filtre=Edition">Edition</a></li>
    <li><a href="TRAVAUX-EN-CLASSE.php?filtre=Web">Web</a></li>
    <li><a href="TRAVAUX-EN-CLASSE.php?filtre=3D">3D</a></li>
</ul>


<?php

 //1) connexion DB
 require "connexion.inc.php";

 $sqlQuery = 'SELECT * FROM travaux WHERE categories LIKE :marker';
 $marequete = $db->prepare($sqlQuery);


 //3) exécuter requête
 $marequete->execute([
    ':marker' => '%'.$_GET['filtre'].'%'
]);
 $travaux = $marequete->fetchAll();
 foreach ($travaux as $travail) {


echo "<p>".$travail['nom'] . "</p>";


 }
				
			

Pour rappel, un champ HTML select contient des options et est structuré de cette façon

				
					<select name="etudiant">
<option value="1">Aerts Anais</option>
<option value="6">Bah Ibrahima </option>
<option value="16">Bidule Truc</option>
</select>
				
			

Comme vous voulons que ce soit dynamique, nous allons alimenter ce select avec une query dans la table étudiants et

  • utiliser l’id comme value
  • le nom et le prénom comme valeurs à afficher
  • nous allons ordonner le tout par nom de famille (ORDER BY nom)
  • et mettre les premières lettres en Majuscule avec la fonction ucfirst()
				
					
<select name="etudiant" >
<?php

//2) préparer la requête
$sqlQuery = 'SELECT * FROM etudiants ORDER BY nom';
$marequete = $db->prepare($sqlQuery);

//3) exécuter requête
$marequete->execute();
$etudiants = $marequete->fetchAll();

foreach ($etudiants as $etudiant) {
?>

<option value="<?php echo $etudiant['id']; ?>"><?php echo ucfirst($etudiant['nom']); ?> <?php echo ucfirst($etudiant['prenom']); ?></option>

<?php } ?>

</select>
				
			

Dans le fichier qui va traiter les données et les injecter dans la BDD nous allons d’abord récupérer les données envoyées en $_POST et les stocker dans des variables. Attention: les données du fichier arrivent sous forme d’un array dans $_FILES et contient 4 valeurs

$_FILES[nom-du-champ][name]

$_FILES[nom-du-champ][type]

$_FILES[nom-du-champ][tmp_name]

$_FILES[nom-du-champ][size]

Nous allons stocker dans une variable le nom du fichier

				
					//2) récupère les données envoyées par le formulaire
$nomtravail = $_POST["nomtravail"];
$idetudiant = $_POST["etudiant"];
$nomphoto = basename($_FILES['photo']['name']);
				
			

Ensuite, nous allons

  • préparer la requête
  • exécuter la requête à l’aide de markers (déjà utilisés dans un SELECT avec une condition WHERE)

La structure pour insérer est la suivante

INSERT INTO nom-de-table (champ1, champ2) VALUES (:marker1, :marker2) »;

ensuite on alimente les markers lors de l’exécution de la requête.

				
					// //3) préparer la requête   );
 $sqlQuery = " INSERT INTO travaux (nom, idetudiant, photo, une) VALUES (:nom, :idetudiant, :photo, :une)";
 $marequete = $db->prepare($sqlQuery);

 
//4) exécuter requête
$marequete->execute(array(
    'nom' => $nomtravail,
    'idetudiant' => $idetudiant,
    'photo' => $nomphoto,
    'une' => 0
)); 
				
			

Comme nous avons stocké le nom du fichier dans le champ photo, il nous reste juste à

  • uploader le fichier dans un dossier définie
  • changer le nom du fichier car le système utilise le nom temporaire $_FILES[nom-du-champ][tmp_name] pendant le traitement

Dans l’exemple ci-dessous je vais uploader le fichier dans un dossier uploads qui se trouve un niveau au-dessus du fichier de traitement.

La fonction move_uploaded_file prend deux arguments

  • le fichier à traiter: $_FILES[nom-du-champ][tmp_name]
  • L’endroit où le mettre et le nom  à lui donner
				
					 move_uploaded_file($_FILES['photo']['tmp_name'], '../uploads/' . basename($_FILES['photo']['name']));
				
			

Le nom du fichier est maintenant stocké dans la BDD, et lorsque nous voudrons l’afficher, il suffira de mettre la valeur du champ dans l’attribut SRC d’une balise image, précédé du chemin vers le dossier contenant tous les fichiers uploadés.

				
					<img decoding="async" src="uploads/<?php echo $travail['photo']; ?>" alt="<?php echo $travail['sujet']; ?>">