Pages web et SQL

Prérequis

Vous avez un serveur local qui fonctionne, avec PhPMyAdmin

Vous avez au moins une base de données créée dans PhP MyAdmin (voir cours Créer une base de données avec PhPMyAdmin )


Introduction

Nous allons voir comment réaliser plusieurs requêtes en SQL, d'abord effectuées dans l'onglet SQL de PhPMyAdmin (pour voir si elles fonctionnent par exemple), puis directement depuis une page web.

Vous pouvez suivre ce cours avec la base de données vue dans le cours sur le fait d'héberger un site web (Filiere-2.sql), pour laquelle sont fournies les corrections. Vous pouvez également le faire avec votre propre base de données.

Ce cours propose un aperçu des fonctionnalités et des instructions de SQL. Pour plus d'instruction SQL dans la documentation: https://sql.sh

Sommaire

Se connecter à une base de données dans une page web

La première étape pour utiliser une base de données directement dans votre page web, c'est de vous y connecter via votre page web.

Pour cela, nous allons utiliser PDO


Si vous utiliser votre site en ligne, cette étape doit déjà fonctionner suite au cours Deployer son site web.


Pour établir une connexion avec une base de données en local, voici la procédure:

Sur votre serveur web (MAMP, XAMMP...), verifier que votre serveur web est activé.

Télécharger le fichier suivant si vous souhaitez utiliser la base de données Filiere pour ce cour, et importer dans PhPMyAdmin. En important le fichier suivant dans PhPMyAdmin, cela vous permet de télécharger les tables et les occurences de la base de données Filiere utilisée dans le cours Créer une base de données avec PhPMyAdmin :

Fichier Filière-2.sql à importer pour créer les tables de la base de données Filiere


Maintenant, vous devez avoir une base de données dans PhPMyAdmin avec laquel vous allez vous connecter en local via votre site web.

Instruction PhP à mettre dans votre page pour vous connecter

Nous allons utiliser l'instruction suivante pour se connecter sur votre base de données, avec en gras les éléments à modifier selon votre cas.

Pour vous connecter, il vous faut les droits, vous vous authentifiez donc avec un login et un mot de passe.


Voici plus de détails, partie par partie:

  • $bdd = : l'accès à la base de données, une fois la connexion faite, est stocké dans une variable (ici, le nom de cette variable PhP est bdd)

  • new PDO( : demande de l'initialisation de l'accès

  • " : (premier paramètre composé de:)

    • mysql:host=localhost; : nom de la source des données

    • dbname=mabase; : nom de la base de données

    • charset=utf8 : encodage

  • ", (fin du premier paramètre)

  • "mabase_login", login de l'utilisateur de la base

  • "mabase_mdp", mot de passe de l'utilisateur

  • array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); enregistremebt des erreurs si la connexion ne fonctionne pas.



<?php

$bdd = new PDO( "mysql:host=localhost;dbname=mabase;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));


?>

A ce stade, nous récuperons l'erreur, mais nous ne l'affichons pas si la connexion échoue. Nous allons donc mettre cette instruction dans un bloc Try Catch (c'est à dire Essayer, si ça ne fonctionne pas Intercepter l'erreur), ci-contre en italique:



<?php try {

$bdd = new PDO( "mysql:host=localhost;dbname=mabase;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}


?>

Si vous avez téléchargé et importé le fichier Filiere-2.sql, , vous utiliserez mysql:host=localhost;dbname=Filiere. Sinon, utiliser les nom de votre base de données à la place de Filiere.


Il ne reste donc qu'à obtenir un login et un mot de passe pour la base de données


Nous allons maintenant créer un identifiant et un mot de passe pour la base de données via PhPmyAdmin, afin de nous connecter

<?php try {

$bdd = new PDO( "mysql:host=localhost;dbname=Filiere;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}



Créer votre compte utilisateur dans PhPMyAdmin

Sur la page PhPMyAdmin, aller sur l'accueil en cliquant sur l'icone de la maison en haut à gauche.

Dans l'onglet Compte utilisateur, vous voyez la liste des utilisateurs.

En dessous de la liste des comptes, cliquer sur Ajouter un compte d'utilisateur

  • Saisissez un nom utilisateur (celui que vous mettrez dans l'instruction vue précédemment), dans mon cas, j'ai mis lauren en minuscules.

  • Sélectionner Local à Nom d'hôte

  • Choisissez un mot de passe (celui que vous mettrez dans l'instruction vue précédemment). Pour la suite de l'exemple, j'ai renseigné un mot de passe particulièrement mauvais: admin


Afin de pouvoir réaliser l'ensemble des requêtes SQL, j'ai choisi dans Editer les privilièges, de Tout cocher.

Attention: pour votre site web, cela est déconseillé, car il serait alors possible d'effacer des données, des tables etc.


Cliquer sur Exécuter en bas à droite.

Le nouveau compte a été créé:

Connectez-vous à votre base de données avec votre compte utilisateur nouvellement créé


Retournez à votre code source PhP.

Remplacer, dans l'instruction, "mabase_login", "mabase_mdp" par votre login utilisateur et votre mot de passe nouvellement créé.

Dans mons cas, j'écrirais:

<?php try {

$bdd=new PDO("mysql:host=localhost;dbname=Filiere;charset=utf8", "lauren", "admin",

array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}

<?php try {

$bdd = new PDO( "mysql:host=localhost;dbname=Filiere;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}



Vous pouvez intégrer cette instruction dans une page, afin de voir si la page s'affiche (connexion réussie) ou s'il y a une Erreur Fatale, dans quel cas la connexion n'a pas marché.


Veillez à ouvrir votre page web via votre serveur web, sinon cela ne fonctionnera pas

CAS 1: la page s'affiche, la connexion à la base de données a réussi

CAS 2: une erreur s'affiche, la connexion à la base de données n'a pas abouti

Fonctionnement général

Vous êtes connecté.e.s à votre base de données, maintenant il reste à effectuer les requêtes depuis votre page web.

Le principe est très simple:

  • vous tapez votre requête dans une chaine de caractère en PhP

  • vous exécuter la requête en utilisant la variable utilisée pour la connexion avec votre base de données ($bdd dans la section précédente) ave query

Vous voulez faire la requête "SELECT * FROM Cours" ? ll vous suffit d'utiliser cette chaine de caractère avec query() et votre variable $bdd. Vous verrez dans les section suivante comment afficher les resultats pour les requêtes SELECT.

<?php

$instructions = "SELECT * FROM Cours";

$requete = $bdd -> query ($instructions);

?>

Le cas des requêtes préparées

Imaginons que l'on souhaite changer faire un SELECT mais que l'on puisse changer le nom du champ (ou attribut ou colonne) et de la table à afficher. On fait un référence à la base de donnée ($bdd) avec prepare, puis on remplace, dans la requête, les valeurs par un marqueur avec un nom précédé de deux points. On associe dans bindValue le nom du marqueur et la valeur qui remplace le marqueur, puis on exécute.

Attention, ces marqueurs ne peuvent remplacer que des paramètres, après le mot clef WHERE par exemple. Par exemple, dans le deuxième exemple, la valeur de l'idCours pourra être modifié en fonction du contexte (utilisateur, formulaire, etc.)


Exemple de requêtes préparées SANS marqueurs

<?php

$requete = $bdd->prepare("SELECT * FROM Cours");

$requete->execute();

?>


Exemple de requêtes préparées AVEC marqueurs

<?php

$requete = $bdd->prepare("SELECT * FROM Cours WHERE idCours=:monID");

$laValeurdeID= "3";

$requete->bindValue('monID',$laValeurdeID,PDO::PARAM_STR );

$requete->execute();

?>


Utiliser les résultats d'un SELECT

La variable $requete (après le exécute), est d'un type un peu particulier. Pour récupérer les résultats, nous allons "aller chercher" (litteralement: fetch) les résultats ligne par ligne. Pour cela, on utilise une boucle while qui s'arrête quand il n'y a plus de résultat à traiter. La ligne est un tableau associatif, où on récupère la valeur de la cellule en fonction du nom de la colonne dans la base de données. Par exemple, pour récupérer la valeur dans la colonne Nom pour tous les resultats, on utilise, en plus de la requête précédente:


<?php


while ( $ligne = $requete->fetch() ) {

echo "<p> Valeur du champ:". $ligne['NomDeLaColonne']."</p>";


}


?>


Ajouter et supprimer une occurrence (une ligne)

Pour créer une nouvelle occurrence où attribut1 vaut valeur1Attribut1, attribut2 vaut valeur1Attribut2 et où attribut3 vaut valeur1Attribut3 dans une table maTable, si vous avez les droits, la requête est composée du mot clef INSERT INTO, du nom de la table, et entre parenthèses le nom des attributs de cette table, suivi du mot clef VALUES puis entre parenthèses les valeurs de ces attributs dans le même ordre que déclaré avant VALUES:

INSERT INTO maTable ( attribut1, attribut2, attribut3) VALUES (valeur1Attribut1, valeur1Attribut2, valeur1Attribut3)


Après VALUES, on peut rajouter plusieurs occurrences, en mettant entre parenthèses toutes les valeurs des occurrences, et en séparant les occurrences par des virgules:

INSERT INTO maTable ( attribut1, attribut2, attribut3) VALUES (valeur1Attribut1, valeur1Attribut2, valeur1Attribut3), (valeur2Attribut1, valeur2Attribut2, valeur2Attribut3), (valeur3Attribut1, valeur3Attribut2, valeur3Attribut3),


Pour supprimer une occurrence dans une table maTable, si vous avez les droits, la requête est composée du mot clef DELETE FROM puis du nom de la table, du mot clef WHERE, suivi de l'attribut de la clef primaire et de sa valeur pour l'occurrence à supprimmer:

DELETE FROM maTable WHERE maClefPrimaire = valeurDeClefPrimaire


On peut également utiliser n'importe quelle condition avec WHERE . Un certain nombre de conditions utilisé avec WHERE sont détaillées dans la section suivant (SELECT).


Rappel Ajout

Aller dans PhPMyAdmin, puis sur l'onglet SQL

Ecrivez la requête pour créer une nouvelle UE:


Votre occurrence a été ajouté dans votre table:

Exercice 1. Faites une requête pour ajouter une UE, mais depuis votre page web au lieu d'utiliser PhPMyAdmin

<?php

$requeteInsert= "INSERT INTO UE (idUE, Nom, CreditECTS) VALUES (NULL, 'Analyse de donnée', '4')";

$insertion=$bdd -> query($requeteInsert);


?>

Exercice 2. Faites une requête préparée pour ajouter une UE, mais depuis votre page web

<? php

$requeteInsert= $bdd -> prepare("INSERT INTO UE (idUE, Nom, CreditECTS) VALUES (NULL, :nom,:credits)");


$leNom= "Environnement numerique";

$lesCredits = "4";


$requeteInsert->bindValue('credits', $lesCredits,PDO::PARAM_STR );

$requeteInsert->bindValue('nom',$leNom,PDO::PARAM_STR );

$requeteInsert->execute();

?>

Rappel Suppression

Aller dans PhPMyAdmin, puis sur l'onglet SQL

Ecrivez la requête pour supprimer la dernière UE créée.

Votre occurrence a été supprimée de votre table:



Exercice 3. Faites une requête pour supprimer l'UE, mais depuis votre page web au lieu d'utiliser PhPMyAdmin

<?php

$requeteDelete= "DELETE FROM UE WHERE idUE='10'";

$insertion=$bdd -> query($requeteDelete);

?>

Exercice 4. Faites une requête préparée pour supprimer une UE, mais depuis votre page web

<?php

$requeteDelete=$bdd -> prepare("DELETE FROM UE WHERE idUE=:id");

$leID="11";

$requeteDelete->bindValue('id',$leID,PDO::PARAM_STR );

$requeteDelete->execute();

?>


Requêtes SQL pour interroger une table

Selectionner tout le contenu d'une table

Si une table s'appelle MATABLE dans une base de données, on peut sélectionner toutes les données de la table avec l'instruction suivante:

SELECT * FROM MATABLE


Si on regarde cette instruction en détail:

  • SELECT : instruction SQL pour sélectionner les données correspondantes aux contraintes données par la suite

  • * : permet de sélectionner toutes les colonnes (= tous les attributs) de la table spécifiée par la suite

  • FROM : instruction SQL pour indiquer la table (= la relation) que l'on utilise pour sélectionner les données

  • MATABLE : nom de la table que l'on utiliser pour sélectionner les données


Exemple dans PhPMyAdmin

Dans PhPMyAdmin, selectionner une base de données (ici, Filiere) dans l'aborescence à gauche.

Aller dans l'onglet SQL. Nous allons tenter de sélectionner toutes les évaluations enregistrées dans la base de données.

Nous souhaitons donc "sélectionner" + "tous les attributs" des occurrences + "de la table Evaluation".

La requête correspondante est donc:

SELECT * FROM Evaluation

Ecrivez cette requête dans l'encadré dédié et cliquez sur Exécuter

Une fois exécutée, l'ensemble des occurences de la table (il y en a 4 ici) et l'ensemble des attributs (idEvaluation, Modalites, Debut, Fin, Sujet et idCours) est affiché

Exercice 5. Dans une base de données, par exemple Filiere, récupérer l'ensemble des données d'une autre relation, par exemple Cours via PhPMyAdmin

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Cours dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 6. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT * FROM Cours";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée (attention, le nom de la table n'est PAS un paramètre):


$requete=$bdd -> prepare("SELECT * FROM Cours");

$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p> idCours: ". $ligne['idCours'].", Nom du cours: ". $ligne['NomCours'].", UE asociée au cours: ". $ligne['idUE']."</p>";

}

Selectionner le contenu de certains attributs d'une table

Si une table s'appelle MATABLE dans une base de données et a trois attributs Colonne1, Colonne2 et Colonne3, on peut sélectionner les données de certaines colonnes de la table en remplaçant "*" vu précédemment par les noms des attributs séparés par des virgules.

Seulement une des colonnes:

Pour Colonne1:

SELECT Colonne1 FROM MATABLE


Pour Colonne2:

SELECT Colonne2 FROM MATABLE


Pour Colonne3:

SELECT Colonne3 FROM MATABLE


Seulement deux des colonnes:

Pour Colonne1 et Colonne2:

SELECT Colonne1, Colonne2 FROM MATABLE


Pour Colonne2 et Colonne3:

SELECT Colonne2, Colonne3 FROM MATABLE


Pour Colonne1 et Colonne3:

SELECT Colonne1,Colonne3 FROM MATABLE


Exemple dans PhPMyAdmin

Dans PhPMyAdmin, selectionner une base de données (ici, Filiere) et ller dans l'onglet SQL.

Nous souhaitons donc "sélectionner" + "les modalités, la fin et le sujet" des occurrences + "de la table Evaluation".

La requête correspondante est donc:

SELECT Modalites, Fin, Sujet FROM Evaluation

Ecrivez cette requête dans l'encadré dédié et cliquez sur Exécuter.

Seuls ces trois attributs sont affichés.

Exercice 7

Question 1. Dans une base de données, par exemple Filiere, récupérer un seul des attributs des données d'une autre relation, par exemple NomCours dans Cours

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT NomCours FROM Cours dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Question 2. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT NomCours FROM Cours";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT NomCours FROM Cours");

$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p> "Nom du cours ". $ligne['NomCours']."</p>";

}

Question 3. Dans une base de données, par exemple Filiere, récupérer deux des attributs des données d'une autre relation, par exemple NomPersonne et PrenomPersonne dans Personne

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT NomPersonne,PrenomPersonne FROM Personne

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Question 4. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT NomPersonne,PrenomPersonne FROM Personne";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT NomPersonne,PrenomPersonne FROM Personne");

$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Selectionner les occurences d'une table respectant certaines contraintes

Imaginons table qui s'appelle MATABLE dans une base de données et a trois attributs Colonne1, Colonne2 et Colonne3. On peut sélectionner les lignes (=occurences) respectant certaines condition (ou contraintes). Pour cela on rajoute le mot clef WHERE à la fin de la requête SELECT suivi de la contrainte.

Cela est indépendant de la première partie de la requête, où on choisit les attributs à retourner par la requête



Seulement les lignes où un attribut a une valeur donnée:

Si on veut sélectionner toutes colonnes et afficher les lignes qui ont la valeur maValeur dans la colonne Colonne1 :

SELECT * FROM MATABLE Colonne1="maValeur"



Si on veut sélectionner les colonnes Colonne2 et Colonne3 et afficher toutes les lignes qui ont la valeur maValeur dans la colonne Colonne1 :

SELECT Colonne1, Colonne3 FROM MATABLE Colonne1="maValeur"


Exemple dans PhPMyAdmin avec la table Filière:

Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Evaluation pour le cours de base de données (idCours=2)

SELECT * FROM Evaluation WHERE idCours="2"


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons les modalités et le sujet de la table Evaluation pour le cours de base de données (idCours=2)

SELECT Modalites, Sujet FROM Evaluation WHERE idCours="2"


Exercice 8. Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant une certaine valeur pour un attribut donné, par exemple la liste des occurrences de Personne ayant comme nom de famille Monster.

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Personne WHERE NomPersonne="Monster"

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 9. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= " SELECT * FROM Personne WHERE NomPersonne='Monster' ";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare(" SELECT * FROM Personne WHERE NomPersonne=:nom");

$laValeur='Monster';

$requete->bindValue('nom',$laValeur,PDO::PARAM_STR );

$requete->execute();




Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Seulement les lignes où un attribut prend une des valeurs d'une liste:

Si on veut sélectionner toutes colonnes et afficher les lignes qui ont les valeurs maValeur1 ou maValeur2 dans la colonne Colonne1 :

SELECT * FROM MATABLE WHERE Colonne1 IN ( "maValeur1", "maValeur2" )


Si on veut sélectionner les colonnes Colonne2 et Colonne3 et afficher toutes les lignes qui ont la valeur maValeur dans la colonne Colonne1 :

SELECT Colonne1, Colonne3 FROM MATABLE WHERE Colonne1 IN ( "maValeur1", "maValeur2" )

Exemple dans PhPMyAdmin avec la table Filière:

Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Evaluation qui sont soit des projets, soit des dossiers

SELECT * FROM Evaluation WHERE Modalites IN ("Dossier", "Projet")



Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons le sujet et la date de fin de la table Evaluation pour le cours de base de données (idCours=2)

SELECT Sujet, Fin FROM Evaluation WHERE Modalites IN ("Dossier", "Projet")

Exercice 10

Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant un attribut dans une liste de trois valeurs, par exemple la liste des occurrences de Personne ayant comme nom de famille Monster, Thevin ou JadorelUCO

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Personne WHERE NomPersonne IN ("Monster", "Thevin", "JadorelUCO") dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 11. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT * FROM Personne WHERE NomPersonne IN ('Monster', 'Thevin', 'JadorelUCO') ";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT * FROM Personne WHERE NomPersonne IN (:valeur1, :valeur2, :valeur3)");


$laValeur1="Monster";

$laValeur2="Thevin";

$laValeur3= "JadorelUCO";

$requete->bindValue('valeur1',$laValeur1,PDO::PARAM_STR );

$requete->bindValue('valeur2',$laValeur2,PDO::PARAM_STR );

$requete->bindValue('valeur3',$laValeur3,PDO::PARAM_STR );


$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Seulement les lignes où un attribut est inférieur, supérieur ou entre deux valeurs:

Si on veut sélectionner toutes colonnes et afficher les lignes qui ont les valeurs inférieures à maValeur1 dans la colonne Colonne1 :

SELECT * FROM MATABLE WHERE Colonne1 < "maValeur1"


Si on veut sélectionner toutes colonnes et afficher les lignes qui ont les valeurs supérieures à maValeur2 dans la colonne Colonne1 :

SELECT * FROM MATABLE WHERE Colonne1 > "maValeur2"


Si on veut sélectionner toutes colonnes et afficher les lignes qui ont les valeurs entre maValeur1 et maValeur2 dans la colonne Colonne1 :

SELECT * FROM MATABLE WHERE Colonne1 BETWEEN "maValeur1" AND "maValeur2"


Exemple dans PhPMyAdmin avec la table Filière:

Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Evaluation qui ont un rendu avant Noël 2020

SELECT * FROM Evaluation WHERE Fin < '2020-12-24 23:59:00'


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Evaluation qui ont un rendu après le premier de l'an 2021

SELECT * FROM Evaluation WHERE Fin > '2021-01-01 00:00:01'


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Evaluation qui ont un rendu après Noël et avant le premier de l'an 2021

SELECT * FROM Evaluation WHERE Fin BETWEEN '2020-12-24 23:59:00' AND '2021-01-01 00:00:01'

Exercice 12. Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant un attribut dans un intervalle, par exemple la liste des occurrences de Personne ayant un idPersonne entre 4 et 25

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Personne WHERE idPersonne BETWEEN "4" AND "25" dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 13. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT * FROM Personne WHERE idPersonne BETWEEN '4' AND '25' ";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT * FROM Personne WHERE idPersonne BETWEEN :valeurUn AND :valeurDeux");

$laValeurUn="4";

$laValeurDeux="25";


$requete->bindValue('valeurUn',$laValeurUn,PDO::PARAM_STR );

$requete->bindValue('valeurDeux',$laValeurDeux,PDO::PARAM_STR );


$requete->execute();




Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Seulement les lignes où un attribut contient une séquence:

Si on veut sélectionner toutes colonnes et afficher les lignes qui ont les valeurs commence par maValeur1 dans la colonne Colonne1, on ajoute le caractère "%" à la fin de maValeur:

SELECT * FROM MATABLE WHERE Colonne1 LIKE "maValeur1%"


Si on veut sélectionner toutes colonnes et afficher les lignes qui ont les valeurs finissent par maValeur2 dans la colonne Colonne1, on ajoute le caractère "%" au début de maValeur:

SELECT * FROM MATABLE WHERE Colonne1 LIKE "%maValeur2"



Si on veut sélectionner toutes colonnes et afficher les lignes qui contiennent maValeur3 dans la colonne Colonne1, on ajoute le caractère "%" au début et à la fin de maValeur

SELECT * FROM MATABLE WHERE Colonne1 LIKE "%maValeur3%"



Si on veut sélectionner toutes colonnes et afficher les lignes qui contiennent maValeur1, maValeur2 puis maValeur3 (dans cet ordre) dans la colonne Colonne1 , on intercale de % entre les valeurs:

SELECT * FROM MATABLE WHERE Colonne1 LIKE "%maValeur1%maValeur2%maValeur3%"

Exemple dans PhPMyAdmin avec la table Filière:

Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne qui ont un prénom qui commence par Li

SELECT * FROM Personne WHERE PrenomPersonne LIKE "Li%"


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne qui ont un prénom qui fini par un w

SELECT * FROM Personne WHERE PrenomPersonne LIKE "%w"



Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne qui ont un prénom qui contient un a

SELECT * FROM Personne WHERE PrenomPersonne LIKE "%a%"



Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne qui ont un prénom qui contient un l puis un i puis un a dans cet ordre.

SSELECT * FROM Personne WHERE PrenomPersonne LIKE "%l%i%a%"

Nous considérons que vous savez utiliser prepare, query, execute et fetch. La suite est un rappel sur les types de requêtes, que vous pouvez effectuer dans PhPMyAdmin afin de verifier leur exactitude

Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant un attribut contenant une certaine valeur, par exemple la liste des occurrences de Cours ayant un nom contenant web

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Cours WHERE nomCours LIKE "%web%"

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant un attribut contenant une plusieurs fois une certaine valeur, par exemple la liste des occurrences de Cours ayant un nom contenant au moins deux e

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Cours WHERE nomCours LIKE "%e%e%"

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Trier les données selon une colonne

Tri Ascendant (alphabétique, du plus petit au plus grand)

Si une table s'appelle MATABLE dans une base de données et a trois attributs Colonne1, Colonne2 et Colonne3, on peut trier les données récupérées avec l'instruction ORDER BY suivi du nom de la colonne qui sert pour le tri

SELECT * FROM MATABLE ORDER BY Colonne1


Cela est équivalent à (ASC pour ascendant):

SELECT * FROM MATABLE ORDER BY Colonne1 ASC


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne triées en fonction du prénom

SELECT * FROM Personne ORDER BY PrenomPersonne


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons les prénoms de la table Personne triées en fonction du nom de famille par ordre alphabétique

SELECT PrenomPersonne FROM Personne ORDER BY NomPersonne

Dans une base de données, par exemple Filiere, trier la liste des occurrences d'une relation en fonction d'un attribut, par exemple la liste des Cours en fonction du numéro de l'idUE

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Cours ORDER BY idUE

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Dans une base de données, par exemple Filiere, trier la liste des occurrences d'une relation en fonction d'un attribut en en affichant qu'une partie, par exemple afficher le numéro étudiant NEtudiant de Etude trié en fonction de idPersonne (qui lui n'est pas affiché)

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT NEtudiant FROM Etude ORDER BY idPersonne

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Tri descendant (du plus grand au plus petit)

Si une table s'appelle MATABLE dans une base de données et a trois attributs Colonne1, Colonne2 et Colonne3, on peut trier les données récupérées avec l'instruction ORDER BY suivi du nom de la colonne qui sert pour le tri, puis de DESC (pour descendant)

SELECT * FROM MATABLE ORDER BY Colonne1 DESC



Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne triées en fonction du prénom à l'inverse de l'ordre alphabétique

SELECT * FROM Personne ORDER BY PrenomPersonne DESC


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons les prénoms de la table Personne triées en fonction du nom de famille par ordre alphabétique

SELECT PrenomPersonne FROM Personne ORDER BY NomPersonne DESC

Dans une base de données, par exemple Filiere, trier la liste des occurrences d'une relation en fonction d'un attribut, par exemple la liste des Cours en fonction du numéro de l'idUE

PAR ORDRE DESCENDANT

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Cours ORDER BY idUE DESC

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Dans une base de données, par exemple Filiere, trier la liste des occurrences d'une relation en fonction d'un attribut en en affichant qu'une partie, par exemple afficher le numéro étudiant NEtudiant de Etude trié en fonction de idPersonne (qui lui n'est pas affiché)

PAR ORDRE DESCENDANT

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT NEtudiant FROM Etude ORDER BY idPersonne DESC

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Trier les données selon plusieurs colonnes

Tri ascendant sur toutes les colonnes

Si une table s'appelle MATABLE dans une base de données et a trois attributs Colonne1, Colonne2 et Colonne3, on peut trier les données récupérées avec l'instruction ORDER BY suivi du nom de la colonne qui sert pour le tri en premier, puis celle qui sert en deuxième etc.

SELECT * FROM MATABLE ORDER BY Colonne1, Colonne2


Cela est équivalent à (ASC pour ascendant):

SELECT * FROM MATABLE ORDER BY Colonne1 ASC, Colonne2 ASC,


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne triées en fonction du prénom d'abord, puis en fonction du nom de famille s'il y a des prénoms identiques

SELECT * FROM Personne ORDER BY PrenomPersonne, NomPersonne


Tri descendant sur certaines colonnes

Il faut rajouter le suffixe DESC et ASC à la suite des colonnes selon si le tri est descendant ou ascendant sur cette colonne. Pour trier par ordre descendant sur la colonne1, puis ascendant sur la colonne2 puis 3 et descendant sur la colonne 4:

SELECT * FROM MATABLE ORDER BY Colonne1 DESC, Colonne2 ASC, Colonne3 ASC, Colonne4 DESC


Voici un exemple avec la base de données Filiere que vous pouvez essayer. Nous affichons toutes les informations de la table Personne triées en fonction du prénom d'abord à l'inverse de l'ordre alphabétique, puis en fonction du nom de famille dans l'ordre alphabétique s'il y a des prénoms identiques

SELECT * FROM Personne ORDER BY PrenomPersonne DESC, NomPersonne ASC


Dans une base de données, par exemple Filiere, trier la liste des occurrences d'une relation en fonction de plusieurs attribut,s par exemple la liste des Enseignant en fonction du numéro de l'idPersonne d'abord (croissant), puis par nombre d'heures CM (décroissant), puis par nombre d'heures TD (croissant)

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Enseignant ORDER BY idPersonne ASC, HeuresCM DESC, HeuresTD ASC

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Jointures: recréer une seule table à partir des clefs étrangère

Une jointure permet de recréer une seule table en associant les clefs étrangères à une clef primaire. On va faire "virtuellement" des nouvelles occurrences d'une "nouvelle" table combinant les valeurs dans une table 1 et 2.

Une jointure permet d'associer une clef étrangère de l'attribut clefEtrangere dans une table maTable1 avec les valeurs de l'occurrence correspondant sont les clefs primaires clefPrimaire dans la table maTable2

Inner join

Inner join est une jointure qui ne garde que les occurrences qui sont à la fois une valeur présente en tant que clef étrangère dans la table 1 et à la fois clef primaire dans la table 2 (cf illustration ci-après):

SELECT * FROM maTable1 INNER JOIN maTable2 ON maTable1.clefEtrangere =maTable2.clefPrimaire


Voici une exemple de la base Filière, où la table Cours est liée à une UE via une clef étrangère. On peut lier les occurrences ce cours (ex: base de données) avec le nom de l'UE à laquelle il est rattaché (ex: UE Programmation) qui est dans une autre table. Vous avez l'illustration juste en dessous.

SELECT * FROM Cours INNER JOIN UE ON cours.idUE=UE.idUE


Occurrences de la table Cours

idUE est une clef étrangère

Occurrences de la table UE

idUE est une clef primaire

Mise en lien via INNER JOIN

On ne garde que les cours qui ont des idUE existants dans les deux tables

Dans une base de données, par exemple Filiere, faire la jointe dans Enseignant pour associer la Personne qui enseigne

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Enseignant INNER JOIN Personne ON Enseignant.idPersonne= Personne.idPersonne

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Right join

Right join est une jointure qui garde, comme INNER JOIN, les occurrences qui sont à la fois une valeur présente en tant que clef étrangère dans la table 1 et à la fois clef primaire dans la table 2, mais qui en plus ajoute les occurrences qui sont dans la table à droite de joint (cf illustration ci-après)

SELECT * FROM maTable1 RIGHT JOIN maTable2 ON maTable1.clefEtrangere =maTable2.clefPrimaire


Voici une exemple de la base Filière, où la table Cours est liée à une UE via une clef étrangère. On peut lier les occurrences ce cours (ex: base de données) avec le nom de l'UE à laquelle il est rattaché (ex: UE Programmation) qui est dans une autre table. Vous avez l'illustration juste en dessous.

SELECT * FROM Cours RIGHT JOIN UE ON Cours.idUE=UE.idUE


Left join

Left join est une jointure qui garde, comme INNER JOIN, les occurrences qui sont à la fois une valeur présente en tant que clef étrangère dans la table 1 et à la fois clef primaire dans la table 2, mais qui en plus ajoute les occurrences qui sont dans la table à gauche de joint (cf illustration ci-après)

SELECT * FROM maTable1 LEFT JOIN maTable2 ON maTable1.clefEtrangere =maTable2.clefPrimaire


En général, on échange alors l'ordre des tables, car avec la vérification sur les valeurs des clefs étrangères, en principe vous ne deviez pas avoir de clef étrangère qui n'existe pas en tant que clef primaire:

SELECT * FROM maTable1 LEFT JOIN maTable2 ON maTable1.clefEtrangere =maTable2.clefPrimaire


Voici une exemple de la base Filière, où la table Cours est liée à une UE via une clef étrangère. On peut lier les occurrences ce cours (ex: base de données) avec le nom de l'UE à laquelle il est rattaché (ex: UE Programmation) qui est dans une autre table. Vous avez l'illustration juste en dessous.

SELECT * FROM UE LEFT JOIN Cours ON Cours.idUE=UE.idUE

Occurrences de la table Cours

idUE est une clef étrangère

Occurrences de la table UE

idUE est une clef primaire

Mise en lien via

Cours RIGHT JOIN UE

On garde que les cours qui ont des idUE existants dans les deux tables, plus ceux dans la table de droite de JOIN

Occurrences de la table Cours

idUE est une clef étrangère

Occurrences de la table UE

idUE est une clef primaire

Mise en lien via

UE LEFT JOIN Cours

On garde que les cours qui ont des idUE existants dans les deux tables, plus ceux dans la table de gauche de JOIN


Dans une base de données, par exemple Filiere, faire la jointure RIGHT JOIN dans Enseignant pour associer la Personne qui enseigne et afficher tous les enseignants

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Enseignant RIGHT JOIN Personne ON Enseignant.idPersonne= Personne.idPersonne

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Dans une base de données, par exemple Filiere, faire la jointure LEFT JOIN dans Enseignant pour associer la Personne qui enseigne et afficher tous les enseignants

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Personne LEFT JOIN Enseignant ON Enseignant.idPersonne= Personne.idPersonne

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Vous savez utiliser des requêtes dans une page web!