le cours sur PHP/mysql (en pdf)

Transcription

le cours sur PHP/mysql (en pdf)
DEUST ISR
PHP/MYSQL
PHP
1)historique
On doit la première version de PHP à Rasmus Lerdorf qui l'a mise au point pour ses propres besoins en 1994.
Cette version était destinée à son usage personnel, d'où le nom (Personal Home Pages).
Cette version n'a pas été mise à disposition du public.
Vers 1995, une version qui permettait l'exécution de quelques macros fut mise à disposition (gérer un livre d'or, un compteur de
hits et quelques autres choses).
En 1998, grâce à la collaboration de Zeev Suraski et Andy Gutmans, fondateurs de la sociétéZend, la version 3 voit le jour.
Elle s’appelle désormais PHP : "Hypertext Preprocessor". La version 4 voit le jour en 2000.
2)principe
PHP est un ensemble de fonctionnalité qu'il est possible d'insérer directement dans le code d'une page HTML, comme le
JavaScript, mais ce code va s'exécuter du coté serveur.
Cela permet donc de cumuler les avantages du JavaScript et d'un script CGI.
Mais ne vous y trompez pas, écrire un code en PHP, ne dispense en rien du fait d'avoir à écrire des JavaScript, qui ont toujours
une place dans les pages HTML, notamment pour vérifier la conformité des informations saisie dans les champs d'un
formulaire par un visiteur, avant de traiter lesdites informations.
Le principe est relativement simple, les éléments du langage PHP se trouveront toujours entre 2 balises particulières.
<? et ?>
ou
<?php et ?>
Ses balises pourront se placer n'importe où dans le code HTML.
Il est également possible d'en mettre plusieurs fois dans une page.installation
PHP est un module du programme serveur Web.
L'un des plus utilisés est le serveur Web apache.
Voici les procédures d'installation.
Dans tous les cas, il vous faudra des droits root sous Linux/Unix ou administrateur sous Windows.
BERNARD D.
Page 1/27
DEUST ISR
PHP/MYSQL
sous Linux :
Sur le site Web d’apache : www.apache.org <http://www.apache.org>
récupérez les sources en .tar.gz du serveur version 1.3.X.
(ou sur le site ftp ftp://ftp.inria.fr/pub/Apache/httpd/apache_1.3.29.tar.gz)
Il existe une version 2.X, mais par principe, il ne faut jamais utiliser la dernière version disponible d'un produit (car au moins,
sur l'avant-dernière version, les bugs sont connus et généralement corrigés).
Sur le site Web de PHP : www.php.net <http://www.php.net>
récupérez les sources (pas les binaires!!!) en .tar.gz du module PHP4.X.
(ou sur le site http://www.php.net/get/php-4.3.4.tar.gz/from/fr.php.net/mirror)
Placez les 2 fichiers archive dans le répertoire /usr/src (le créer si besoin).
Décompressez les archives:
$ gunzip -c apache_1.3.x.tar.gz | tar xf où X est votre version de l'archive.
$ cd apache_1.3.x
$ ./configure
$ cd ..
$
$
$
$
$
gunzip -c php-4.x.y.tar.gz | tar xf cd php-4.x.y
./configure --with-mysql --with-apache=../apache_1.3.x
make
make install
$
$
$
$
cd ../apache_1.3.x
./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a
make
make install
$ cd ../php-4.x.y
$ cp php.ini-dist /usr/local/lib/php.ini
Editez le fichier /usr/local/lib/php.ini et vérifiez la valeur de register_globals (on ou off), cela influencera la façon
de traiter les données d'un formulaire.
Editez le fichier httpd.conf qui doit se trouver dans le répertoire conf d'apache et ajouter la ligne suivante:
AddType application/x-httpd-php .php
Pour lancer le serveur web allez dans le répertoire bin d'apache et tapez:
$ ./apachectl start
BERNARD D.
Page 2/27
DEUST ISR
PHP/MYSQL
sous Windows :
récupérez apache sur le site ftp
ftp://ftp.inria.fr/pub/Apache/httpd/binaries/win32/apache_1.3.29-win32-x86-no_src.exe
Double-cliquez sur apache_1.3.29-win32-x86-no_src.exe
renseigner les 3 champs domain (par exemple ici.fr) servername (mettez localhost) et email de l'admin (mettez ce que vous
voulez).
Choisissez de préférence d'installer apache sur un répertoire simple (par exemple d:\apache).
Testez le bon fonctionnement de votre serveur en lançant apache (menu démarrer/apache/apache) puis dans votre navigateur
donnez comme URL http://127.0.0.1
Vous devriez voir apparaître une page d'acceuil.
ATTENTION!!! si vous utilisez windows XP vous devez d'abord arrêter le service IIS, sinon vous risquez d'avoir des conflits
et d'atterrir sur la page d'accueil de IIS.
récupérez le module php sur le site web
http://www.php.net/get/php-4.3.4-Win32.zip/from/fr.php.net/mirror
Décompressez l'archive dans un répertoire simple (par exemple d:\php).
Copiez les fichiers php4ts.dll et php.ini-recommended dans votre répertoire système.
Win9x Me: C:\Windows\
Win2k XP : C:\Winnt\
Il est possible d'installer php en tant que module ou comme cgi, et la procédure d'installation est différente suivant votre choix.
Nous installerons PHP comme module d'apache.
Copiez le fichier php4apache.dll (qui se trouve dans le répertoire sapi) dans votre répertoire système.
Renommez php.ini-recommended (celui qui se trouve maintenant dans votre répertoire système) en php.ini.
Ouvrez-le avec un éditeur de fichiers texte. Les lignes commentées sont symbolisées dansphp.ini par le point-virgule ;
Trouvez la ligne doc_root. Elle permet de dire à PHP à partir de quel endroit sur votre disque il est "habilité" à s'executer.
Sauf si vous savez ce que vous faîtes, mettez pour doc_root la même chose que ce que vous avez spécifié pour le
DocumentRoot d'Apache.
Trouvez la ligne de l'include_path, mais trouvez la bonne, celle concernant Windows, pas Unix.
Décommentez-donc la ligne et spécifiez les répertoires qui seront parcourus en priorité lors d'un include() ou d'un require().
include_path = ".;d:\PHP\pear\"
BERNARD D.
Page 3/27
DEUST ISR
PHP/MYSQL
Trouvez la ligne extension_dir et modifiez-la pour indiquer le chemin vers le répertoire extensions de PHP (qui contient...
toutes les extensions de PHP, en effet.).
extension_dir = "d:\PHP\extensions\"
Dans le fichier httpd.conf d'apache ajoutez/modifiez les lignes suivantes:
LoadModule php4_module "d:\PHP\sapi\php4apache.dll"
AddModule mod_php4.c
DirectoryIndex index.html index.php
AddType application/x-httpd-php .php .php3 .php4 .phtml
3)fonctionnalités
PHP, comme le C, le JavaScript, ou encore le shell sous Unix, permet d'avoir un certain nombre de fonctionnalités.
3.1)les variables
En PHP, toutes les variables sont précédées du symbole $.
Le nom de la variable peut comporter des lettres, des chiffres, ainsi que le caractère _.
Il n'est pas possible d'y inclure des espaces ou des caractères qui ne sont pas alphanumériques.
Comme en C, les instructions se terminent par un ; .
Exemple de variables:
$a;
$a_nom_de_variable_plutot_long;
$1234;
$riendespeciale23332___555_;
Une variable peut contenir aussi bien des chaînes de caractères que des nombres, des tableaux, des objets ou des booléens.
Exemple :
$unnombre = "coucou";
$unechaine = 5430 ;
Il est possible d'avoir des variables dites "dynamiques".
Exemple:
$nom = "robert" ;
$je_suis_trop_fort="nom";
BERNARD D.
Page 4/27
DEUST ISR
PHP/MYSQL
si j'ecris:
print $nom;
print $je_suis_trop_fort;
print $$je_suis_trop_fort;
j'aurais:
robert
nom
robert
3.2)Les références aux variables:
Il peut être utile dans certains cas, qu'une variable soit automatiquement mise à jour en fonction d'une autre.
Regardons le code suivant:
$a = 43 ;
$b = $a ;
$a = 123 ;
print $b;
affichera 43
Si par contre j'écris:
$a = 43 ;
$b = &$a ;
$a = 123 ;
print $b;
j'obtiendrais à l'affichage : 123
ATTENTION
Le code PHP, comme le code HTML, C ou JavaScript est interprété de haut en bas.
Cela implique que vous devez faire attention à bien initialiser vos variables AVANT de les traiter.
3.3)les types
Par défaut, les variables en PHP ne sont pas typées (comme en JavaScript).
Ainsi, il est possible d'écrire un code comme celui qui suit sans avoir pour autant des erreurs:
$a="coucou";
$a=3;
$a=true;
Cela permet une très grande flexibilité dans les scripts, mais cette flexibilité est parfois aussi source d'erreur ou du moins
d'égarement.
En effet, il ne sera pas rare que dans des scripts importants, le programmeur pense qu'une variable
est d'un certain type à l'endroit où il l'utilise, alors qu'en fait, elle est d'un type complètement différent, voire même
incompatible.
BERNARD D.
Page 5/27
DEUST ISR
PHP/MYSQL
Exemple:
$a = 4;
...
$a = "salut" ;
...
// ici le programmeur pense que $a est de type entier
$a = $a * 5 ;
ce qui ne donnera pas le résultat espéré.
En réalité, en PHP il existe 6 types de donnés :
•
•
•
•
•
•
entier
double (réel)
chaîne
booléen
tableau
objet
Il est possible de tester le type d'une variable grâce à la fonction gettype().
Exemple :
$a = 43 ;
print gettype($a);
$a="toto";
print gettype($a);
affichera:
integer
string
Il existe 2 façons pour modifier le type d'une variable.
Soit avec la fonction settype(), soit avec un opérateur de cast.
Exemple :
$a = 3.14 ;
settype($a,integer); → $a est devenu un entier. sa valeur sera donc 3. La même chose
est possible en écrivant :
$a = 3.14 ;
$a = (integer) $a ;
BERNARD D.
Page 6/27
DEUST ISR
PHP/MYSQL
3.4)les opérateurs
3.4.1)opérateur d'affectation
comme en C : =
exemple : $mavariable = "salut" ;
3.4.2)opérateur arithmétique
comme en C : +, -, *, /, %
exemple: $mavariable = 3 + 5 * 6 / 2 + 5 % 2;
3.4.3)opérateur de concaténation
comme en JavaScript : .
Exemple : $mavariable = "bonjour" . "le monde"; -> bonjour le monde
3.4.4)opérateur d'affectation supplémentaire
comme en C : +=, -=, *=, /=, %=, .=
exemples:
$x = 3;
$y = "coucou";
$x += 5 -> $x=8
$y .=" le monde"; -> $y="coucou le monde";
3.4.5)opérateur de comparaison:
comme en C : ==, !=, ===, >, <, >=, <=
exemple:
if ($a == $b) // test si $a possède la même valeur que $b
if ($a === $b) // test si $a possède la même valeur que $b ET est de même type
3.4.6)opérateur logique:
comme en C : &&, ||, !, or, xor, and
exemple:
if ($a==5 && $b<3) // test si $a possède la valeur 5 et si $b est plus petit que 3
3.4.7)Incrémentation, décrémentation automatique:
comme en C : ++, -exemple :
$x=1;
$x++; -> $x = 2
BERNARD D.
Page 7/27
DEUST ISR
PHP/MYSQL
3.5)les constantes
Il est parfois préférable, plutôt que d'utiliser des variables, d'utiliser des "variables" dont la valeur ne doit pas changer, bref, des
constantes.
Cela est faisable grâce à la fonction, define().
Exemple :
define("PI", 3.14 );
Pour accéder à la constante, il n'est pas nécessaire d'avoir recours au symbole $.
Ainsi pour afficher ma constante je peux écrire :
print "la valeur de pi est : ".PI;
3.6)les conditions
un branchement conditionnel se fait, comme en JavaScript, grâce à l'instruction if, avec éventuellement un else.
if (condition) {
...
}
else {
...
}
Il est également possible d'utiliser un switch.
switch (expression){
case resultat1 :
...
break;
.....
case resultatn :
...
break;
default :
...
}
Pour des questions pratiques, il peut être utile d'utiliser l'opérateur ternaire '?' .
BERNARD D.
Page 8/27
DEUST ISR
PHP/MYSQL
Exemple :
($a == $b)?$a++:$b++;
si $a est égale à $b alors on incrémente $a
sinon, on incrémente $b
3.7)les boucles
Il existe 3 types de boucle en PHP :
tant que la condition est vraie, faire une suite d'instructions.
while (condition){
...
}
Faire une suite d'instruction tant que la condition est vraie.
do{
...
}while(condition)
Lorsque l'on sait à l'avance combien de "tours de boucle " on doit faire, il faut utiliser une boucle pour.
ATTENTION, la variable affectée d'une boucle pour est incrémentée ou décrémentée automatiquement jusqu'à ce que la
condition de la boucle ne soit plus vraie.
for (affectation; condition ; incrementation/decrementation){
...
}
Il est possible de sortir d'une boucle avant la condition de fin à l'aide de l'instruction break.
Il est également possible de sauter une itération grâce à l'instruction continue.
Exemple :
for ($i=0;$i<10;$i++){
$a = $i * 10;
if ($a > 70) break;
if ($a < 30) continue ;
print "i = $i a = $a";
}
affichera :
BERNARD D.
Page 9/27
DEUST ISR
PHP/MYSQL
3.8)les tableaux
Il existe plusieurs façons pour créer un tableau.
La plus simple :
$tab[] = "un" ;
$tab[] = "deux" ;
$tab[] = "trois" ;
donne un tableau dont les indices vont de 0 à 2 et dont les valeurs sont respectivement "un", "deux", et "trois".
Une autre façon de procéder est d'utiliser la fonction array():
$tab = array( "un", "deux", "trois") ;
Il est possible de connaître le nombre d'éléments d'un tableau grâce à la fonction count().
count($tab) -> 3
Pour parcourir un tableau il est toujours possible d'utiliser une boucle for, mais une instructionforeach est plus convenable en
PHP.
Exemple :
foreach ($tab as $valeur){
print $valeur;
}
Affichera :
un
deux
trois
fusionner des tableaux est très simple en PHP, grâce à la fonction array_merge.
Exemple :
$tab2 = array("quatre", "cinq");
$tabfusion = array_merge($tab, $tab2);
foreach ($tabfusion as $valeur){
print $valeur;
}
Affichera :
un
deux
trois
quatre
cinq
BERNARD D.
Page 10/27
DEUST ISR
PHP/MYSQL
De même, ajouter des valeurs à un tableau se fera à l'aide de la fonctionarray_push() .
exemple :
$nombredelements = array_push($tab, "quatre", "cinq");
foreach ($tab as $valeur){
print $valeur;
}
print "il y a $nombredelements elements dans le tableau";
Affichera :
un
deux
trois
quatre
cinq
il y a 5 elements dans le tableau
La fonction array_slice va nous permettre d'extraire un bout de tableau d'un tableau.
Exemple :
$tab2 = array_slice($tab,2,2) ;
•
le premier argument de array_slice est le tableau duquel on souhaite extraire des données (le tableau ne sera pas modifié!!).
•
Le second argument de array_slice est l'indice à partir duquel on souhaite commencer à extraire les données.
•
Le dernier argument de array_slice est le nombre de données que l'on souhaite extraire (s'il n'est pas renseigné, on va jusqu'à
la fin du tableau).
$tab2 est le nouveau tableau créé avec les données extraites de $tab.
ici $tab2 sera constitué ainsi :
$tab2[0] -> "trois"
$tab2[1] -> "quatre"
3.9)les tableaux associatifs
Un tableau associatif est un tableau indexé par des chaînes de caractères plutôt que des chiffres.
Exemple :
$user[nom]="bidochon" ;
$user[prenom]="robert ";
$user["deuxieme prenom"]="gaston" ;
$user[age]=54 ;
On remarque que lorsque l'index est composé de caractères spéciaux comme un espace ou un caractère accentué, l'index est
placé entre guillemets.
BERNARD D.
Page 11/27
DEUST ISR
PHP/MYSQL
Une autre façon de remplir ce tableau est :
$user = array( nom => "bidochon", prenom => "robert", "deuxieme prenom" => "gaston",
age =>54);
pour afficher un tableau associatif, il faut utiliser la syntaxe suivante :
foreach($user as $clef => $valeur){
echo "nom de l'index :";
echo $clef;
echo "valeur se trouvant à l'index :";
echo $valeur;
}
Ce qui affichera :
nom de l'index : nom valeur se trouvant à l'index : bidochon
nom de l'index : prenom valeur se trouvant à l'index : robert
nom de l'index : deuxieme prenom valeur se trouvant à l'index : gaston
nom de l'index : age valeur se trouvant à l'index : 54
3.10)les tableaux multidimensionnels
Un tableau multidimensionnel est un tableau qui comporte d'autres tableaux.
Un exemple de déclaration d'un tableau multidimensionnel peut se faire de la façon suivante:
$multitab = array( array("l0c0","l0c1","l0c2"), array("l1c0","l1c1","l1c2"), array
("l2c0","l2c1","l2c2") );
soit à l'affichage :
echo $multitab[0][0]; -> l0c0
echo $multitab[2][2]; -> l2c2
echo $multitab[1][2]; -> l1c2
3.11)les fonctions
Comme en C ou en JavaScript, il est possible d'utiliser et de définir des fonctions.
La syntaxe est la suivante :
function nom_de_la_fonction($parametre1, $parametre2, …,$parametreN){
// code de la fonction
return une_valeur; // une_valeur peu être une variable. le return n'est pas
obligatoire.
}
À l'inverse du C, il n'est pas nécessaire de définir le type de ce qui sera retourné par la fonction.
Idem pour les paramètres de celle-ci.
En revanche, toute variable définie dans la fonction restera locale à cette dernière.
BERNARD D.
Page 12/27
DEUST ISR
PHP/MYSQL
Exemple :
function le_sens_de_la_vie(){
$reponse="celui qu'on lui donne";
}
echo "quel est le sens de la vie ?"
le_sens_de_la_vie();
echo "la reponse est :".$reponse;
Affichera :
quel est le sens de la vie ?
la reponse est :
Idem, avec une variable définie à l'extérieur de la fonction.
$a = 5 ;
function doubleval(){
$a = $a *2 ;
echo "la valeur de a dans la fonction est : $a";
}
echo "la valeur de a avant l'appel a la fonction est : $a";
doubleval();
echo "la valeur de a après l'appel a la fonction est : $a";
Affichera :
la valeur de a avant l'appel a la fonction est : 5
la valeur de a dans la fonction est : 0
la valeur de a après l'appel a la fonction est : 5
Si l'on souhaite modifier une variable définie à l'extérieur d'une fonction il faut utiliser l'instructionglobal.
$a = 5 ;
function doubleval(){
global $a;
$a = $a *2 ;
echo "la valeur de a dans la fonction est : $a";
}
echo "la valeur de a avant l'appel a la fonction est : $a";
doubleval();
echo "la valeur de a après l'appel a la fonction est : $a";
Affichera :
la valeur de a avant l'appel a la fonction est : 5
la valeur de a dans la fonction est : 10
la valeur de a après l'appel a la fonction est : 10
BERNARD D.
Page 13/27
DEUST ISR
PHP/MYSQL
4)les formulaires
PHP est surtout pratique pour la facilité de traitement des informations en provenance de formulaires.
4.1)les variables d'environnement
Comme avec les CGI, il est possible d'avoir accès à un certain nombre de variables d'environnement.
$HTTP_USER_AGENT
nom du navigateur client
$REMOTE_ADDR
adresse IP du client
$REQUEST_METHOD
methode utilisée par la page formulaire dont nous recevons les information (get ou post).
$QUERY_STRING
données envoyées par une methode get
$REQUEST_URI
adresse complete de la requête
$HTTP_REFERER
adresse de la page à partir de laquelle la requête a été effectuée
Il existe aussi une variable nommée $PHP_SELF qui donne le chemin du script en cours d'exécution. Cette variable est très
utile lorsque l'on souhaite créer un formulaire qui se rappel lui-même. il suffit de donner $PHP_SELF comme argument de
ACTION du formulaire.
4.2)méthode GET ou méthode POST
Suivant la configuration que vous avez, vous ne pourrez pas récupérer les données en provenance d'un formulaire de la même
façon, si vous avez utilisé une méthode GET ou une méthode POST pour l'envois de vos données.
Si register_globals est à ON dans votre fichier php.ini , il vous suffira d'utiliser le nom de votre champ de formulaire précédé
d'un $ pour pouvoir l'utiliser.
Sinon, pour une method GET, il vous faudra utiliser la syntaxe suivante:
$nomdevariable = $_GET["nomduchampdemonformulaire"];
pour une méthode POST:
$nomdevariable = $_POST["nomduchampdemonformulaire"];
4.3)la gestion des éléments d'un formulaire
Il est possible de lister l'ensemble des champs et valeur en provenance d'un formaire grâce au script suivant:
<html>
<body>
<?php
$parametres = ( isset( $HTTP_POST_VARS) ) ? $HTTP_POST_VARS : $HTTP_GET_VARS ;
foreach( $parametres as $nomchamp => $valeurchamp ) {
echo "valeur de $nomchamp : $valeurchamp <br>";
}
?>
</body>
</html>
BERNARD D.
Page 14/27
DEUST ISR
PHP/MYSQL
voici un exemple de récupération des données en provenance d'un formulaire incluant un élément select multiple:
<html>
<body>
<form action="listemul.php" method="post">
<select name="choix[ ]" multiple>
<option> CD
<option> CDR
<option> DVDR
<option> CDRW
</select>
<input type=submit value=go>
</form>
</body>
</html>
listemul.php
<html>
<body>
<?php
$i=1;
foreach( $choix as $valeurchoix ) {
echo "choix $i : $valeurchoix <br>";
$i++;
}
?>
</body>
</html>
Vous pouvez faire la même chose avec de checkbox:
<html>
<body>
<form action="listemul.php" method="post">
<input type=checkbox name="checkchoix[ ]" value="cd"> CD<br>
<input type=checkbox name="checkchoix[ ]" value="cdr"> CDR<br>
<input type=checkbox name="checkchoix[ ]" value="dvdr"> DVDR<br>
<input type=checkbox name="checkchoix[ ]" value="cdrw"> CDRW<br>
<input type=submit value=go>
</form>
</body>
</html>
listemul.php
<html>
<body>
<?php
$i=1;
foreach( $checkchoix as $valeurchoix ) {
echo "choix $i : $valeurchoix <br>";
$i++;
}
?>
</body>
</html>
Formulaire de téléchargement de fichier:
<html>
<body>
<form enctype="multipart/form-data" action="gestionupload.php" metho="post">
<input type="file" name="fupload">
<input type="submit" value="telechargement">
</form>
</body>
</html>
BERNARD D.
Page 15/27
DEUST ISR
PHP/MYSQL
Pour le téléchargement de fichier, il existe des variables globales:
ELEMENT
CONTIENT
$HTTP_POST_FILES[fupload][name] Nom du fichier
EXEMPLE
Toto.png
$HTTP_POST_FILES[fupload][size]
Taille du fichier
368
$HTTP_POST_FILES[fupload][type]
Type du fichier Image/png
gestionupload.php
<?php
$repertoire_destination="/lesuploads/"; // répertoire ou sera stoké le fichier
if ( isset(fupload)){
$repertoire_destination .=$HTTP_POST_FILES[fupload][name];
copy( $fupload, $repertoire_destination)
or die("Pb copy fichier");
}
?>
4.4)les sessions
Une façon de pouvoir conserver une variable d'une page à une autre est d'utiliser des variables de sessions.
Chaque visiteur accédant à votre page web se voit assigné un identifiant unique, appelé 'identifiant de session'. Il peut être
stocké soit dans un cookie, soit propagé dans l'URL.
Le support des sessions vous permet d'enregistrer un nombre illimité de variables qui doivent être préservées entre les requêtes.
Lorsqu'un visiteur accède à votre site, PHP va vérifier automatiquement (si session.auto_start est activé1) ou sur demande
(explicitement avec session_start() ou implicitement avec session_register()) si il existe une session du même nom. Si c'est le
cas, l'environnement précédemment sauvé sera recréé.
Exemple 1. Enregistrer une variable avec $_SESSION.
<?php
session_start();
// Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien
if (!isset($_SESSION['compteur'])) {
$_SESSION['compteur'] = 0;
}
else {
$_SESSION['compteur']++;
}
?>
Exemple 2. Retirer une variable de session avec $_SESSION et register_globals inactif.
<?php
session_start();
// Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien
unset($_SESSION['compteur']);
?>
Exemple 3. Retirer une variable de session avec $_SESSION et register_globals activé, après l'avoir enregistré avec
$_SESSION.
<?php
session_start();
// Avec PHP 4.3 et plus récent, vous pouvez simplement utiliser l'exemple précédent
session_unregister('compteur');
?>
BERNARD D.
Page 16/27
DEUST ISR
PHP/MYSQL
Exemple 4. Enregistrer une variable avec register_globals activé
<?php
?>
if (!session_is_registered('compteur')) {
session_register("compteur");
$compteur = 0;
}
else {
$compteur++;
}
4.5)les cookies
Une façon de pouvoir conserver des informations entre 2 connections à un site est de placer un petit fichier sur la machine
cliente. C'est le principe des cookies.
Il est possible de créer un cookie grâce à la fonction setcookie.
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])
setcookie() définit un cookie qui sera envoyé avec le reste des en-têtes. Les cookies doivent passer avant tout autre en-tête (c'est
une restriction des cookies, pas de PHP). Cela vous impose d'appeler cette fonction avant toute balise <HTML> ou <HEAD>.
Tous les arguments sauf name (nom) sont optionnels. Si seul le nom est présent, le cookie portant ce nom sera supprimé du
navigateur de l'internaute. Vous pouvez aussi utiliser une chaîne vide comme valeur, pour ignorer un argument. Le paramètre
expire est un timestamp UNIX, du même genre que celui retourné par time() ou mktime(). Le paramètre secure indique que le
cookie doit être uniquement transmis à travers une connexion HTTPS sécurisée.
Une fois que le cookie a été placé, il est accessible dans les variables globales $_COOKIE ou bien $HTTP_COOKIE_VARS
arrays. Notez que les autoglobales telles que $_COOKIE sont disponibles en PHP depuis la version 4.1.0.
$HTTP_COOKIE_VARS existe depuis PHP 3. Les valeurs de cookies existent aussi dans la variable $_REQUEST.
Erreurs communes :
• Les cookies ne seront accessibles qu'au chargement de la prochaine page, ou au rechargement de la page courante.
• Les cookies doivent être effacés avec les mêmes paramètres que ceux utilisés lors de leur création.
Exemple 1. Exemples avec setcookie()
<?php
setcookie("TestCookie","Valeur de test");
setcookie("TestCookie",$value,time()+3600); /* expire dans une heure */
setcookie("TestCookie",$value,time()+3600,"/~rasmus/",".utoronto.ca",1);
?>
Notez que la partie "valeur" du cookie sera automatiquement encodée URL lorsque vous envoyez le cookie et, lorsque vous le
recevez, il sera automatiquement décodé, et affecté à la variable du même nom que le cookie. Pour voir le résultat, essayez les
scripts suivants :
Exemple 2. Affectation des valeurs de cookie
<?php
// Afficher un cookie
echo $_COOKIE["TestCookie"];
echo $HTTP_COOKIE_VARS["TestCookie"];
// Une autre méthode pour afficher tous les cookies
print_r($_COOKIE);
?>
Lorsque vous effacez un cookie, vous devriez toujours vous assurer que sa date d'expiration est déjà passée, pour déclencher le
mécanisme de votre navigateur. Voici comment procéder :
BERNARD D.
Page 17/27
DEUST ISR
PHP/MYSQL
Exemple 3. Exemple d'effacement de cookies avec setcookie()
<?php
// utilisation de la date moins une heure
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".exemple.com", 1);
?>
Vous pouvez aussi utiliser les cookies avec des tableaux, en utilisant la notation des tableaux. Cela a pour effet de créer autant
de cookies que votre tableau a d'éléments, mais lorsque les cookies seront reçus par PHP, les valeurs seront placées dans un
tableau :
Exemple 4. Utilisation des tableaux avec setcookie()
<?php
setcookie( "cookie[three]", "cookiethree" );
setcookie( "cookie[two]", "cookietwo" );
setcookie( "cookie[one]", "cookieone" );
if ( isset( $cookie ) ) {
while( list( $name, $value ) = each( $cookie ) ) {
echo "$name == $value<br>\n";
}
}
?>
Note : Pour plus d'informations sur les cookies, voyez les spécifications de cookies de Netscape à
http://www.netscape.com/newsref/std/cookie_spec.html et RFC 2965.
Vous pourrez noter que le paramètre expire prend un timestamp unique, et non pas la date au format Jour, JJ-Mois-AAAA
HH:MM:SS GMT, car PHP fait la conversion en interne.
Microsoft Internet Explorer 4 utilisé avec le Service Pack 1 ne gère pas bien les cookies qui possèdent un paramètrepath.
Netscape Communicator 4.05 et Microsoft Internet Explorer 3.x semblent ne pas gérer correctement les cookies lorsquepath et
time ne sont pas fournis.
5)les fichiers
Pour alléger les scripts PHP, il est possible de placer les scripts contenant des fonctions, par exemple, dans un fichier, que l'on
va inclure dans un autre fichier php.
Cela se fait grâce à la fonction include();
Exemple:
desfonctions.php
<?php
function un(){
echo "un<br>";
}
function deux(){
echo "deux<br>";
}
function trois(){
echo "trois<br>";
}
?>
monscriptutilisateur.php
<?php
include("desfonctions.php");
echo "<html><body>";
un();
deux();
trois();
echo "</body></html>";
?>
BERNARD D.
Page 18/27
DEUST ISR
PHP/MYSQL
6)les images dynamiques
En php, il est possible de créer des image de façon dynamique.
Exemple:
img.php
<?php
header("Content-type: image/png");
$image = imagecreate( 200, 200);
imagepng($image);
?>
dynimage.html
<html>
<body>
<img src="img.php">
</body>
</html>
Cela va afficher une image vide de 200x200.
Pour créer une image avec un fond noir, et une phrase ecrite en bleu on peut écrire le code suivant:
<?php
header ("Content-type: image/png");
$im = @imagecreate (50, 100)
or die ("Impossible d'initialiser la librairie GD");
$background_color = imagecolorallocate ($im, 0, 0, 0);
$text_color = imagecolorallocate ($im, 0, 0, 255);
imagestring ($im, 1, 5, 5, "Juste du texte bleu", $text_color);
imagepng ($im);
?>
Il est possible de faire des rectangles, des arcs, des cercles, des polygones, etc.
Faite une recherche sur www.php.net avec commen mot clef imagecreate.
7)PHP/apache vs ASP/IIS
le "couple" apache/PHP n'est pas le seul utilisé pour le développement de site WEB dynamique.
Il existe un autre "couple" célèbre, il s'agit de IIS/ASP.
IIS : Internal Internet Server
ASP : Active Server Page
Ses deux produits sont développés et diffusés par Microsoft.
Si au début de PHP, il n'y avait aucune comparaison possible entre les 2 produits, ce n'est aujourd'hui, plus le cas.
En effet, chacun offre à présent à peu de choses près les mêmes fonctionnalités.
Même si Microsoft propose un environnement de développement plus élaboré grâce, entre autres, à son visual interdev
De plus en plus de sociétés de développement WEB se tournent vers la solution alternative apache/PHP.
La principale raison de cette tendance est, évidemment, financière, car le coût des licences microsoft n'est pas gratuit (licence
windows server, licence outils de développement, licence IIS, licence SQL server, etc.).
BERNARD D.
Page 19/27
DEUST ISR
PHP/MYSQL
8)Conclusion
Pour résumer, le langage PHP est une bonne alternative aux scripts CGI, tant qu'il n'est pas question d'accéder à des
périphériques de la machine serveur(imprimante, caméra, etc.).
Tous les jours, la communauté internet met à disposition des fonctions, ou des modules permettant de simplifier encore
davantage certaines tâches.
Si l'on s'aperçoit que le langage par lui-même n'est pas très compliqué à utiliser, il s'avère que la difficulté
réside désormais plus dans l'architecture et l'agencement des pages d'un site WEB, plutôt que dans la complexité du langage.
Une fois que l'on sait ce que nous voulons dire, et sous quelle forme, le développement technique d'un site WEB est bien plus
simple.
Le développement d'un site WEB n'est pas que l'affaire de technicien.
Pour réaliser un bon site WEB, il faut des infographistes, des commerciaux, des chefs de projet, des informaticiens, et surtout,
des personnes qui ont des choses à faire passer (information, produit -> site marchand, etc.) sur le WEB.
Le langage PHP est toujours en évolution et déjà une version 5 pointe le bout de son nez.
Mais le langage de programmation dynamique serait bien moins attrayant s'il ne permettait pas d'utiliser une source
considérable d'information que sont les bases de données.
BERNARD D.
Page 20/27
DEUST ISR
PHP/MYSQL
MYSQL
9)définition d'une base de données
Une base de données est un ensemble de fichiers partagés par des utilisateurs et exploité par des programmes.
Une base de données contient des informations représentant des objets du monde extérieur ainsi que des relations entre ces
objets.
Exemple:
• Les informations contenues représentent une réalité extérieure au système.
Listes d’adresses, Pièces, Lieu de stockage…
• Plusieurs utilisateurs peuvent partager ces fichiers avec des préoccupations différentes.
Statistiques, Gestion de stock, Prise de commandes…
• Les applications ne sont pas indépendantes.
Elles appartiennent en général à la même entité (entreprise).
10)structure d'une base de données
Utilisateurs
Programme
d’application A
Programme
d’application B
Programme
d’application C
Niveau Externe
Programmeurs d’applications
Niveau
conceptuel
Modèle de données principal
Administrateurs
Niveau physique
Archivage des données
10.1)Fonctions principales:
10.1.1)Description de la base
La description de la base (modèle de données) est réalisée par un langage de définition de données LDD.
10.1.2)Manipulation de la base
Les manipulations de la base (accès, mise à jour) s’effectue à l’aide d’un langage de manipulation de donnée LDM.
L’utilisation courante de la base se fait par intermédiaire du LDM soit sous forme de requêtes soit par un ensemble de requêtes
regroupé dans un sous programme.
BERNARD D.
Page 21/27
DEUST ISR
PHP/MYSQL
10.1.3)Protection d’accès
Un langage de contrôle de données LDC permet de définir des permissions au niveau des utilisateurs de la base de données.
10.2)Objectifs
•
•
•
Utilisation d’une approche commune pour accéder aux données
Éviter la redondance d’informations
Fiabilité
• Cohérence de l’information
• Confidentialité
• Ne pas perdre d’informations
10.3)Composantes de la base:
•
•
Des Tables
Des champs
Des clés
Des relations
Les données sont placées dans des tables.
Les tables sont composées de :
• Colonnes (champs) spécifiant les attributs.
• Lignes (rangées) spécifiant les valeurs de ces attributs.
Exemple:
CLIENTS
NumClient
Nom
Ville
1
bernard Le mans
2
durand
paris
3
bidochon
evaille
Une clé détermine une rangée d’une table de manière unique
Une clé peut être un simple champ ou plusieurs champs :
• Numéro de client (table clients)
• Numéro INSEE
• Numéro de client + date commande (table commandes)
10.4)Forme canonique d'une base:
CLIENTS(NumClient, Nom, Ville)
les colonnes de la clé primaire sont soulignées.
COMMANDES({NumClient},{NumPiece},Quantite)
Les clés étrangères sont entre accolades.
Les clés étrangères sont les colonnes du tableau qui sont membres de la clé primaire dans un autre tableau.
COMMANDES
{NumClient} {Numpieces} Quantite
1
2
3
2
1
1
2
2
5
BERNARD D.
Page 22/27
DEUST ISR
PHP/MYSQL
10.5)Les relations:
CLIENTS
COMMANDES
NumClient
Nom
Ville
NumClient Numpieces Quantite
1
bernard Le mans
1
2
3
2
durand
paris
2
1
1
3
bidochon
evaille
2
2
5
PIECES
Numpieces
Description
Prix
1
Un crayon
1
2
Un dvdR
10
3
4
Un clavier USB 11
Ecran plat
150
IL y à des relations entre les tables.
Grâce à la table COMMANDE, il est possible de savoir que Monsieur durand a commander 5 DVDR à 10 €.
11)le langage SQL
Afin de pouvoir manipuler les bases de données facilement, on utilise un langage de requêtes nomméSQL(Structured Query
Language).
11.1)Les types de données:
Type de données: CHAR(n)
• chaîne de caractères de longueur fixe n
• longueur par défaut 1
• longueur minimum 1,longueur maximum 255
• constantes:
‘DUPONT’
‘Dupont, Marc’
‘Titre “Coucou”’
‘1234’
‘NULL’
Type de données: VARCHAR(n)
•
•
•
•
•
+/- équivalent a VARCHAR2(n)
chaîne de caractères de longueur variable et de taille maximum n
uniquement sur Oracle/MySQL sinon CHAR VARYING(n)
valeur de n maximum = 2000 caractères sur Oracle
constantes identiques a CHAR(n)
BERNARD D.
Page 23/27
DEUST ISR
PHP/MYSQL
Type de données: NUMBER(p)
•
•
•
En MySQL NUMERIC(p,0)
nombre entier positif, négatif ou nul de p chiffres
constantes:
0
+0
+1234
-123123
1234
Type de données: NUMBER(p,s)
•
•
nombre rationnel en virgule fixe de p chiffres au total dont s après la virgule
constantes de type NUMBER(4,1):
0,0
123,5
-123,7
-3,0
•
•
d'après la configuration, il faut utiliser ‘.’ ou ‘,’ !
certains SQL dont MySQL utilisent NUMERIC(p,s)
Type de données: LONG
•
•
chaîne de caractères de taille variable jusqu'à 2 Gbytes
limité à un seul attribut par table
Type de données: DATE
•
•
date (siècle, année, mois, jour, heure, minute, seconde)
constantes (format OSI aaaa-mm-jj)
‘2000-09-06 ’
‘1999-02-30’ pas correct !
SYSDATE => date et heure actuelle
• l'arithmétique fonctionne sur les dates:
‘2000/09/06’ - ‘2000/09/05’ => 1
‘2000/09/07’ + 10 => ‘2000/09/17’
Type de données: NULL
• la valeur NULL est spéciale
NULL appartient à tous les domaines: CHAR, LONG, NUMBER, …
signifie que la ligne n’a pas de valeur pour cet attribut
• ne pas confondre avec
‘‘
0
0.0
11.2)Créer une table:
CREATE TABLE s_dept
(id NUMERIC(7,0) ,
name VARCHAR(25) ,
region_id NUMERIC(7,0) ) ;
• une instruction SQL peut être sur plusieurs lignes
• une instruction SQL est toujours terminee par ‘;’
• remarque les exemples sont donnés pour Oracle, la syntaxe et l ’affichage de MySQL sont légèrement différents
• crée la table correspondant a S_DEPT(id, name, region_id)
• attention la clé primaire n ’est pas encore définie
BERNARD D.
Page 24/27
DEUST ISR
PHP/MYSQL
11.3)Effacer une table:
DROP TABLE NomDeLaTable ;
11.4)Recherche, ajout, modification, suppression des données
d'une table:
11.4.1)Ajout:
INSERT INTO s_dept VALUES (10, 'Finance', 1);
où si toutes les colonnes ne sont pas spécifiées (les colonnes non spécifiées auront NULL comme valeur):
INSERT INTO s_dept(name,id) VALUES ('Finance', 10);
11.4.2)Recherche:
SELECT est composée des clauses
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
;
• les clauses doivent TOUJOURS respecter cet ordre
• seules les clauses SELECT et FROM sont obligatoires
• liste la(les) colonne(s) à afficher
exemple: select id from s_dept;
recherche toutes les valeurs du champ id de la table s_dept.
• un ‘*’ indique que toutes les colonnes sont à afficher
select * from s_dept;
recherche toutes les valeurs de tous les champs de la table s_dept
Clause WHERE
(en option)
permet de définir l’ensemble des conditions auxquelles doivent satisfaire les lignes du tableau résultant
select nom, prenom
from user
where dept = 72 ;
affiche tous noms et prenoms des personnes présente dans la table user et résidant dans le département 72.
La clause ORDER BY
permet de présenter le tableau avec des lignes triées
par défaut, le tri est effectué en ordre ascendant
le tri est effectué en ordre descendant pour les attributs suivis de DESC
si plusieurs attributs figurent après ORDER BY, le tri est effectué prioritairement sur le premier attribut, puis le second, …
Conditions: comparaison simple
=, <, <=, >, >=, <>, !=
valables pour NUMBER, CHAR, VARCHAR, DATE
valent NULL si un des termes de la comparaison est NULL
pour CHAR et VARCHAR, SQL tient en compte les majuscules et minuscules !
BERNARD D.
Page 25/27
DEUST ISR
PHP/MYSQL
Opérateurs logiques: priorité
les opérateurs logiques peuvent être combinés entre eux !
ordre de priorité
NOT
AND
OR
emploi de parenthèses possibles pour changer l’ordre d'évaluation
11.4.3)Modifier des données d'une table:
Instruction UPDATE
consiste en trois clauses:
UPDATE
SET
WHERE
seules UPDATE et SET sont nécessaires
attention, sans WHERE toutes les lignes de la table sont modifiées!
UPDATE nom-table
SET attribut1=expression1, attribut2=expression2
WHERE condition
update s_emp set salary=salary*1.1 ;
Va augmenter tous les salaires de 10% .
11.4.4)Supprimer des données d'une table:
Instruction DELETE FROM
DELETE FROM nom-table
WHERE condition
La clause WHERE est optionnelle mais sans elle toutes les lignes sont effacées!
12)Fonctions PHP pour la base de données MYSQL
Grâce au langage PHP et SQL, certaines fonctions en PHP permettent d'accéder facilement à une base de données.
Pour une question pratique, nous verrons les fonctions permettant de manipuler une base de données nommée MYSQL, mais le
principe reste le même pour d'autres base de données.
Exemple:
Nous avons une base de données qui s'appelle MABASE. Cette base de données se trouve sur un serveur qui posède l'adresse
IP 192.9.200.7 .
Elle contient 2 tables:
USER
LOGIN
PASSWORD
dbernard motdepasse
rbidochon raymonde
ADRESSE
LOGIN
RUE
dbernard 13 rue du vide
VILLE
TEL
Le mans 72000 "02 43 02 43 02"
rbidochon 5 impasse du litron lyons
BERNARD D.
CP
69000 "05 04 03 01 00"
Page 26/27
DEUST ISR
PHP/MYSQL
Ecrivons un code PHP qui va afficher la liste des login et des mots de passe des personnes présentes dans la table USER.
<html>
<body>
<?php
$db = "MABASE"; // nom de la base
$connection = mysql_connect("192.9.200.7", "root", "tropdurelemotdepasse");
// je me connecte au serveur de base de données qui est en 192.9.200.7,
// en tant qu'utilisateur de la base ayant pour login root
// et pour mot de passe tropdurelemotdepasse
if (!$connection)
// la connexion est refusee j'arrête le script
die ("connexion au serveur de base de donnees
refusee");
mysql_select_db($db, $connection) // choix de la base de données
or die ("acces au la base de donnee $db refusee");
$requete = "select login, password from USER;"; // la requete
$result = mysql_query($requete,$connection); // envois de la requete au serveur
if (!$result)
// s'il y a un probleme on s'arrête.
die("probleme d'acces à la table user");
$nbligne = mysql_num_rows($result);
//nbligne prend le nombre de login correspondant
// a la requete
if ($nbligne==0)
echo "il n'y a aucun utilisateur";
// affichage de la liste des logins
for ($i=0;$i<$nbligne;$i++){
$tab=mysql_fetch_array($result); // tab est un tableau qui recupere les
// champs login et password du resultat
// de la requete
// avec tab[login] -> valeur du login
(on peut ecrire aussi tab[0])
// tab[password] -> valeur du mot de passe associe (on peut ecrire aussi tab[1])
echo "login :".$tab[0]."<br>";
echo "mot de passe :".$tab[password]."<br>";
}
mysql_close($connection);
?>
</body>
</html>
13)Conclusion
Quelle que soit la base de données, il faudra toujours passer par les phases de connection et de choix d'une base avant de
pouvoir faire des requêtes SQL sur celle-ci via PHP.
Le couple MYSQL/PHP est très utilisé sur le WEB, et il existe bien d'autre fonctions, liées à la manipulation de cette base de
données par php, que nous n'avons pas listées ici.
Pour plus d'information, allez voir le site www.php.net.
BERNARD D.
Page 27/27