technologies du web · basé sur les cours de jean-pierre lozi, philippe renevier et andrea...
TRANSCRIPT
Technologies du WebPHP (cont.)
Par Elena CABRIO
Basé sur les cours de Jean-Pierre Lozi, Philippe Renevier et Andrea Tettamanzi
18/03/2020 Technologies du Web – ELENA CABRIO 1
Fonctions utiles pour les tableaux
18/03/2020 Technologies du Web – ELENA CABRIO 2
Pour ré-indexer : array_values()
$a = array(0 => 'un', 1 => 'deux', 2 => 'trois');
unset($a[1]);
/* Cela va produire un tableau qui aurait été
$a = array(0 => 'un', 2 => 'trois')
et non pas
$a = array(0 => 'un', 1 =>'trois'); */
$b = array_values($a); //Maintenant b est le tableau array(0 =>
'un', 1 =>'trois')
sort($tab, flag) : tri
SORT_REGULAR ; SORT_NUMERIC ; SORT_STRING
Tests sur les Variables
Pour connaitre le type :
gettype( ) (retourne une chaine)
Fonctions qui retournent un booleén : is_array( ), is_float( ), is_int( ), is_object( )
et is_string( ).
isset : pour savoir si elle(s) existe(nt) :
retourne vrai ou faux
permet de savoir si la variable « nom » existe
isset($variable)
isset($v1, $v2, $v3)
18/03/2020 Technologies du Web – ELENA CABRIO 3
Un élément d’un tableau dans une chaine<?php
/* Ces exemples sont spécifiques à l'utilisation de tableaux dans une chaîne. Lorsque vous êtes hors
d'une chaîne, utilisez toujours des guillemets autour des index de tableau, et n'utilisez pas
d'{accolades}. */
// le tableau
$fruits = array('fraise' => 'rouge', 'banane' => 'jaune');
// Affiche « Array »
echo "$fruits\n";
// Erreur
// echo "Une banane est $fruits['banane']". \n";
// Fonctionne
echo "Une banane est {$fruits['banane']}. \n";
// Fonctionne mais PHP cherche une constante appelée banane tel que décrit ci-dessous Notice voire
erreur
echo "Une banane est {$fruits[banane]}. \n";
// Fonctionne
echo "Une banane est " . $fruits['banane'] . ". \n";
?>
18/03/2020 Technologies du Web – ELENA CABRIO 4
Foreach
C'est un moyen simple de passer en revue un tableau
Deux syntaxes
À chaque itération, la valeur de l'élément courant est assignée à $value et le pointeur interne à la liste (tableau) est avancé d'un élément
ce qui fait qu'à la prochaine itération, on accédera à l'élément suivant.
foreach($tableau as $value) { /*
$value prend successivement toutes les valeurs
contenues dans $tableau
toutes les instructions faites dans ce bloc sont
exécutées pour
chaque valeur
*/}
18/03/2020 Technologies du Web – ELENA CABRIO 5
Foreach et indice / clef
foreach($tableau as $clef => $valeur) { /*
$valeur prend successivement toutes les valeurs contenues
dans $tableau. Dans le même temps, $clef correspond à
l’indice (ou la clef) de cette valeur dans le tableau.
Toutes les instructions faites dans ce bloc sont
exécutées pour chaque couple (clef, valeur)
*/
}
18/03/2020 Technologies du Web – ELENA CABRIO 6
Example foreach $k=>$v
$liste = glob("news/politique/*.news");
/* $liste contient 5 éléménts, 01.news, 02.news, …, 05.news */
foreach($liste as $indice => $f) {
/*
Il y aura 5 itérations, car il y a 5 éléments
les couples ($indice, $f) seront successivement:
(0, "news/politique/01.news")
(1, "news/politique/02.news")
(2, "news/politique/03.news")
(3, "news/politique/04.news")
(4, "news/politique/05.news")
*/
}
18/03/2020 Technologies du Web – ELENA CABRIO 7
Boucle FOR: pour $x allant de… à...
Exécute une itération à chaque passage de la boucle
Itération sur les indices
Ou pour «n» iterations
Il faut préciser:
l’initialisation du compteur d’iteration
On peut commencer à 0; à 2; etc..
Attention aux indices d’un tableau
la condition d’arrêt de la boucle;
la ou les instructions faisant évoluer ces valeurs à chaque itération
Limite supérieur si le compteur augmente
Limite inférieur si le compteur diminue
18/03/2020 Technologies du Web – ELENA CABRIO 8
Exemple FOR: avec fichier// lecture d’un fichier
$lecture_fichier= file("news/politique/01.news");
$nb_lignes= count($lecture_fichier);
$contenu_article= "";
/* exemple de boucle à rebours
il faut faire bien attention au test de fin
et à l’évolution de la variable d’itération */
for($cpt = $nb_lignes; $cpt >= 2; $cpt--) {
/* on inverse le contenu du fichier */
/* en ne gardant pas les 2 premieres lignes */
$contenu_article.= $lecture_fichier[$cpt];
}
18/03/2020 Technologies du Web – ELENA CABRIO 9
Passage de paramètre à une page En attendant les formulaires…
18/03/2020 Technologies du Web – ELENA CABRIO 10
D’une page à une autre
Chaque page exécutée (ou obtenue) indépendamment
Continuité dans la navigation, dans l’interaction
Comment partager des valeurs ?
Persistance à long terme (fichiers, bd)
Persistance à court terme (session)
Formulaires (saisie par l’utilisateur)
Paramètre dans l’url et lien spécifique
18/03/2020 Technologies du Web – ELENA CABRIO 11
Dans l’url
Ajout à la fin de l’url
http://serveur.domaine/chemin/page?variable=valeur
Une variable dans une url se définit par
Un nom
Une valeur (après égal)
Plusieurs variables possibles
Séparation par des & entre les variables
https://www.google.fr/search?q=Philippe+Renevier-
Gonin&aq=f&oq=Philippe+Renevier-
Gonin&aqs=chrome.0.59j61l3j0j62.6424&sourceid=chrome&ie=UTF
-8
Fonctionne dans des liens <a href="…?q=Philippe+Renevier-Gonin&aq=f">
18/03/2020 Technologies du Web – ELENA CABRIO 12
Récupérer la valeur dans php $_GET
Variable super globale
http://www.php.net/manual/fr/language.variables.superglobals.php
Un tableau associatif des valeurs passées au script courant via les paramètres d'URL.
Les clefs sont les noms des variables de l’url
Les valeurs sont définies après le signe = (et avant le &)
Des chaines de caractères !
C.f. Conversion en int…
Encodage de l’url
Encodage avec urlencode ou rawurldecode
Décodage déjà fait avec $_GET
Utilisable directement avec urldecode ou rawurldecode
http://www.faqs.org/rfcs/rfc3986.html
18/03/2020 Technologies du Web – ELENA CABRIO 13
Tester si une variable passée par url existe
$val = "valeur par defaut";
If ( isset($_GET["variable"]) )
{
$val = $_GET["variable"];
// déjà décodé (codage url comme %20)
// faire des tests sur les valeurs…
// conversion
}
18/03/2020 Technologies du Web – ELENA CABRIO 14
Fichier : lecture simple
18/03/2020 Technologies du Web – ELENA CABRIO 15
Fichier(s) et persistance
Enregistrer les données sur un disque dur
Pérennité
Partage ou pas
(configuration de apache)
(sauvegarde en dehors du web)
Souplesse de programmation
aucun format imposé
Mais code « bas niveau »
18/03/2020 Technologies du Web – ELENA CABRIO 16
Informations sur les fichiers Équivalent des opérations sur les fichiers fournies par les systèmes d’exploitation
glob ( $pattern) : recherche des chemins qui vérifient une expression $pattern
<?php
$files = glob("*.php"); // que les fichiers php du dossier courant
foreach ($files as $filename) {
echo "<a href=‘$filename’>".basename($filename)."</a><br />\n";
}
?>
is_dir ($nomFichier) -- Indique si le fichier est un dossier
is_file ($nomFichier) -- Indique si le fichier est un fichier
is_readable ($nomFichier) -- Indique si un fichier est autorisé en lecture
is_writable ($nomFichier) -- Indique si un fichier est autorisé en écriture
Les résultats de ces fonctions sont mis en cache
18/03/2020 Technologies du Web – ELENA CABRIO 17
Entrées / Sorties avec les fichiers
file($nomFichier)
Lecture de tout un fichier sous forme d’un tableau de string, 1 ligne = une
case
Fin de ligne présent
rtrim($str) : enlève les « espaces » à la fin de $str
url possible
18/03/2020 Technologies du Web – ELENA CABRIO 18
Exemple avec « file »
18/03/2020 Technologies du Web – ELENA CABRIO 19
Fichier info.txt
Ce fichier contient :
1. Plusieurs Lignes
2. Avec différentes informations
departement: 06
Numero fichier : 1
Traitement en php :
$contenu = file("info.txt");
// $contenu[0]=="Ce fichier contient :\n"
// $contenu[1]=="1. Plusieurs Lignes\n"
// $contenu[2]=="2. Avec différentes
informations\n"
// $contenu[3]=="departement: 06\n"
// $contenu[4]=="Numero fichier : 1"
// pour extraire le 1 : explode et cast
$tmp = explode(":", $contenu[4]);
// $tmp[0]=="Numero fichier "
// $tmp[1]==" 1"
$numFichier = intval($tmp[1]);
// $numFichier vaut 1
Entrées / Sorties avec les fichiers
file_get_contents($nomFichier, [, bool $use_include_path = false [, resource
$context [, int $offset = -1 [, int $maxlen ]]]])
Idem file, mais le résultat est dans une chaine
Possibilité de préciser une sous partie (par des octets)
Utilisation possible de include_path de php.ini pour rechercher le fichier
$context : NULL (si on n’en utilise pas)
file_put_contents(string $nomFichier, mixed $data [, int $flags = 0 [,
resource $context ]])
Pour écrire dans un fichier
$date : string ou tableau (ou stream resource)
$flags : FILE_USE_INCLUDE_PATH ou FILE_APPEND ou LOCK_EX
18/03/2020 Technologies du Web – ELENA CABRIO 20
Fonctions
Prédefinies: fonctions en PHP par défaut.
Définies par l’utilisateur
18/03/2020 Technologies du Web – ELENA CABRIO 21
Fonctions
Définition : Les fonctions en PHP doivent être définies avant leur appel. Le nom d’une fonction ne commence pas par ’$’, et n’est pas sensible à l’utilisation des majuscules/minuscules. Voici la syntaxe :
function nom($chemin)
{
$fichier = explode("/",$chemin);
$fichier = $fichier[count($fichier)-1];
return $fichier;
}
Toutes les fonctions en PHP ont une portée globale
Les variables à l’intérieur des fonctions ont une portée locale
La récursivité est possible
18/03/2020 Technologies du Web – ELENA CABRIO 22
FONCTIONS : Passage des arguments
par valeur :
Les arguments sont passés généralement par valeur,
ce qui signifie qu’une copie des variables est faite au moment de l’appel
de la fonction,
et que les éventuelles modifications faites dans le corps de la fonction sur
les arguments n’ont qu’un effet local.
i.e., une fois la fonction terminée, les modifications sont « oubliées »
par adresse (non abordé ici)
18/03/2020 Technologies du Web – ELENA CABRIO 23
FONCTIONS : Passage des arguments
Valeurs par défaut pour un ou plusieurs arguments d’une fonction.
La valeur par défaut d'un argument doit obligatoirement être une constante, et ne peut être ni une variable, ni un membre de classe, ni un appel de fonction.
Il est à noter que si vous utilisez des arguments avec valeur par défaut avec d'autres sans valeur par défaut, ceux avec une valeur par défaut doivent être à la fin.
function Connexion ($pNom, $pMotPass, $pBase = "clubvideo", $pServeur = "toto")
{ // Ici le code de la fonction }
// on peut donc appeler cette fonction sans citer les deux derniers arguments
$connexion1 = Connexion ("dupond", "passdupond");
$connexion2 = Connexion ("dupont", "passdupont", "Films");
18/03/2020 Technologies du Web – ELENA CABRIO 24
FONCTIONS les fonctions sont à nombre d'arguments variable.
Possible avec les fonctions suivantes :
func_num_args( ) [pas de paramètre, retourne le nombre d'arguments passés à la fonction],
func_get_arg( ) [un paremètre i : retourne le (i+1)ième élément de la liste des arguments]
et func_get_args( ) [pas de paramètre, retourne les arguments d'une fonction sous forme de tableau]
Fonctions et variables : PHP propose trois types de variables (la même terminologie du C) :
Variables automatiques (pas de portée à l’extérieur)
Variables statiques ( persistantes entre les appels)
Variables globales (mot clef « global »)
18/03/2020 Technologies du Web – ELENA CABRIO 25
FONCTIONS Les valeurs de retour
Les valeurs sont renvoyées en utilisant une instruction de retour optionnelle. Tous les types de variables peuvent être renvoyés, tableaux et objets compris. Cela fait que la fonction finit son exécution immédiatement et passe le contrôle à la ligne appelante.
c.f. return( )
function maFonction() {
// ….
return $unResultat;}
$resultat = maFonction();
18/03/2020 Technologies du Web – ELENA CABRIO 26
return
Si appelée depuis une fonction, la commande return termine
immédiatement la fonction, et retourne l'argument qui lui est
passé.
Si appelée depuis l'environnement global, l'exécution du script
est interrompue.
Si le script courant était include( ) ou require( ), alors le contrôle est
rendu au script appelant, et la valeur retournée sera utilisée comme
résultat de la fonction include( ).
Si return( ) est appelée depuis le script principal, alors l'exécution du
script s'arrête.
18/03/2020 Technologies du Web – ELENA CABRIO 27
Exemple : calcul de différence de temps
Calcul depuis la rentrée et jusqu’à l’été
Deux parties de code très ressemblantes
Démarche :
Identification du code commun (conception)
Factorisation
Amélioration (partagée)
Partage entre fichier
18/03/2020 Technologies du Web – ELENA CABRIO 28
Identification du code « identique »
18/03/2020 Technologies du Web – ELENA CABRIO 29
En principes pour les
jours, les heures, les
minutes et les secondes
Organisation du code : la fonction Pour les séquences identifiées, il faut identifier
Ce qui les distingue : variables externes
Variables en entrée => les paramètres des fonctions
La date de référence, mais sous quel format ?
now ?
Ce qu’elles produisent
Quel résultat à la fonction
Un paragraphe
Ce qui les sépare : généralisation du code
Déterminer les « structures de contrôles » (if, …)
Est-ce avant ou après ?
Il ne reste qu’à trouver un nom à la fonction
18/03/2020 Technologies du Web – ELENA CABRIO 30
Structure de la fonction calculeDelaifunction calculeDelai($dateReference)
{
$resultat = "";
$date = strtotime($dateReference);
$diff = $date-strtotime("now");
if ($diff < 0) {
// c'est avant
}
else {
// c'est apres
}
return $resultat;
}
18/03/2020 Technologies du Web – ELENA CABRIO 31
Réflexion sur « l’algorithme »
Production si la date est avant
Il s'est passé 20 jours, 11 heures, 1 minute et 41 secondes depuis le 07
September 2019
Production si la date est après
Il reste 164 jours, 11 heures, 48 minutes et 59 secondes avant le 21 Juin 2020
Calculs similaires (mais attention au signe)
Début qui change et la préposition (avant / depuis)
18/03/2020 Technologies du Web – ELENA CABRIO 32
Appel de la fonction
18/03/2020 Technologies du Web – ELENA CABRIO 33
/** différence entre maintenant et le 21/06/2020 **/
/** qui est censé être dans le futur **/
$tempsRestant = calculeDelai("2020-06-21");
/** calcul pour le temps écoulé depuis la rentrée **/
/** paragraphe affichant le résultat **/
$tempsRestant .= calculeDelai("2019-09-07");
/** calcul avec maintenant. **/
/** paragraphe affichant le résultat **/
$tempsRestant .= calculeDelai("now");
/** demonstration live : changement de date **/
Fonction calculeDelai (1/2)
18/03/2020 Technologies du Web – ELENA CABRIO 34
// en paramètre : une chaine de caractère de type 2020-06-21
function calculeDelai($dateReference) {
$resultat = "";
$date = strtotime($dateReference);
$diff = $date-strtotime("now");
$debut = "Il reste"; $preposition = "avant";
if ($diff < 0) {
// c'est avant // on change le début du message et la préposition
$debut = "Il s'est passé";
$preposition = "depuis";
// on inverse le signe, pas de soucis d'arrondi
$diff = -$diff;
}
/* else { // c'est apres
// rien à faire car les valeurs initiales correspondent à ce cas } */
/* suite au transparent suivant */
Fonction calculeDelai (2/2)
18/03/2020 Technologies du Web – ELENA CABRIO 35
// suite de function calculeDelai($dateReference) {
$resteS = $diff;
/** calcul du nombre de jours **/
$resteJ = floor($resteS / 86400 ); // on peut remplacer 86400 par 60*60*24
$resteS = $diff - $resteJ*86400;
/** calcul du nombre d'heures **/
$resteH = floor($resteS / (3600) ); // on peut remplacer 3600 par 60*60
$resteS = $resteS - $resteH*(3600);
/** calcul du nombre de minutes et de secondes **/
$resteM = floor($resteS / 60 );
$resteS = $resteS - $resteM*60;
/** paragraphe affichant le résultat **/
$resultat = "<p>$debut ".$resteJ." jours, $resteH heures,";
$resultat .= "$resteM minutes et ".$resteS." secondes $preposition le ";
$resultat .= date("d F Y", $date)." </p>";
return $resultat;
}
une répétition dans le calcul (1/4)
Possibilité d’automatiser le traitement
Un même motif se répète : le calcul (division, arrondi, reste), y compris dans la construction du paragraphe
Regrouper les informations dans une structure pour un traitement identique
Ce qui est invariant :
Plusieurs informations : le diviseur (nombre de seconde)
Le nom (jour, heure, etc.)
Ce qui est calculé
Le calcul lui-même,
La marque du pluriel, la séparation
Objectif : pouvoir faire évoluer plus facilement
Ajouter de l’information (le nombre d’année ? )
En retirer (ne plus voir les secondes)
Etc.
18/03/2020 Technologies du Web – ELENA CABRIO 36
une répétition dans le calcul (2/4)
Structuration des données
18/03/2020 Technologies du Web – ELENA CABRIO 37
$resteS = $diff;
// pb : plusieurs tableau avec les mêmes indices...// ce qui est invariant// tous les tableaux font la même taille, ici 4
$noms = array("jour", "heure", "minute", " seconde");
$nbSec = array(86400, 3600, 60, 1);
$nbInfo = count($noms);
// ce qui est variant (avec initialisation - optionnelle)
$pluriels = array( "", "", "", "");
$liaisons = array("", ",", ",", " et");
$calcul = array(0,0,0,0);// pour gérer les cas ou le calcul vaut 0
$derniere_valeur = -1;
une répétition dans le calcul (3/4)
Calcul des valeurs, du pluriel (« s » ou pas « s ») et
le caractère de liaison, avec modification du précédent
18/03/2020 Technologies du Web – ELENA CABRIO 38
// calcul des valeurs
for($i = 0; $i < $nbInfo; $i=$i+1)
{
$calcul[$i] = floor($resteS / $nbSec[$i] );
$resteS = $resteS - $calcul[$i]*($nbSec[$i]);
// on determine le pluriel
if ($calcul[$i] > 1) $pluriels[$i] = "s";
// on change la liaison
if ($calcul[$i] >= 1) {
if ($derniere_valeur < 0) $liaisons[$i] = "";
else $liaisons[$i] = ",";
une répétition dans le calcul (4/4)
Génération du paragraphe, cas où on est à la date dite.
18/03/2020 Technologies du Web – ELENA CABRIO 39
// si la date est maintenant ?
if ($derniere_valeur == -1) {
$resultat = "<p>C'est maintenant le ".date("d F Y", $date)." !</p>"; }
else {
// on enleve la derniere ,
if ($liaisons[$derniere_valeur] == ",") {
$liaisons[$derniere_valeur] = " et";
}
/** paragraphe affichant le résultat **/
$resultat = "<p>$debut ";
for($i = 0; $i < $nbInfo; $i=$i+1) {
if ($calcul[$i] > 0) {
$resultat .= "{$liaisons[$i]} {$calcul[$i]} {$noms[$i]}{$pluriels[$i]}";
}
}
// on termine le paragraphe
$resultat .= " $preposition le ".date("d F Y", $date)."</p>";
}
// fin de la fonction...
return $resultat;
Appel de la fonction (inchangé)
18/03/2020 Technologies du Web – ELENA CABRIO 40
/** différence entre maintenant et le 21/06/2020 **/
/** qui est censé être dans le futur **/
$tempsRestant = calculeDelai("2020-06-21");
/** calcul pour le temps écoulé depuis la rentrée **/
/** paragraphe affichant le résultat **/
$tempsRestant .= calculeDelai("2019-09-09");
/** calcul avec maintenant. **/
/** paragraphe affichant le résultat **/
$tempsRestant .= calculeDelai("now");
/** demonstration : changement de date, d’année, **/
/** d’information à afficher, etc. **/