Programmation Web Dynamique PHP
Programmation Web Dynamique PHP
Programmation Web Dynamique PHP
SMI6
2010 / 2011
Sommaire
PARTIE 1 : PHP
La programmation en PHP. Des centaines de fonctions détaillées et des
exemples expliqués en détail.
PARTIE 2 : MySQL
La création et l’interrogation d’une base de données.
PARTIE 4 : Méthodologie
Quelques trucs pour choisir au mieux les solutions les plus adaptés pour
résoudre vos problèmes.
Liens
PHP*
http://www.php.net
http://www.phpinfo.net
http://www.phpfrance.com
http://www.developpez.com/php/
MySQL
http://www.mysql.com/
http://dev.nexen.net/docs/mysql/
HTML
http://cyberzoide.developpez.com/html/
Exemple concret
http://www.miag-rezo.net
En 1997, PHP devient un projet collectif et son interpréteur est réécrit par Zeev
Suraski et Andi Gutmans pour donner la version 3 qui s’appelle désormais
PHP : Hypertext Preprocessor (acronyme récursif à l’exemple du système
Open Source Linux : Is Not UniX).
Il existe par ailleurs des applications web prêtes à l’emploi (PHPNuke, PHP
SPIP, PHPSlash…) permettant de monter facilement et gratuitement son
portail. En juillet 2000 plus de 300.000 sites tournaient déjà sous PHP !
généralité : PHP
•PHP = web dynamique.
•PHP est un langage de programmation qui s'intègre dans vos pages HTML.
•PHP permet entre autres de rendre automatiques des tâches répétitives,
notamment grâce à la communication avec une base de données.
•PHP dérive du C (et du perl) dont il reprend la syntaxe.
•PHP est extensible grâce à de nombreux modules et son code source est
ouvert.
•PHP supporte tous les standards du web et qu’il est gratuit, il s’est rapidement
répandu sur la toile.
Modèle Html
Html comment ca marche
•Lorsqu’on consulte une page html dite statique :
• Votre navigateur envoie l'adresse URL saisie .
•Le serveur web est un "ordinateur" présent sur l'Internet
et qui héberge la page demandée.
•Sur ce serveur on trouve Apache, logiciel apte à traiter
les requêtes HTTP envoyées lorsque une page web est
demandée.
• Apache cherche donc le fichier demandé dans son
arborescence et renvoie à votre navigateur la page
HTML.
• Votre navigateur :
•interprète les différents langages se trouvant dans ce fichier
(HTML, JavaScript, CSS, etc ...)
• et affiche la page.
Php : comment ca marche
•Lorsqu’une page html contient du code PHP :
• Votre navigateur envoie l'adresse saisie
• Le serveur web cherche dans son arborescence si le fichier
existe, et si celui-ci porte une extension reconnue comme une
application PHP.
• Si c'est le cas, le serveur web transmet ce fichier à PHP.
• PHP analyse et exécute le code PHP entre <?php et ?>.
• Si ce code contient des requêtes vers une base de données :
• PHP envoie la requête SQL.
• La base de données renvoie les informations voulues au script
• PHP retourne le fichier dépourvu du code PHP au serveur web.
• Le serveur web renvoie donc un fichier ne contenant plus de
PHP, donc seulement du HTML au navigateur qui l'interprète et
l'affiche.
Php comment ca marche
•PHP s'exécute côté serveur. Il n'y a plus aucune trace du
code PHP lorsque vous regardez le code source de la
page dans votre navigateur PHP.
•Il faut bien distinguer le client et le serveur :
• Votre navigateur est le client. C'est lui qui demande la
page web que vous avez entrée.
• Le serveur est l'ordinateur sur l'Internet qui héberge cette
page web.
• PHP s'exécute donc côté serveur.
• Cependant, quand PHP envoie une requête SQL au
serveur MySQL, Il est client
Généralement
Php : ???
•La présentation de la page (couleur du texte, etc..) est à faire en
HTML et CSS, exécutés côté client. PHP n'a rien à voir avec le design
de votre page
• Tout ce qui touche au comportement du navigateur est du domaine
du JavaScript, lui aussi exécuté par le client
• L'intérêt de PHP est de générer du HTML ou du Javascript
dynamiquement.
• Le travail effectué avec PHP sur votre page est totalement invisible
(si on regarde le code source de la page).
• SQL est un langage a part entière de PHP:
• Le SGBD analyse et exécute votre code SQL.
• PHP ne fait qu'envoyer une requête au serveur MySQL.
• PHPMyAdmin n'est pas une base de données ! Il s'agit simplement
d'un script PHP qui permet d'administrer vos bases de données.
Installation de php
•Installer PHP sur son ordinateur pour tester vos script PHP,
• Installer un serveur web sur son ordinateur est utile, et permet de
tester ses scripts plus souplement.
• Votre ordinateur sera à la fois client et serveur.
• Ainsi vous pourrez programmer en PHP sans avoir besoin d'être
connecté à Internet.
• Alors que pour tester des pages web html en local, il suffit d'ouvrir le
fichier dans un navigateur, il faut un serveur web sur votre PC local
pour tester une page PHP.
• Il existe plusieurs utilitaires très pratiques :
• Ils installeront Apache, le serveur web le plus utilisé, PHP.
• Les plus connus sont : EasyPHP , WAMP, MOV’AMP.
• Pour faire du PHP, il ne vous faut rien d'autre qu'un simple éditeur de
texte
Modèle
requête
réponse
appel de la page
Base de Script
données extraction Document
de données PHP exécution
MySQL Html
Intégration d’un script dans une page
Les pages web sont au format html. Les pages web dynamiques générées
avec PHP4 sont au format php. Le code source php est directement insérer
dans le fichier html grâce au conteneur de la norme XML :
<?php … ?>
Exemple:
<html>
<body>
<?php
echo ’’Bonjour’’;
?>
</body>
</html>
Autres syntaxes d’intégration :
<? … ?>
<script language=‘’php’’> … </script>
<% … %>
Documentation en ligne
Pour obtenir en ligne toute la documentation officielle (en français) sur une
commande, tapez l’URL suivante dans la barre d’adresse de votre navigateur
Internet :
http://fr.php.net/
Exemple :
http://fr.php.net/echo
Exemple de script
Exemple de script, code
source (côté serveur) : Autre écriture du même script :
<html> <?php
<body> echo ‘’<html>\n<body>\n’’;
<h1>Mon premier script</h1> echo ‘’<h1>Mon premier script</h1>\n’’;
<?php echo ‘’Bonjour\n’’; ?> echo ‘’Bonjour\n’’;
</body> echo ‘’</body>\n</html>\n’’;
</html> ?>
<?php
/* commentaire
sur plusieurs
lignes */
Les variables peuvent être de type entier (integer), réel (double), chaîne de
caractères (string), tableau (array), objet (object), booléen (boolean).
(1) : Le cast est une conversion de type. L’action de caster consiste en convertir une variable d’un
type à un autre.
Variables, types et opérateurs (II)
Quelques fonctions :
empty($var) : renvoie vrai si la variable est vide
isset($var) : renvoie vrai si la variable existe
unset($var) : détruit une variable
gettype($var) : retourne le type de la variable
settype($var, ’’type’’) : convertit la variable en type type (cast)
is_long(), is_double(), is_string(), is_array(), is_object(), is_bool(),
is_float(), is_numeric(), is_integer(), is_int()…
Une variable peut avoir pour identificateur la valeur d’une autre variable.
Syntaxe : ${$var} = valeur;
Exemple :
$tomate = ‘’prixtomate’’;
${$toto} = 5;
echo $foobar; // la variable $foobar vaut 5
Variables, types et opérateurs (III)
La portée d’une variable est limitée au bloc dans lequel elle a été crée. Une
variable locale à une fonction n’est pas connue dans le reste du programme.
Tout comme une variable du programme n’est pas connue dans une fonction.
Une variable créée dans un bloc n’est pas connue dans les autres blocs,
mêmes supérieurs.
Opérateurs arithmétiques :
+ (addition), - (soustraction), * (multiplié), / (divisé), % (modulo), ++
(incrément), --(décrément). Ces deux derniers peuvent être pré ou post fixés
Opérateurs d’assignement :
= (affectation), *= ($x*=$y équivalent à $x=$x*$y), /=, +=, -=, %=
Opérateurs logiques :
and, && (et), or, || (ou), xor (ou exclusif), ! (non)
Opérateurs de comparaison :
== (égalité), < (inférieur strict), <= (inférieur large), >, >=, != (différence)
=== et = (!!!!!!!!!!!!!!!!!!!!)
Variables, types et opérateurs (IV)
Signalons un opérateur très spécial qui équivaut à une structure conditionnelle
complexe if then else à la différence qu’il renvoie un résultat de valeur pouvant
ne pas être un booléen : l’opérateur ternaire.
Syntaxe :
(condition)?(expression1):(expression2);
Si la condition est vrai alors évalue et renvoie l’expression1 sinon évalue et
renvoie l’expression2.
Exemple :
$nbr = ($toto>10)?($toto):($toto%10);
Dans cet exemple, la variable $nbr prend $toto pour valeur si $toto est
strictement supérieur à 10, sinon vaut le reste de la division entière de $toto
par 10.
Constantes
L’utilisateur peut définir des constantes dont la valeur est fixée une fois pour
toute. Les constantes ne portent pas le symbole $ (dollars) en début
d’identificateur et ne sont pas modifiables.
Exemple 1 :
define(‘’author’’,’’koutti’’);
echo author; // affiche ‘koutti’
Exemple 2 :
define(mon_annee,1980);
echo Mon_Annee; // affiche 1980
Exemple 1 :
$tata = 100; // la variable $tata est initialisée à la valeur 100
$mama = &$tata; // la variable $mama fait référence à $tata
$tata++; // on change la valeur de $tata
echo $mama; // qui est répercutée sur $mama qui vaut alors 101
Exemple 2 :
function change($var) {
$var++; // la fonction incrémente en local l’argument
}
$nbr = 1; // la variable $nbr est initialisée à 1
change(&$nbr); // passage de la variable par référence
echo $nbr; // sa valeur a donc été modifiée
Mathématiques (I)
Il existe une miriade de fonctions mathématiques.
Quelques constantes :
M_PI : valeur de pi (3.14159265358979323846)
M_E : valeur de e (2.7182818284590452354)
Mathématiques (II)
Nombres aléatoires :
rand([$x[,$y]) : valeur entière aléatoire entre 0 et RAND_MAX si x et y ne sont
pas définis, entre x et RAND_MAX si seul x est défini, entre x et y si ces deux
paramètres sont définis.
srand() : initialisation du générateur aléatoire
getrandmax() : retourne la valeur du plus grand entier pouvant être généré
Exemples :
number_format (1000000.3333); // affiche 1,000,000
number_format (1000000.3333,2); // affiche 1,000,000.33
number_format (1000000.3333,2,",","."); // affiche 1.000.000,33
Expressions
Presque tout en php est une expression. On les construit de façon très souple.
De façon à réduire la taille du code (comme en C). L’inconvénient est l’illisibilité
du code ainsi écrit sauf à le commenter suffisamment. Il faut donc les
construire avec parcimonie et ne pas hésiter à les fractionner.
Exemple :
echo change( $nbr += ($toto>0)?(0):(--$toto) );
Attention à utiliser les parenthèses afin de palier aux priorités des opérateurs.
Booléens
Les variables booléennes prennent pour valeurs TRUE (vrai) et FALSE (faux).
Une valeur entière nulle est automatiquement considérée comme FALSE. Tout
comme une chaîne de caractères vide ‘’’’. Ou encore comme les chaînes ‘’0’’
et ‘0’ castées en l’entier 0 lui même casté en FALSE.
Exemple :
if(0) echo 1; // faux
if('''') echo 2; // faux
if(''0'') echo 3; // faux
if(''00'') echo 4;
if('0') echo 5; // faux
if('00') echo 6;
if('' '') echo 7;
Cet exemple affiche 467. Donc l’espace ou la chaîne ‘’00’’ ne sont pas
considérés castés en FALSE.
Chaînes de caractères (I)
Une variable chaîne de caractères n’est pas limitée en nombre de caractères.
Elle est toujours délimitée par des simples quotes ou des doubles quotes.
Exemples :
$nom = ‘’chammakhe’’;
$prenom = ‘Hugo’;
Exemple 1 :
$foo = ‘’Hello’’;
$bar = ‘’Word’’;
echo $foo.$bar;
Exemple 2 :
$name = ‘’Henry’’;
$whoiam = $name.‘’IV’’;
Exemple 3 :
$out = ‘Patati’;
$out .= ‘’ et patata…’’;
Chaînes de caractères (III)
Quelques fonctions:
strlen($str) : retourne le nombre de caractères d’une chaîne
strtolower($str) : conversion en minuscules
strtoupper($str) : conversion en majuscules
trim($str) : suppression des espaces de début et de fin de chaîne
substr($str,$i,$j) : retourne une sous chaîne de $str de taille $j et
débutant à la position $i
strnatcmp($str1,$str2) : comparaison de 2 chaînes
addslashes($str) : déspécialise les caractères spéciaux (‘, ‘’, \)
ord($char) : retourne la valeur ASCII du caractère $char
Chaînes de caractères (IV)
On peut délimiter les chaînes de caractères avec la syntaxe Here-doc.
Exemple :
$essai = <<<EOD
Ma chaîne ‘’essai’’
sur plusieurs lignes.
EOD;
echo $essai;
Exemples :
echo ‘’Bonjour $name’’;
print(‘’Bonjour $name’’);
printf(‘’Bonjour %s’’, $name);
Tableaux (I)
Une variable tableau est de type array. Un tableau accepte des éléments de
tout type. Les éléments d’un tableau peuvent être de types différents et sont
séparés d’une virgule.
L’appel d’un élément du tableau se fait à partir de son indice (dont l’origine est
zéro comme en C).
Exemple : echo $tab[10]; // pour accéder au 11ème élément
Tableaux (II)
Parcours d’un tableau.
$tab = array(‘mourad’, ‘boulouse’, ’Mario’);
Exemple 1 :
$i=0;
while($i <= count($tab)) { // count() retourne le nombre d’éléments
echo $tab[$i].’\n’;
$i++;
}
Exemple 2 :
foreach($tab as $elem) {
echo $elem.’’\n’’;
}
La variable $elem prend pour valeurs successives tous les éléments du
tableau $tab.
Tableaux (III)
Quelques fonctions:
count($tab), sizeof : retournent le nombre d’éléments du tableau
in_array($var,$tab) : dit si la valeur de $var existe dans le tableau $tab
list($var1,$var2…) : transforme une liste de variables en tableau
range($i,$j) : retourne un tableau contenant un intervalle de valeurs
shuffle($tab) : mélange les éléments d’un tableau
sort($tab) : trie alphanumérique les éléments du tableau
rsort($tab) : trie alphanumérique inverse les éléments du tableau
implode($str,$tab), join : retournent une chaîne de caractères contenant les
éléments du tableau $tab joints par la chaîne de jointure $str
explode($delim,$str) : retourne un tableau dont les éléments résultent du
hachage de la chaîne $str par le délimiteur $delim
array_merge($tab1,$tab2,$tab3…) : concatène les tableaux passés en
arguments
array_rand($tab) : retourne un élément du tableau au hasard
Tableaux (IV)
Il est possible d’effectuer des opérations complexes sur les tableaux en créant
par exemple sa propre fonction de comparaison des éléments et en la passant
en paramètre à une fonction de tri de php.
usort($tab, ‘’fonction’’);
Trie les éléments grâce à la fonction fonction définie par l'utilisateur qui doit
prendre 2 arguments et retourner un entier, qui sera inférieur, égal ou
supérieur à zéro suivant que le premier argument est considéré comme plus
petit, égal ou plus grand que le second argument. Si les deux arguments sont
égaux, leur ordre est indéfini.
L’initialisation d’un tableau associatif est similaire à celle d’un tableau normal.
Exemple 1 :
$personne = array(‘’Nom’’ => ‘’César’’, ‘’Prénom’’ => ‘’Jules’’);
Exemple 2 :
$personne[‘’Nom’’] = ‘’César’’;
$personne[‘’Prénom’’] = ‘’Jules’’;
Exemple 1 :
foreach($personne as $elem) {
echo $elem;
}
Ici on accède directement aux éléments du tableau sans passer par les clés.
Exemple 2 :
foreach($personne as $key => $elem) {
echo ‘’$key : $elem’’;
}
Ici on accède simultanément aux clés et aux éléments.
Tableaux associatifs (III)
Quelques fonctions :
array_count_values($tab) : retourne un tableau contenant les valeurs du
tableau $tab comme clés et leurs fréquence comme valeur (utile pour évaluer
les redondances)
array_keys($tab) : retourne un tableau contenant les clés du tableau
associatif $tab
array_values($tab) : retourne un tableau contenant les valeurs du tableau
associatif $tab
array_search($val,$tab) : retourne la clé associée à la valeur $val
Exemple :
$colors = array(‘’red’’, ’’green’’, ’’blue’’);
$nbr = count($colors);
reset($colors);
for($i=1; $i<=$nbr; $i++) {
echo current($colors).’’<br />’’;
next($colors);
}
Fonctions (I)
Comme tout langage de programmation, php permet l’écriture de fonctions.
Les fonctions peuvent prendre des arguments dont il n’est pas besoin de
spécifier le type. Elles peuvent de façon optionnelle retourner une valeur.
Exemple :
function mafonction($toto) {
$toto += 15;
echo ‘’Salut !’’;
return ($toto+10);
}
$nbr = MaFonction(15.1);
/* retourne 15.1+15+10=40.1, les majuscules n’ont pas d’importance */
Fonctions (II)
On peut modifier la portée des variables locales à une fonction.
Quelques exemples :
function afficher($str1, $str2) { // passage de deux paramètres
echo ‘’$str1, $str2’’;
}
Exemple :
function foo() { // définition de la fonction foo
echo ‘’Foo…’’;
}
foo(); // appel de la fonction foo définie plus haut
bar(); // appel de la fonction bar pas encore définie
function bar() { // définition de la fonction bar
echo ‘’bar!<br />’’;
}
Exemple :
function trigo($nbr) {
return array(sin($nbr), cos($nbr), tan($nbr)); // retour d’un tableau
}
$r = 12;
list($a, $b, $c) = trigo($r); /* affectation aux variables $a,$b et $c des
éléments du tableau retourné par la fonction trigo */
echo ‘’sin($r)=$a, cos($r)=$b, tan($r)=$c’’; // affichage des variables
Exemple :
function divers($toto) {
echo $toto;
}
$mafonction = ‘’divers’’;
$mafonction(‘’bonjour !’’); // affiche ‘bonjour !’ par appel de divers()
Fonctions dynamiques (II)
Quelques fonctions permettant de travailler sur des fonctions utilisateur :
call_user_func_array, call_user_func, create_function, func_get_arg,
func_get_args, func_num_args, function_exists, get_defined_functions,
register_shutdown_function.
Exemple :
function essai($user, $pass) { // fonction à appeler
echo ‘’USER: $user PASSWORD: $pass’’;
}
$params = array(‘’hugo’’,’’0478’’); // création du tableau de paramètres
call_user_func_array(‘’essai’’, $params); // appel de la fonction
Exemple :
function essai($user, $pass) {
echo ‘’USER: $user PASSWORD: $pass’’;
}
call_user_func(‘’essai’’, ‘’hugo’’,’’0478’’);
Exemple :
$newfunc = create_function(‘$a,$b’,’’return \$a+\$b;’’);
echo ’’Nouvelle fonction anonyme : $newfunc <br />’’;
echo $newfunc(5,12).’’<br />’’;
Exemple :
function foobar() {
$numargs = func_num_args();
echo ‘’Nombre d'arguments: $numargs<br />’’;
if ($numargs >= 2) {
echo ‘’Le 2ème param : ‘’.func_get_arg(1).‘’<br />’’;
}
}
foobar(‘’foo’’, ‘bar’, 10.5);
Exemple :
function somme() {
$params = func_get_args();
$nbr = 0;
foreach($params as $elem) {
$nbr += $elem;
}
return $nbr;
}
echo somme(50,20,3,98,50);
Cette fonction somme retourne la somme de tous ses arguments quel qu’en
soit le nombre.
Fonctions dynamiques (VII)
function_exists($str) : Retourne TRUE si la fonction $str a déjà été définie.
Exemple :
class Voiture { // déclaration de la classe
var $couleur; // déclaration d’un attribut
var $belle = TRUE; // initialisation d’un attribut
function voiture() { // constructeur
$this->couleur = ‘’noire’’;
} // le mot clé $this faisant référence à l’objet est obligatoire
function Set_Couleur($couleur) {
$this->couleur = $couleur;
}
}
$mavoiture = new Voiture(); // création d’une instance
$mavoiture->Set_Couleur(‘’blanche’’); // appel d’une méthode
$coul = $mavoiture->couleur; // appel d’un attribut
Classes (II)
Le système de classes de php est très succint, il ne gère que l’héritage simple.
Exemple :
class Voituredeluxe extends Voiture { // déclaration de la sous classe
var $couleur;
function voituredeluxe() { // constructeur
$this->Voiture();
}
function Set_Couleur($couleur) {
$this->couleur = $couleur;
}
function Get_Couleur() {
return $this->couleur;
}
}
La nouvelle classe Voituredeluxe hérite de tous les attributs et méthodes de la
classe parente Voiture dont elle est une extension (extends). Il est possible
de surcharger les méthodes, d’en déclarer de nouvelles, etc.
Classes (III)
Quelques fonctions :
get_declared_classes() : retourne un tableau listant toutes les classes
définies
class_exists($str) : vérifie qu'une classe dont le nom est passé en argument a
été définie
get_class($obj), get_parent_class : retournent le nom de la classe de l’objet
$obj
get_class_methods($str) : retourne les noms des méthodes de la classe $str
dans un tableau
get_class_vars($str) : retourne les valeurs par défaut des attributs de la
classe $str dans un tableau associatif
get_object_vars($obj) : retourne un tableau associatif des attributs de l’objet
$obj les clés sont les noms des attributs et les valeurs, celles des attributs si
elles existent
is_subclass_of($obj,$str) : détermine si l’objet $obj est une instanciation
d’une sous-classe de $str, retourne VRAI ou FAUX
method_exists($obj,$str) : vérifie que la méthode $str existe pour une classe
dont $obj est une instance, retourne VRAI ou FAUX
Classes (IV)
Tout objet instancié est une variable et peut à se titre être passé en argument
à une fonction ou bien être un retour de fonction ou encore être sauvegardée
en donnée de session.
Il n’existe pas de destructeur : comme en Java, les objets qui cessent d’être
utilisés sont automatiquement détruits.
Il n’y a pas de notion de visibilité : tous les attributs et méthodes sont publiques
et une classe hérite forcément de tous les attributs et méthodes de son père.
Une classe fille hérite de tous les attributs et méthodes de la classe parente
dont elle est une extension (d’ou la syntaxe extends). Il est possible de
surcharger les méthodes, d’en définir de nouvelles…
Structures de contrôle (I)
Structures conditionnelles (même syntaxe qu’en langage C) :
if( ... ) {
…
} elseif {
…
} else {
…
}
switch( … ) {
case … : { … } break
…
default : { … }
}
Structures de contrôle (II)
Structures de boucle (même syntaxe qu’en langage C) :
for( … ; … ; … ) {
…
}
while( … ) {
…
}
do {
…
} while( … );
Structures de contrôle (III)
L’instruction break permet de quitter prématurément une boucle.
Exemple :
while($nbr = $tab[$i++]) {
echo $nbr.’’<br />’’;
if($nbr == $stop)
break;
}
require insert dans le code le contenu du fichier spécifié même si ce n’est pas
du code php. Est équivalent au préprocesseur #include du C.
Exemple :
require(‘’fichier.php’’);
include évalue et insert à chaque appel (même dans une boucle) le contenu
du fichier passé en argument.
Exemple :
include(‘’fichier.php’’);
Arrêt prématuré
Pour stopper prématurément un script, il existe deux fonctions.
Quelques variables :
$PHP_SELF : nom du script en cours
$HTTP_ACCEPT : liste des types MIME supportés par le client
$HTTP_USER_AGENT : signature du navigateur du client
$REMOTE_ADDR : adresse IP du client
$QUERY_STRING : chaîne au format URL contenant les paramètres passés à
la page en cours
$HTTP_REFERER : URL de la source ayant renvoyée le client sur la page en
cours (en l’analysant, on peut connaître le moteur de recherche utilisé ainsi
que les mots clés entrés par l’internaute, s’il vient effectivement d’un moteur de
recherche; permet d’évaluer la qualité du référencement d’un site web)
Constantes du PHP (I)
Le langage php met à disposition du programmeur des constantes propres au
script qui ne peuvent pas être redéfinies et qui sont bien utiles pour la gestion
des erreurs internes au script.
Exemples :
$test = true;
echo __file__, __line__;
Constantes du PHP (II)
Les constantes suivantes, lorsqu’elles sont déclarées par le programmeur (en
général avant toute les autres instructions du script), permettent de spécifier à
l’interpréteur php du serveur quel niveau de rigueur appliquer face aux erreurs
lors du déroulement du script.
E_ERROR : dénote une erreur autre qu'une erreur d'analyse (''parse error'')
qu'il n'est pas possible de corriger.
E_WARNING : dénote un contexte dans lequel le PHP trouve que quelque
chose ne va pas. Mais l'exécution se poursuit tout de même. Ces alertes-là
peuvent être récupérées par le script lui-même.
E_PARSE : l'analyseur a rencontré une forme syntaxique invalide dans le
script, correction de l'erreur impossible.
E_NOTICE : quelque chose s'est produit, qui peut être ou non une erreur.
L'exécution continue. Par exemple, la tentative d'accéder à une variable qui
n'est pas encore affectée.
E_ALL : toutes les constantes E_* rassemblées en une seule. Si vous l'utilisez
avec error_reporting(), toutes les erreurs et les problèmes que PHP
rencontrera seront notifiés.
Constantes du PHP (III)
La fonction error_reporting($nbr) permet de fixer le niveau de rapport
d'erreurs PHP. Par défaut php est assez permissif puisque autorise l’utilisation
des variables avant leur création, le cast implicite, l’appel de fonction
retournant une valeur sans variable pour la récupérer… Cette fonction permet
de forcer une plus grande sévérité tout comme l’option explicite du Visual
Basic ou le paramètre –Wall du compilateur gcc.
La méthode POST permet de passer des variables saisies par l’utilisateur d’un
script php à l’autre.
Exemple :
echo ‘’<form method=\’’post\’’ action=\‘’check.php\’’>
Login : <input type=\‘’text\’’ name =\’’login\’’ value=\‘’$login\’’ /><br />
Password : <input type=\‘’password\’’ name =\’’pass\’’ value=\‘’$pass\’’ /><br />
<input type=\’’submit\’’ value=\’’Identifier\’’ />
</form>’’;
Les variables peuvent directement être passées par l’intermédiaire des URL.
Exemple :
$id = 20;
echo ‘’<a href=\‘’fichier.php?action=buy&id=$id\’’>Acheter</a>’’;
Cet exemple va créer dans le script destination les variables globales $action
et $id avec les valeurs respectives ‘’buy’’ et ‘’20’’.
Ainsi une application web écrite en php peut interagir avec l’utilisateur de façon
dynamique.
Chargement de fichiers (I)
Les formulaires permettent de transmettre des informations sous forme de
chaînes de caractères. Ils peuvent aussi permettre à un internaute de
transmettre un fichier vers le serveur.
Exemple :
echo ‘’<form action=\‘’$PHP_SELF\’’ method=\‘’POST\’’
ENCTYPE=\‘’multipart/form-data\’’>\n
<input type=\‘’hidden\’’ name=\‘’MAX_FILE_SIZE\’’ value=\‘’1024000\’’ />\n
<input type=\‘’file\’’ name=\‘’mon_fichier\’’ /><br />\n
<input type=\‘’submit\’’ value=\‘’envoyer\’’ />\n
</form>\n’’;
Chargement de fichiers (II)
Pour récupérer le fichier, il faut utiliser la variable d’environnement
$HTTP_POST_FILES qui est un tableau associatif dont les champs sont les
noms des champs HTML file du formulaire. Par exemple :
$HTTP_POST_FILES[‘mon_fichier‘] où mon_fichier est le nom donné au
champs du formulaire HTML de type file.
La variable $HTTP_POST_FILES[‘mon_fichier‘] est elle aussi un tableau
associatif possédant les champs suivants :
Champ Description
name nom du fichier chez le client
type type MIME du fichier
size taille du fichier en octets
tmp_name nom temporaire du fichier sur le serveur
Si aucun fichier n’a été envoyé par le client, la variable mon_fichier vaudra la
chaîne de caractères : ‘’none’’ ou bien ‘’’’ (chaîne vide).
Exemple :
<input type=‘’file’’ name=‘’mes_fichiers[]’’ />
<input type=‘’file’’ name=‘’mes_fichiers[]’’ />
<input type=‘’file’’ name=‘’mes_fichiers[]’’ />
<input type=‘’file’’ name=‘’mes_fichiers[]’’ />
Exemple :
$files_tab = $HTTP_POST_FILES[‘mes_fichiers’];
foreach($files_tab as $file) {
/* faire le traitement vu précédemment :
- extraire le nom du fichier temporaire sur le serveur
- vérifier la taille et le type MIME
- donner un nouveau nom, emplacement et extension du fichier
- copier le fichier temporaire dans son nouvel emplacement */
}
Exemple :
<input type=‘’file’’ name=‘’mon_fichier’’ />
<input type=‘’file’’ name=‘’mon_autre_fichier’’ />
Exemple :
$file = $HTTP_POST_FILES[‘mon_fichier’];
// puis faire le traitement vu précédemment
$file = $HTTP_POST_FILES[‘mon_autre_fichier’];
// puis refaire encore le même traitement
Exemple 1 :
// vérification que le fichier a bien été envoyé par la méthode POST
if (is_uploaded_file($mon_fichier)) {
// déplace le fichier dans le répertoire de sauvegarde
copy($userfile, $dest_dir);
}
Exemple 2 :
/* déplace directement le fichier dans le répertoire de sauvegarde en faisant les
vérifications nécessaires */
move_uploaded_file($mon_fichier, $dest_dir);
Sessions (I)
Les sessions sont un moyen de sauvegarder et de modifier des variables tout
au cours de la visite d’un internaute sans qu’elles ne soient visibles dans l’URL
et quelque soient leurs types (tableau, objet…).
Quelques fonctions :
session_start() : démarre une session
session_destroy() : détruit les données de session et ferme la session
session_register(‘’var’’) : enregistre la variable $var dans la session en
cours, attention, ne pas mettre le signe $ (dollars) devant le nom de variable
session_unregister(‘’var’’) : détruit la variable $var de la session en cours
Sessions (II)
Une session doit obligatoirement démarrer avant l’envoi de toute information
chez le client : donc pas d’affichage et pas d’envoi de header. On peut par
exemple avoir une variable globale contenant le code HTML de la page et
l’afficher à la fin du script.
Les variables de session sont accessibles comme des variables globales du
script.
Exemple :
<?
$out = ‘’<html><body>’’;
session_start(); // démarrage de la session
if(! isset($client_ip)) {
$client_ip = $REMOTE_ADDR;
session_register(‘’client_ip’’); // enregistrement d’une variable
}
/* … + code de la page */
$out .= ‘’</body></html>’’;
echo $out;
?>
Sessions (III)
Sauvegarder des variables de type objet dans une session est la méthode de
sécurisation maximum des données : elles n’apparaîtront pas dans l’URL et ne
pourront pas être forcées par un passage manuel d’arguments au script dans
la barre d’adresse du navigateur.
Les données de session étant sauvegardées sur le serveur, l’accès aux pages
n’est pas ralenti même si des données volumineuses sont stockées.
Une session est automatiquement fermée si aucune requête n’a été envoyée
au serveur par le client durant un certain temps (2 heures par défaut dans les
fichiers de configuration Apache).
Quelques fonctions:
fopen($file [,$mode]) : ouverture du fichier identifié par son nom $file et dans
un mode $mode particulier, retourne un identificateur $fp de fichier ou FALSE
si échec
fopen($fp) : ferme le fichier identifié par le $fp
fgets($fp, $length) : lit une ligne de $length caractères au maximum
fputs($fp, $str) : écrit la chaîne $str dans le fichier identifié par $fp
fgetc($fp) : lit un caractère
feof($fp) : teste la fin du fichier
file_exists($file) : indique si le fichier $file existe
filesize($file) : retourne la taille du fichier $file
filetype($file) : retourne le type du fichier $file
unlink($file) : détruit le fichier $file
copy($source, $dest) : copie le fichier $source vers $dest
readfile($file) : affiche le fichier $file
rename($old, $new) : renomme le fichier $old en $new
Fichiers (II)
Exemple typique d’affichage du contenu d’un fichier :
<?php
$file = ‘’fichier.txt’’ ;
if( $fd = fopen($file, ‘’r’’)) { // ouverture du fichier en lecture
while ( ! feof($fd) ) { // teste la fin de fichier
$str .= fgets($fd, 1024);
/* lecture jusqu’à fin de ligne où des 1024 premiers caractères */
}
fclose ($fd); // fermeture du fichier
echo $str; // affichage
} else {
die(‘’Ouverture du fichier <b>$file</b> impossible.’’);
}
?>
Fichiers (III)
La fonction fopen permet d’ouvrir des fichiers dont le chemin est relatif ou
absolu. Elle permet aussi d’ouvrir des ressources avec les protocols HTTP ou
FTP. Elle renvoie FALSE si l’ouverture échoue.
Exemples :
$fp = fopen(‘’../docs/faq.txt’’, ‘’r’’);
$fp = fopen(‘’http://www.php.net/’’,’’r’’);
$fp = fopen(’’ftp://user:password@cia.gov/’’, ‘’w’’);
<?php
if ($dir = @opendir(‘.’)) { // ouverture du dossier
while($file = readdir($dir)) { // lecture d’une entrée
echo ‘’$file<br />’’; // affichage du nom de fichier
}
closedir($dir); // fermeture du dossier
}
?>
Constructeur :
dir($str) : retourne un objet dir et ouvre le dossier $str
Accès aux dossiers (IV)
Exemple 2 :
<?php
$d = dir(‘.’); // ouverture du dossier courant
echo ‘’Pointeur: ‘’.$d->handle.’’<br />’’;
echo ‘’Chemin: ‘’.$d->path.’’<br />’’;
while($entry = $d->read()) { // lecture d’une entrée
echo $entry.’’<br />’’;
}
$d->close(); // fermeture du dossier
?>
Cet exemple est équivalent au précédent. Ils listent tous les deux les fichiers et
sous répertoires du dossier courant.
Dates et heures (I)
Les fonctions de dates et heures sont incontournables sur Internet et sont
indispensables pour la conversion en français des dates fournies par la base
de données MySQL qui les code au format anglophone (YYYY-DD-MM
hh:mm:ss).
Quelques fonctions :
date(‘’$format’’) : retourne une chaîne de caractères contenant la date et/ou
l’heure locale au format spécifié
getdate() : retourne un tableau associatif contenant la date et l’heure
checkdate($month, $day, $year) : vérifie la validité d’une date
mktime ($hour, $minute, $second, $month,$day, $year) : retourne le
timestamp UNIX correspondant aux arguments fournis c’est-à-dire le nombre
de secondes entre le début de l'époque UNIX (1er Janvier 1970) et le temps
spécifié
time() : retourne le timestamp UNIX de l’heure locale
Dates et heures (II)
Exemple 1 :
echo date(''Y-m-d H:i:s'');
/* affiche la date au format MySQL : ‘2002-03-31 22:30:29’ */
Exemple 2 :
if(checkdate(12, 31,2001))
echo ‘’La St Sylvestre existe même chez les anglais !!!’’;
Exemple 3 :
$aujourdhui = getdate();
$mois = $aujourdhui['mon'];
$jour = $aujourdhui['mday'];
$annee = $aujourdhui['year'];
echo ''$jour/$mois/$annee''; // affiche ‘31/3/2002’
Dates et heures (III)
Les formats pour date :
d Jour du mois sur deux chiffres [01..31] j Jour du mois sans les zéros initiaux
l Jour de la semaine textuel en version longue et en anglais
D Jour de la semaine textuel en trois lettres et en anglais
w Jour de la semaine numérique [0..6] (0: dimanche)
z Jour de l'année [0..365]
m Mois de l'année sur deux chiffres [01..12] n Mois sans les zéros initiaux
F Mois textuel en version longue et en anglais
M Mois textuel en trois lettres
Y Année sur 4 chiffres y Année sur 2 chiffres
h Heure au format 12h [01..12] g Heure au format 12h sans les zéros initiaux
H Heure au format 24h [00..23] G Heure au format 24h sans les zéros initiaux
i Minutes [00..59] s Secondes [00.59]
a am ou pm A AM ou PM
L Booléen pour savoir si l'année est bisextile (1) ou pas (0)
S Suffixe ordinal anglais d'un nombre (ex: nd pour 2)
t Nombre de jour dans le mois donné [28..31]
U Secondes depuis une époque Z Décalage horaire en secondes [-43200..43200]
Dates et heures (IV)
Les clés du tableau associatif retourné par getdate :
seconds : secondes
minutes : minutes
hours : heures
mday : jour du mois
wday : jour de la semaine, numérique
mon : mois de l'année, numérique
year : année, numérique
yday : jour de l'année, numérique
weekday : jour de la semaine, textuel complet en anglais
month : mois, textuel complet en anglais
Expressions régulières (I)
Les expressions régulières sont un outil puissant pour la recherche de motifs
dans une chaîne de caractères.
Fonctions :
ereg($motif, $str) : teste l’existence du motif $motif dans la chaîne $str
ereg_replace($motif, $newstr, $str) : remplace les occurrences de $motif
dans $str par la chaîne $newstr
split($motif, $str) : retourne un tableau des sous-chaînes de $str délimitées
par les occurrences de $motif
Exemple :
if (eregi(‘’Paris’’, $adresse))
echo ‘’Vous habitez Paris.’’;
Expressions régulières (II)
Les motifs peuvent être très complexes et contenir des caractères spéciaux.
Exemples :
if ( ereg(‘’^.*@wanadoo\.fr’’, $email) ) {
echo ‘’Vous êtes chez Wanadoo de France Télécom.’’;
}
Syntaxe : header($str);
Exemples :
header(‘’Content-type: image/gif’’); // spécifie le type d’image gif
header(‘’Location: ailleurs.php’’); // redirection vers une autre page
header(‘’Last-Modified: ‘’.date(‘’D, d M Y H:i:s’’).‘’ GMT’’);
headers_sent() : Retourne TRUE si les entêtes ont déjà été envoyées, FALSE
sinon.
Entêtes HTTP (II)
Le rôle des entêtes est d’échanger des méta informations entre serveur et
client à propos du document, de la connexion, etc.
<?php
header(‘’Location: home2.php’’);
exit();
?>
Ce script effectue une redirection vers une autre page. C’est-à-dire que le
navigateur du client en voyant cet entête Location va charger directement la
page indiquée sans regarder la suite du script. La fonction exit est là pour
parer au cas impossible où le script continuerait son exécution.
<?php
if(!isset($PHP_AUTH_USER)) {
header(‘’WWW-Authenticate: Basic realm=\’’Mon domaine\’’’’);
header(‘’HTTP/1.0 401 Unauthorized’’);
echo ‘’Echec de l’identification.’’;
exit();
} else {
echo ‘’Bonjour $PHP_AUTH_USER.<br />’’;
echo ‘’Votre mot de passe : $PHP_AUTH_PW.’’;
}
?>
Syntaxe :
mail($recipient, $subject, $message[, $headers, $params]);
Exemple :
$message = ‘’Allez sur le site du CyberZoïde Qui Frétille, vous y trouverez
un tutoriel complet sur le PHP4 et MySQL.’’;
mail(‘’vous@labas.fr’’, ‘’Aide sur PHP’’, $message);
<?php
$recipient = ‘’Tony <tony@labas.com>, ‘’;
$recipient .= ‘’Peter <peter@pwet.net>’’;
$subject = ‘’Notre rendez-vous’’;
$message = ‘’Je vous propose le samedi 15 juin \n’’;
$message .= ’’--\r\n’’; // Délimiteur de signature
$message .= ‘’Le CyberZoïde Qui Frétille’’;
$headers = ‘’From: Hugo Etiévant <cyberzoide@multimania.com>\n’’;
$headers .= ‘’Content-Type: text/html; charset=iso-8859-1\n’’ ;
$headers .= ‘’Cc: bruno@ici.fr\n’’;
mail($recipient, $subject, $message, $headers);
?>
Mail (III)
Quelques entêtes :
Grâce à cette fonction, on peut conserver dans une base de données, des
portions de code utilisables ultérieurement.
Le code de la chaîne $str doit respecter les mêmes contraintes que le code
normal. Notamment :
- point virgule après chaque instruction
- respect des séquences d’échappement
- etc…
Exemple :
$foobar = ‘’Hello Word’’;
eval(‘echo $foobar;’); // affiche ’Hello Word’
Colorisation syntaxique (I)
PHP dispose de fonctions qui permettent d’afficher le code source de scripts
php et d’en coloriser la syntaxe.
Il n’est pas recommandé d’utiliser les fonctions suivantes afin que vos visiteurs
ne connaissent pas votre code source et ne puissent ainsi pas exploiter des
vulnérabilité de votre application web.
Résultat affiché :
<?php
$out = "<html><body>";
ConnexionSQL();
echo date("D, d M Y H:i:s");
if($action == "add") {
AddNew();
} elseif($action == "stats") {
ShowStats();
}
/* ShowSubmitForm(); */
ShowStats();
$out .= "</body></html>";
echo $out;
?>
Colorisation syntaxique (III)
La configuration de la colorisation se trouve dans le fichier php.ini :
Couleur de fond
Couleur des commentaires
Couleur par défaut
Couleur des balises HTML
Couleur des mots réservés
Couleur des chaînes
URL (I)
Les URL (Uniform Ressource Location) sont les chemins de ressources sur
internet.
Exemples d’URL:
http://www.google.fr/?q=cours+php
http://cyberzoide.developpez.com/php/php4_mysql.ppt
ftp://foo:0478@ftp.download.net
Pour faire face au cas général d’un paramètre dont la valeur contient des
caractères interdits, on utilise les fonction de codage.
URL (III)
Quelques fonctions de codage sur l’URL :
Codage de base :
urlencode : Encode une chaîne en URL.
urldecode : Décode une chaîne encodée URL.
Codage complet :
rawurlencode : Encode une chaîne en URL, selon la RFC1738.
rawurldecode : Décode une chaîne URL, selon la RFC1738.
Exemple 1 :
echo <a href=\‘’$PHP_SELF?foo=‘’.urlencode($foo).’’\’’>Foo</a>’’;
Exemple 2 :
echo <a href=\‘’$PHP_SELF?foo=‘’.rawurlencode($foo).’’\’’>Foo</a>’’;
Pour être accessible, la valeur du paramètre devra par la suite être décodée
dans le script d’arrivé par la fonction réciproque adéquate.
URL (V)
base64_encode($str) : code la chaîne $str en base 64. Cet encodage permet
à des informations binaires d'être manipulées par les systèmes qui ne gèrent
pas correctement les codes 8 bits (code ASCII 7 bit étendu aux accents
européens), comme par exemple, les corps de mail qui en général sont
américains et ne gère que les 7 bits. Une chaîne encodée en base 64 a une
taille d’environ 33% supérieure à celle des données initiales.
Exemple 3 :
echo <a href=\‘’$PHP_SELF?foo=‘’.base64_encode($foo).’’\’’>Foo</a>’’;
Exemple :
$tab = parse_url(’’http://www.cia.gov:8080/form.php?var=val’’);
Champ Valeur
scheme http
host www.cia.gov
port 8080
path form.php
query var=val
URL (VII)
parse_str($str) : analyse la chaîne $str comme si c’était une URL et en extrait
les variables et valeurs respectives qui seront alors connues dans la suite du
script.
Cette fonction évite d’avoir à créer ses propres fonctions d’analyse de champs
de base de données où l’on aurait sauvegardé une url.
Exemple :
$str = ‘’nom=jean+pierre&email[]=moi@ici.fr&email[]=moi@labas.com’’;
parse_str($str);
echo $nom, $email[0], $email[1];
Cryptage et autres réjouissances
crypt($str [, $salt]) : Retourne une chaîne de caractères. Crypte la chaîne de
caractères $str. La chaîne optionnelle $salt sert de base au cryptage. Cet
argument optionnel est appelé « grain de sel » à l’image des germes de
nucléation à l’origine des dendrites. L’algorythme de cryptage utilisé par PHP
n’est a priori pas défini (il peut varier d’un système à un autre), mais c’est en
général le DES standard ou bien encore MD5. On sait aussi que le système
utilisé – quel qu’il soit – est injectif, c’est-à-dire qu’il n’existe pas d’algorithme
symétrique pour décrypter la chaîne codée résultante (du moins officiellement,
il est toujours possible que la NSA ait pu le faire et aurait alors tout intérêt à
garder cela secret).
md5($str) : Crypte la chaîne $str en utilisant la méthode MD5.
crc32($str) : Retourne la somme de vérification de redondance cyclique (32-
bit) de la chaîne $str. Cette valeur sert généralement à vérifier l'intégrité de
données transmises.
uniqid($str [, $lcg]) : Retourne un identifiant en chaîne de caractères préfixé
unique, basé sur l'heure courante, en micro-secondes. Si le paramètre
optionnel booléen $lcg est vrai, uniqid() ajoutera une entropie « combined
LCG » à la fin de la valeur retournée, ce qui renforcera encore l'unicité de
l'identifiant.
$x = md5 (uniqid (rand())); // $x est une chaîne difficile à prédire !!!
Fonctions de hachage (I)
Les fonctions de hachage s’appliquent à des données afin d’en produire un
condensat (dit aussi hashcode). Ce condensat est calculé à partir des données
d’origine grâce à un algorithme injectif. C’est-à-dire que l’application de cet
algorithme produira toujours le même condensat si on utilise les mêmes
données de départ. Par contre, deux condensats égaux ne proviennent pas
forcément des mêmes données. Les fonctions de hachage sont généralement
utilisées pour créer des sommes de vérification ou signer des messages. La
génération de condensats joints aux données est une méthode très utilisée
pour assurer l’intégrité des données contre le piratage.
Méthodologie : X veux envoyer un message à Y de façon a s’assurer que
personne ne pourra altérer le message (le modifier) sans que Y s’en rende
compte. X va calculer un condensat C du message et l’envoier à Y avec le
message. A réception du message, Y calcul lui aussi un condensat K du
message et le comparé au condensat C envoyé par X. Si K est différent de C,
alors le message reçu est différent du message envoyé !
$nbr = mhash_count();
echo ‘’<table>’’;
for($i = 0; $i <= $nbr; $i++) {
if(mhash_get_hash_name($i))
echo ‘’<tr><td>$i</td><td>’’.mhash_get_hash_name($i).’’</td><td>’’.
mhash_get_block_size($i).’’</td></tr>’’;
}
echo ‘’</table>’’;
Divers
defined($str) : Vérifie qu'une constante existe. Renvoie VRAI si la constante
dont le nom est passé en paramètre existe ou FAUX sinon.
sleep($nbr) : Retarde l'exécution du script durant $nbr secondes. Attention,
Apache peut être configurer pour limiter la durée d’exécution des scripts.
usleep($nbr) : Retarde l'exécution du script durant $nbr microsecondes.
Requêtes Apache (I)
getallheaders() : renvoie un tableau associatif contant tous les entêtes de la
requête en cours.
Exemple :
$headers = getallheaders() ;
foreach($headers as $key => $elem) // affichage des entêtes recueillies
echo ‘’$key : $elem<br />\n’’ ;
Les fonctions décrites ici de fonctionnent que si PHP est installé en tant que
module du serveur HTTP Apache.
Requêtes Apache (II)
apache_lookup_uri($str) : effectue une requête partielle sur l'URI spécifiée en
paramètre et retourne un objet contenant toutes les informations importantes la
concernant.
Les propriétés de l’objet retourné sont : status (n° erreur HTTP), the_request
(requête HTTP complète), status_line, method (méthode HTTP utilisée),
content_type (type MIME de la ressource), handler, uri, filename (nom et
chemin de la ressource en local sur le serveur), path_info (chemin du
répertoire distant), args, boundary, no_cache (vaut ‘1’ si mise en cache
interdite), no_local_copy (vaut ‘1’ si copie locale interdite), allowed,
send_bodyct, bytes_sent, byterange, clength, unparsed_uri, mtime,
request_time (date de la requête au format timestamp UNIX).
Requêtes Apache (III)
Exemple :
$obj = apache_lookup_uri('http://127.0.0.1/cyberzoide/essai.php') ;
$tab = get_object_vars($obj) ;
foreach($tab as $key => $elem)
echo ‘’$key : $elem <br />\n’’ ;
Avec MySQL vous pouvez créer plusieurs bases de données sur un serveur.
Une base est composée de tables contenant des enregistrements.
Cet exemple est équivalent au précédent mais plus court à écrire. Le symbole
@ (arobase) permet d’éviter le renvoie de valeur par la fonction qu’il précède.
Une connexion persistante évite d’avoir à rouvrir une connexion dans chaque
script. Les connexions sont automatiquement fermées au bout d’un certain
temps en cas d’absence de toute activité…
Interrogation
Pour envoyer une requête à une base de donnée, il existe la fonction :
mysql_query($str) qui prend pour paramètre une chaîne de caractères qui
contient la requête écrite en SQL et retourne un identificateur de résultat ou
FALSE si échec.
Les requêtes les plus couramment utilisées sont : CREATE (création d’une
table), SELECT (sélection), INSERT (insertion), UPDATE (mise à jour des
données), DELETE (suppression), ALTER (modification d’une table), etc.
Exemple :
$result = mysql_query(‘’SELECT address FROM users WHERE
name=\’’$name\’’’’);
Cet exemple recherche l’adresse de l’utilisateur portant pour nom la valeur de
la chaîne $name. L’identificateur de résultat $result permettra à d’autres
fonctions d’extraire ligne par ligne les données retournées par le serveur.
Sous Oracle, l’affichage des résultats d’une requête se fait ligne par ligne, sous
MySQL, c’est pareil. Une boucle permettra de recueillir chacune des lignes à
partir de l’identifiant de résultat.
Une ligne contient (sauf cas particulier) plusieurs valeurs correspondants aux
différents attributs retournés par la requête. Ainsi, une ligne de résultat pourra
être sous la forme d’un tableau, d’un tableau associatif, ou d’un objet.
Extraction des données (II)
mysql_fetch_row($result) : retourne une ligne de résultat sous la forme d’un
tableau. Les éléments du tableau étant les valeurs des attributs de la ligne.
Retourne FALSE s’il n’y a plus aucune ligne.
Exemple 1 :
$requet = ‘’SELECT * FROM users’’;
if($result = mysql_query($requet)) {
while($ligne = mysql_fetch_row($result)) {
$id = $ligne[0];
$name = $ligne[1];
$address = $ligne[2];
echo ‘’$id - $name, $address <br />’’;
}
} else {
echo ‘’Erreur de requête de base de données.’’;
}
Ici, on accède aux valeurs de la ligne par leur indice dans le tableau.
Extraction des données (III)
mysql_fetch_array($result) : retourne un tableau associatif. Les clés étant les
noms des attributs et leurs valeurs associées leurs valeurs respectives.
Retourne FALSE s’il n’y a plus aucune ligne.
Exemple 2 :
$requet = ‘’SELECT * FROM users’’;
if($result = mysql_query($requet)) {
while($ligne = mysql_fetch_array($result)) {
$id = $ligne[‘’id’’];
$name = $ligne[‘‘name’’];
$address = $ligne[‘’address’’];
echo ‘’$id - $name, $address <br />’’;
}
} else {
echo ‘’Erreur de requête de base de données.’’;
}
Ici, on accède aux valeurs de la ligne par l’attribut dans le tableau associatif.
Extraction des données (IV)
mysql_fetch_object($result) : retourne un objet. Les attributs de l’objet
correspondent à ceux de la ligne de résultat. Et les valeurs des attributs de
l’objet correspondent à ceux de la ligne de résultat. Retourne FALSE s’il n’y a
plus aucune ligne.
Exemple 3 :
$requet = ‘’SELECT * FROM users’’;
if($result = mysql_query($requet)) {
while($ligne = mysql_fetch_object($result)) {
$id = $ligne->id;
$name = $ligne->name;
$address = $ligne->address;
echo ‘’$id - $name, $address <br />’’;
}
} else {
echo ‘’Erreur de requête de base de données.’’;
}
Ici, on accède aux valeurs par leur attribut dans l’objet.
Fonctions additionnelles
Quelques fonctions supplémentaires très utiles :
mysql_free_result($result) : efface de la mémoire du serveur les lignes de
résultat de la requête identifiées par $requet. Très utile pour améliorer les
performances du serveur.
mysql_insert_id([$id]) : retourne l’identifiant d’un attribut clé primaire
AUTO_INCREMENT de la dernière insertion.
mysql_num_fields($result) : retourne le nombre d’attributs du résultats.
mysql_num_rows($result) : retourne le nombre de lignes du résultats. Et
ainsi permet de remplacer le while par un for.
Cette rubrique consiste en un seul script qui propose les services suivants :
1) soumettre une nouvelle citation (laissée à l’approbation préalable d’un
administrateur avant affichage publique)
2) lancer une recherche par critères dans la base (parmi les citations validées
par l’admin)
3) afficher toutes les citations (validées)
4) afficher des statistiques
Création de la table des citations (I)
Pour stocker les citations, on créé une table citation dans notre base de
données MySQL, en voici le schéma :
function PrintSubForm()
{
global $out, $author, $body, $year, $semestre, $proposer;
$out .= "<form action=\"$PHP_SELF\" method=\"post\">";
$out .= "<b>Proposer une citation</b><br />";
$out .= " Prof : <select name=\"author\">";
$requet = "SELECT DISTINCT author FROM citation ORDER BY author ASC";
$result = mysql_query($requet);
$out .= "<option value=\"\"> ";
while($ligne = mysql_fetch_object($result)) {
if($author == $ligne->author) { $selected = "selected"; } else { $selected=""; }
$out .= "<option value=\"".$ligne->author."\" $selected>".ligne->author. "</option>";
}
$out .= "</select><br />"; // même chose pour year et semestre
$out .= "<textarea name=\"body\" cols=\"40\" rows=\"5\">$body</textarea><br />";
$out .= "Votre pseudo(*) : <input type=\"text\" name=\"sender\" value=\"$proposer\" />";
$out .= "<input type=\"hidden\" name=\"action\" value=\"proposer\" />";
$out .= "<input type=\"submit\" value=\"Valider\" /><br />";
$out .= "Tous les champs sauf celui avec astérisque sont obligatoires.";
$out .= "</form>";
}
Contrôle des données soumisses (I)
Lors du démarrage du script, la variable $action (qui provient du champ
HIDDEN action) est testée :
switch($action)
{
case "chercher" : PrintSearchResults(); break;
case "proposer" : InsertCitation(); break;
case "stats" : PrintStats(); break;
default : PrintCitations();
}
SELECT *
FROM citation
WHERE accept="yes"
ORDER BY year DESC, semestre DESC, author ASC, id DESC;
Statistiques
La requête suivante permet de calculer des statistiques sommaires :
décompte
SELECT author, COUNT(id) nbr
FROM citation
condition
WHERE accept="yes"
partition
GROUP BY author
tri
ORDER BY nbr DESC, author ASC
Cette requête partitionne la table des citations par prof et compte le nombre
de citations par profs en les triant dans l’ordre décroissant des profs les plus
productifs. Si deux profs arrivent ex æquo, alors on les affichent dans l’ordre
alphabétique. On sélectionne une citation à condition qu’elle ait été validée
par un administrateur.
PARTIE 4 : Méthodologie
Méthodologie générale
Ce manière générale, il faut :
1) Programmer orienté objet en créant des objets, comme par exemple un
objet citation dont les méthodes sont : ajouter, afficher, proposer, statistiques…
dont peut hériter un autre objet : citationvalidée.
2) Toujours contrôler les données saisies par un utilisateur afin d’éviter tout
piratage ; ne jamais présupposer l’honnêteté de l’internaute dans un univers
aussi impersonnel que l’est Internet.
3) Ne pas répercuter automatiquement les données saisies par un utilisateur
auprès des autres internautes sans contrôle ; faire valider les données par un
administrateur.
4) Utiliser des variables de session, puisque celles globales peuvent êtres
forcées par des passages en URL.
Solution 1 :
Utiliser une méta balise dans l’entête de votre page HTML :
<HEAD><META HTTP-EQUIV="Refrech" CONTENT="n; URL=url"></HEAD>
Où n est la durée en secondes après laquelle faire la redirection et url est
l’adresse de la page à charger.
Solution 2 :
Utiliser le JavaScript dans le corps de votre page HTML :
<SCRIPT language=‘’JavaScript’’> document.location = ‘’url’’; </SCRIPT>
Solution 3 :
Utiliser la fonction header avec l’entête Location :
<?php header(‘’Location: url’’); ?>
Historique
6 octobre 2002 : nombres aléatoires améliorés, constantes mathématiques,
formatage d’un nombre, url parsing, chargement de fichiers, requêtes Apache,
algos de hachage (154 diapos)
30 août 2002 : partie 4 « Méthodologie », documentation en ligne, quelques
corrections (135 diapos)
22 avril 2002 : cryptage, exercices : conversion de date et compteur de
visites (130 diapos)
11 avril 2002 : fonctions dynamiques, accès aux dossiers, entêtes HTTP,
URL, Mail, coloration syntaxique, exemple de script, la petite histoire du PHP,
évaluation d’une portion de code, quelques développements (chaînes,
tableaux, fonctions, classes) (123 diapos)
2 avril 2002 : quelques corrections
1er avril 2002 : création du document par Hugo Etiévant (83 diapos)