Réponse AJAX
Introduction au PHP
Généralités
A la base, les serveurs HTTP (Apache, IIS, etc.) ne savent pas interpréter le PHP. Pour que cela marche, il faut leur ajouter le module adéquat. WAMP, ainsi que les autres suites logicielles semblables, ajoute automatiquement cette extension.
Le PHP est exécuté côté serveur, seul le résultat est envoyé au navigateur. Les navigateurs ne savent donc pas exécuter le PHP, et ne sont pas censés en recevoir.
Le PHP permettra, dans un site : d'utilier une base de données (pour stocker les utilisateurs, des messages, etc.), d'envoyer des courriers électroniques, etc. Ces choses sont impossibles en HTML/CSS.
Une page PHP contient par défaut du HTML, elle doit donc commencer par les balises
<html><head>.... Toutefois, on a la possibilité
de basculer du HTML au PHP, et inversement, grâce aux balises suivantes
:
(code HTML) <?PHP (instructions PHP) ?>
(code HTML)
Ma page PHP ne s'éxécute pas ? La liste des erreurs possible..
Les erreurs les plus fréquentes sont :
- Votre URL commence par file:// au lieu de http:// : dans ce cas, c'est Windows qui prend en charge la requête du naviateur (au lieu de Apache). Windows ne sait pas exécuter le PHP, d'où le problème.
- Votre fichier porte l'extension .html au lieu de .php : par défaut, Apache ne cherche à interpréter le PHP que dans les fichiers portant l'extension .php ou .php3. Ceci est modifiable dans httpf.conf (fichier de configuration de Apache).
- Votre fichier ne se trouve pas dans la racine des pages Web de Apache : par défaut, Apache va chercher les pages Web dans sa racine Web, qui est souvent c:\wamp\www ou c:\Program Files\Apache Software Fundation\Apache2.2\htdocs.
- Dans votre fichier PHP, vous avez oublié la balise <?php qui permet de basculer du HTML au PHP.
D'autres erreurs possibles :
- Apache n'est pas démarré sur votre serveur.
- Vous n'avez pas ajouté l'extension PHP à Apache (ceci ne peut pas arriver si vous avez installé une suite logicielle telle que WAMP, EasyPHP, etc.).
- Votre fichier PHP contient des erreurs, mais PHP est configuré pour ne pas les afficher à l'écran. Alors, rien ne se passe.
L'affichage avec echo
- Tapez le code ci-dessus dans le bloc-note
- sauvez-le à la racine du serveur Internet (cf. paragraphe 1), avec
l'extension .php, par exemple test.php.
- Ouvrez-le dans un navigateur, avec l'adresse http://127.0.0.1/test.php.
Le résultat est le suivant :
Vous remarquez dans cet exemple :
- la présence des balises HTML <html>,
<head>
et <body>
car une page PHP contient, avant tout, du HTML.
- la balise pour basculer du HTML au PHP : <?PHP
- l'instruction PHP echo
qui sert à afficher quelque chose dans le navigateur, elle sera très
utilisée.
Récupération des données de formulaires
Tapez les codes suivants dans le bloc-note, et sauvez-les dans deux fichiers
respectifs à la racine du serveur Internet.
fichier formulaire.html
|
fichier validation.php
|
<html><head></head><body>
<form action=validation.php>
<input
type=text name=ma_zone_de_texte>
<br>
<input type=submit>
</form>
</body></html>
|
<html><head></head><body>
<?php
echo "Vous avez saisi : ";
echo $_GET["ma_zone_de_texte"];
?>
</body></html> |
 |
 |
Vous remarquez que :
- Dans le fichier formulaire.html,
on a une zone de texte (<input
type=texte ...>), et elle a été nommée
ma_zone_de_texte (name=ma_zone_de_texte).
Ce nom est très important car il va resservir en PHP.
- Dans ce même fichier, c'est l'attribut action
de la balise form
(<form action=validation.php>)
qui indique quelle est la page qui va traiter le formulaire. C'est cette page
qui va être automatiquement appelée quand l'utilisateur va valider
le formulaire.
- En PHP dans le fichier validation.php,
on accède au contenu de la zone de texte grâce à $_GET["ma_zone_de_texte"].
Les variables et les expressions de base
Utilisation |
Explication |
$a |
Une variable en PHP est précédée du
signe $. |
$a = 5 ; |
On affecte 5 à la variable $a.
$a vaut 5. |
$a = $b = 4; |
On affecte 4 à la variable b.
Le résultat de cette affectation, qui a pour valeur 4, est affecté
à la variable a.
$a et $b valent 4.
|
$a = $a + 1;
$a++; |
On ajoute 1 à la valeur de la variable a. |
$a = $a - 1;
$a--; |
On enlève 1 à la valeur de la variable a. |
La structure conditionnelle : if ... else
- if fait
partie des "structure de contrôle". C'est une structure alternative,
permettant d'exécuter une instruction, ou pas, en fonction d'une condition
donnée.
- En PHP, elle peut prendre les formes suivante :
Utilisation |
Explication |
if (condition)
instruction
; |
Si la condition est vérifiée, alors l'instruction
est exécutée. Sinon, l'instruction n'est pas exécutée. |
if (condition)
{
instruction1
;
instruction2
;
...
} |
Si la condition est vérifiée, le bloc d'instructions
est exécuté (c'est à dires les instructions 1 et
2). Sinon, rien n'est exécuté. En règle générale,
quand un bloc d'instruction dépend d'une structure de contrôle
(conditionelle ou boucle), il doit être entre accolade. |
if (condition)
instruction1
;
else
instruction2
; |
Si la condition est vérifiée, l'instruction1
est excécutée. Sinon (si la condition n'est pas vérifiée),
alors l'instruction2 est exécutée. |
if (condition1)
instruction1
;
elseif (condition2)
instruction2
;
else
instruction3
; |
Si la condition1 est vérifiée, l'instruction1
est exécutée et on quitte la structure alternative.
Sinon, on évalue la condition2. Si elle est vérifiée,
on exécute instruction2 et on quitte la structure alternative.
Si aucune des conditions n'est vérifiée, on exécute
instruction3.
On peut mettre autant de elseif que l'on veut. |
- Voici des exemples de conditions :
Condition |
Explication |
if ($variable)
if (true)
if (false) |
La condition doit être une expression de type booléen.
Bien que true et false marchent, il y a peu d'intérêt
à les utiliser tels quels. Par contre on utilisera parfois une
variable de type booléen. |
if
($a > $b) |
Les opérateurs de comparaison renvoient une valeur booléenne.
Ils sont les suivants :
$a > $b ; $a < $b
$a >= $b ; $a <= $b
$a == $b ; $a >= $b
|
if
($a > $b && $c < $d)
if ($a > $b || $c < $d)
if (!($a > $b)) |
On peut combiner les valeurs booléennes grâce
aux opérateurs dits "binaires" (qui fonctionnent sur
les valeurs booléennes). Ils sont les suivants : && (et),
|| (ou), ! (non). |
if
(isset($a)) |
On peut utiliser les fonctions qui renvoient des valeurs
booléennes. Elles sont très nombreuses et très
utiles, et on peut facilement fabriquer nos propres fonctions. |
- Exemple de traitement : l'utilisateur a saisi deux valeurs $a et $b, on
veut voir si elles sont numérique et comprises entre 0 et 100, puis
on affiche la somme.
if (!is_numeric($a))
echo "a n'est pas une valeur numérique";
elseif (!is_numeric($b))
echo "b n'est pas une valeur numérique";
elseif ($a < 0 || $a > 100 || $b < 0 || $b > 100)
echo "a ou b n'est pas compris dans l'intervalle autorisé
(0 à 100)";
else
echo "La somme de a et b est : ".($a + $b);
- Exemple 2 : la fonction isset
permet de savoir si une variable a été déclarée,
et ainsi de savoir si un formulaire a été validé. Par
exemple :
<form>
<input name=texte1>
<input name=texte2>
<input type=submit>
</form>
<?php
if (isset($_GET["texte1"])
echo "Le formulaire a été validé
et peut être traité : texte1 et texte2 sont connus";
?>
- Exemple 2 : la fonction isset
permet de savoir si une case à cocher, dans un formulaire HTML, a été
cochée ou non. Par exemple :
<form>
<input type=checkbox name=ma_checkbox>
<input type=submit>
</form>
<?php
if (isset($_GET["ma_checkbox"]))
echo "La case a été cochée";
else
echo "La case n'a pas été cochée";
?>
- La documentation officielle (fr.php.net) : if,
else,
elseif,
(sommaire).
La structure de boucle while
- while fait
partie des "structure de contrôle". C'est une structure itérative,
permettant d'exécuter une instruction (ou un bloc d'instruction), zéro
ou plusieurs fois, en fonction d'une condition donnée.
- La documentation officielle (fr.php.net) : while,
do-while.
- Exemple 1 : boucler 5 fois, avec une variable $compteur
qui varie de 1 à 5, et qu'on affiche dans la boucle :
Code |
Résultat |
<?php
$compteur = 1;
echo "Avant la boucle, \$compteur vaut $compteur<br>";
while ($compteur <= 5)
{
echo "Pendant la boucle, \$compteur vaut
$compteur<br>";
$compteur++;
}
echo "Après la boucle, \$compteur vaut $compteur<br>";
?> |
Avant la boucle,
$compteur vaut 1
Pendant la boucle, $compteur vaut 1
Pendant la boucle, $compteur vaut 2
Pendant la boucle, $compteur vaut 3
Pendant la boucle, $compteur vaut 4
Pendant la boucle, $compteur vaut 5
Après la boucle, $compteur vaut 6 |
- Do-while
diffère dans la mesure où le contenu de la boucle est toujours
exécuté au moins une fois, ce qui est moins souvent utile.
- Voici le code équivalent au while
ci-dessus :
Code |
Résultat |
<?php
$compteur = 1;
echo "Avant la boucle, \$compteur vaut $compteur<br>";
do
{
echo "Pendant la boucle, \$compteur vaut
$compteur<br>";
$compteur++;
}while ($compteur <= 5);
echo "Après la boucle, \$compteur vaut $compteur<br>";
?> |
Avant la boucle,
$compteur vaut 1
Pendant la boucle, $compteur vaut 1
Pendant la boucle, $compteur vaut 2
Pendant la boucle, $compteur vaut 3
Pendant la boucle, $compteur vaut 4
Pendant la boucle, $compteur vaut 5
Après la boucle, $compteur vaut 6 |
La structure de boucle for
- La documentation officielle (fr.php.net) : for,
foreach.
- La boucle for,
très puissante, fonctionne de la façon suivante :
Fonctionnement du for |
Equivalent avec while |
for (instruction
de départ
;
condition pour rester dans
la boucle ;
instruction de boucle)
{
...
} |
instruction de départ
;
while (condition pour rester dans la boucle)
{
...
instruction de fin de boucle
;
} |
Exemple avec un compteur $i allant de
1 à 5 |
for ($i=1 ; $i
<= 5 ; $i++)
{
...
} |
$i = 1;
while ($i <= 5)
{
...
$i++;
}
|
Exemple avec un compteur $i allant de
10 à 1 |
for ($i=10 ;
$i >= 1 ; $i--)
{
...
} |
$i = 10;
while ($i >= 1)
{
...
$i--;
}
|
Exemple avec un compteur $i allant de
0 à 10 par pas de 2. |
for ($i=0 ; $i
<= 10 ; $i+=2)
{
...
} |
$i = 0;
while ($i <= 10)
{
...
$i+=2;
}
|
- Exercices d'application :
- afficher la table de multiplication.
- calculer une factorielle n!.
- calculer une puissance xn.
- Tester si un entier est premier ou pas.
- Démonstration : groupes de contrôles en VB, tableau de contrôle
en HTML.
- Syntaxes :
- Syntaxe à crochet :
$mon_tableau[1]
= "Bonjour" ;
$mon_tableau[2] = "Hello" ;
$mon_tableau[3] = "Bom dia" ;
$mon_tableau[4] = "Bon jorno" ;
- Syntaxe utilisant la fonction array()
qui renvoie un tableau :
$mon_tableau = array("Bonjour",
"Hello", "Bom dia", "Bon jorno", "Guten
Tag", "Buenos dias");
- Syntaxe à crochet, pour les tableaux associatifs (l'indice peut
être autre chose qu'un nombre) :
$tab_formule_bonjour["français"]
= "Bonjour" ;
$tab_formule_bonjour["anglais"] = "Hello" ;
$tab_formule_bonjour["allemand"] = "Guten Tag" ;
$langue_visiteur = "allemand" ;
echo $tab_formule_bonjour[$langue_visiteur];
- Syntaxe utilisant la fonction array()
pour créer un tableau associatif :
$tab_formule_bonjour = array("français" => "Bonjour",
"anglais" => "Hello", "allemand" =>
"Guten Tag");
$langue_visiteur = "allemand" ;
echo $tab_formule_bonjour[$langue_visiteur];
- Exemple de parcours d'un tableau avec foreach
:
foreach ($tab_formule_bonjour
as $formule_bonjour)
echo "$formule_bonjour<br>";
- Exemple de parcours d'un tableau associatif avec foreach
:
foreach ($tab_formule_bonjour
as $langue => $formule_bonjour)
echo "En $langue, 'bonjour' se dit '$formule_bonjour'.<br>";
- Exemple de parcours d'un tableau avec for
:
for ($i=0; $i < 5; $i++)
echo $tab_formule_bonjour[$i]."<br>";
- Exemple d'initialisation à zéro des valeurs d'un tableau :
for ($i=0; $i < 5;
$i++)
$mon_tableau[$i] = 0;
- Exemple de remplissage d'un tableau avec des valeurs aléatoires entre
0 et 100 :
for ($i = 0 ; $i <=
3 ; $i++)
$tab[$i] = rand(0, 100);
- Connaître le nombre de valeurs dans un tableau (count)
:
echo count($tab);
- Trier un tableau grâce à l'algorithme du tri
à bulles :
<?php // TRI du tableau $tab
do
{
$permutation=false;
for ($i = 0; $i < count($tab) - 1; $i++)
if ($tab[$i] < $tab[$i+1])
{
$inter = $tab[$i];
$tab[$i] = $tab[$i+1];
$tab[$i+1] = $inter;
$permutation = true;
}
}while($permutation);
?>
- Exercices d'application :
- Est-ce qu'un élément existe dans un tableau ?
- Chercher le maximum dans un tableau
- Faire la moyenne des valeurs dans un tableau
- Inverser un tableau
- Calcul des nombres premiers par la méthode d'Eratosthene
Accès aux bases de données MySQL en lecture
- Connexion à la base de données (mysql_connect)
et sélection de la base de données (mysql_select_db)
:
mysql_connect ("serveur",
"utilisateur", "mot de passe") or die("Erreur à
la connexion");
mysql_select_db ("nom de la base") or die("Erreur à
la sélection de la base");
Remarque : vous devez remplacer par vos propres
valeurs : "serveur", "utilisateur", "mot de passe"
et "nom de la base".
- Récupération d'un jeu d'enregistrements dans une variable
avec mysqli_myquery
:
$rs_users = mysqli_myquery("select
* from user");
Remarque : $rs_users
est une variable PHP qui contient un jeu d'enregistrements, c'est à
dire plusieurs lignes (ou une, ou zéro) de la table user. Dans
notre exemple, $rs_users contient plusieurs utilisateurs.
- Affichage du jeu d'enregistrements, grâce à une boucle while
et mysqli_fetch_array
:
while ($user = mysqli_fetch_array($rs_users))
{
echo $user["usr_name"]."<br>";
}
Remarques :
- mysqli_fetch_array
prend l'enregistrement courant pour le mettre dans la variable $user.
$user ne contient donc qu'un seul utilisateur.
- Quand il n'y a plus d'enregistrement, mysqli_fetch_array
renvoie la valeur false (ce qui nous permet de terminer automatiquement
la boucle while).
Accès aux bases de données MySQL en insertion
- Connexion au serveur de bases de données (mysql_connect)
et sélection de la base de données (mysql_select_db)
:
mysql_connect ("serveur",
"utilisateur", "mot de passe") or die("Erreur à
la connexion");
mysql_select_db ("nom de la base") or die("Erreur à
la sélection de la base");
Remarque : vous devez remplacer par vos propres
valeurs : "serveur", "utilisateur", "mot de passe"
et "nom de la base".
- Exécution de la requête d'insertion :
mysqli_myquery("insert
into nom_table values (null, 18.5, 'alpha', \"l'autre\", 1261440000,
'2008-01-15', 1, 0);
- null
: sous MySQL, convient pour qu'un numéro automatique soit géré
automatiquement.
- 18.5
: les valeurs numériques sont insérable facilement. Le séparateur
de décimale est le point, et surtout pas la virgule. Si un champ
est numérique et que vous entourez la valeur par des guillemets
(simples ou doubles), cela générera une erreur.
- 'coucou'
: les valeurs de type chaîne de caractères doivent être
entourées de guillemets (simples ou doubles).
- \"l'autre\"
: Si la valeur elle-même est susceptible de contenir un guillemet
simple, il faut l'entourer de guillemets doubles, qu'on doit alors échapper
grâce à l'anti-slashe.
- '2008-01-15'
: les dates au format DATE sont entourées de guillemets, en notation
américaine (AAAA-MM-JJ)
- 1261445148
: les dates au format TIMESTAMP (nombre de secondes écoulées
depuis le 1 janvier 1970 00h00) sont des champs numériques.
- 0 et 1
: le type booléen n'existant pas sous MySQL, on le représente
généralement grâce aux valeurs 0 (pour faux),
et 1 (pour vrai). Techniquement, tous les outils (langages et SGBDR)
considèrent que 0 représente la valeur faux, et toutes
les autres valeurs numériques représentent la valeur vrai.
- Votre requête ne marche pas, comment diagnostiquer l'erreur ?
- Pour être sûr que l'erreur vient de telle ou telle requête,
rajouter la gestion d'erreur or
die()
:
mysqli_myquery("...")
or die("Erreur dans la requête n°1");
- Pour afficher des informations plus précises sur l'erreur SQL,
utilisez :
mysqli_myquery("...")
or die("Erreur n°".mysql_errno()." : ".mysql_error());
- Affichez la requête pour la regardez droit dans les yeux. Si vous
ne trouvez pas l'erreur visuellement, faites-en un copier/coller pour
la tester directement sous PHPMyAdmin :
$sql = "INSERT
... ";
mysqli_myquery($sql) or die("La requête qui foire est : $sql<br>");
- Gestion d'erreur ultime :
$sql = "...";
mysqli_myquery($sql)
or die("<font color=red>Erreur MySQL n°<b>".mysql_errno()."</b>
: ".mysql_error()." dans la requête :</font><br><b>$sql</b><br>");
- Votre requête ne marche pas, quelles sont les erreurs les plus courantes
?
- Vous n'êtes pas connecté à la base ou n'avez pas
sélectionné la table. Le cas échéant, rajoutez
une gestion d'erreur or
die()
sur les fonction mysql_connect
et mysql_select_db.
- Dans la requête insert,
vous avez mal orthographié le nom de la table ou des champs.
- Un champ alphanumérique entouré de quote contient une
quote : values ('l'autre').
- Un champ alphanumérique entouré de guillemets contient
un guillemet : values
("pas de "tchi-tchi" en cours"). Protégez
vos valeurs avec addslashes,
qui échappe automatiquement les guillemets.
- Un champ ne contient pas de valeur : values
(1, ,2).
- Le nombre de valeurs insérées ne correspond pas au nombre
de champs.
- Non respect de l'intégrité de la base, par exemple doublon
dans la clé primaire.
- Vous essayez d'insérer une date sans guillemets : values
(2008-01-15).
- Quelques insertions fréquentes et délicates :
- $ma_variable
de type chaîne de caractères est susceptible de contenir
des guillemets, comment faire ?
mysqli_myquery("insert
into ma_table
values ('".addslashes($ma_variable)."')");
- $ma_variable
est de type booléen, comment l'insérer dans un champ booléen/numérique
(voir doc sur l'opérateur ?:)?
mysqli_myquery("insert
into ma_table
values (".($ma_variable?1:0).")");
- Comment insérer la date courante dans un champ de type TIMESTAMP
?
mysqli_myquery("insert
into ma_table
values (".time().")");
- Comment insérer la date courante dans un champ de type DATE
?
mysqli_myquery("insert
into ma_table
values ('".date("Y-m-d", time())."')");
Page canevas-type pour ajout/edition/suppression
Gestion des clients<br>
<?php
mysql_connect("127.0.0.1", "root", "abcd");
mysql_select_db("spastore_db");
// Traitement de la suppression d'un client
if (isset($_GET["supp"]))
mysqli_myquery("DELETE from ma_table where client_id = {$_GET["supp"]};");
// Traitement du formulaire d'édition et d'ajout
if (isset($_POST["form_nom"]))
{
$nom = $_POST["form_nom"];
$mel = $_POST["form_mel"];
$id = $_POST["form_id"];
if ($id)
$sql = "UPDATE ma_table SET client_nom = '$nom', client_mel = '$mel'
WHERE client_id = $id;";
else
$sql = "INSERT INTO ma_table VALUES(null, '$nom', '$mel')";
mysqli_myquery($sql) or die("Erreur n".mysql_errno()." dans la requte $sql :<br>".mysql_error());
}
// Formulaire unifié d'édition (d'un client existant) et d'ajout (d'un nouveau client)
if (isset($_GET["edit"]))
{
if ($_GET["edit"])
{
$client_edit = mysqli_fetch_array(mysqli_myquery("select * from ma_table where client_id = {$_GET["edit"]}"));
$nom = $client_edit["client_nom"];
$mel = $client_edit["client_mel"];
$id = $_GET["edit"];
$message_bouton = "Modifier";
}
else
{
$nom = "";
$mel= "";
$id= "0";
$message_bouton = "Ajouter";
}
echo "<form action={$_SERVER["PHP_SELF"]} method=post>";
echo "nom : <input type=text name=form_nom value='$nom'><br>";
echo "ml : <input type=text name=form_mel value='$mel'><br>";
echo "<input type=hidden name=form_id value=$id>";
echo "<input type=submit value=$message_bouton>";
echo "</form>";
}
// affichage du contenu de la table
$rs_clients = mysqli_myquery("select * from ma_table;");
while ($client = mysqli_fetch_array($rs_clients))
{
echo "{$client["client_nom"]} {$client["client_mel"]} ";
echo "<a href='?supp={$client["client_id"]}'>supprimer</a> ";
echo "<a href='?edit={$client["client_id"]}'>editer</a><br>";
}
echo "<a href='?edit=0'>Ajouter</a><br>";
?>
La fonction 'include'
http://fr.php.net/manual/fr/function.include.php
Les cookies
- Un cookie est une information, comparable à une variable, déposée
par une page en PHP. Cette information est relisible dans n'importe quelle
page du même site, cela permet donc de partager des données,
des informations communes, entre différentes pages d'un même
site.
- Les cookies déposés lors de la navigation avec Internet Explorer
sont stockés dans (montrer) :
C:\Documents and Settings\username\Cookies
- Les cookies sont déposés grâce à la fonction
PHP setcookie
:
setcookie (nom_cookie,
valeur,
durée,
...) ;
- nom_cookie
: le nom du cookie, pour le rappeler ultérieurement avec : $_COOKIE["nom_cookie"]
- valeur :
sa valeur. Un cookie étant stocké côté client,
il ne faut pas y mettre d'information sensible (mot de passe par exemple).
- durée
: si la durée est omise, on dépose un "cookie de session",
cela signifie qu'il sera effacé lorsqu'on fermera toutes les instance
du navigateur. Sinon il s'agit du timestamp d'expiration du cookie. Pour le
créer, on utilise le timestamp courant (avec time()
) et on ajoute la durée du cookie en seconde. Par exemple : time()
+ 365 * 24 * 3600, pour une durée de vie de un an.
- (dessiner au tableau la démarche d'échange des cookie)
- (montrer ce qu'il se passe si on envoie un cookie après du code HTML)
- (montrer la création de force d'un cookie immédiat)
- Pour détruire un cookie :
setcookie(nom, false);
setcookie(nom, "");
- Pour afficher la liste des cookies :
<pre><?php print_r
($_COOKIE); ?></pre>
L'authentification
Voici un code réalisant l'authentification :
Voici un lien vers un générateur automatique d'authentification
:
http://cours.sebastien-pastore.com/cours/s40/php_authentification/index.htm
Les procédures et les fonctions
Les variables de session
L'authentification
Mesure de la vitesse d'exécution d'une page PHP
Les fonctions de chaînes de caractères
Les fonctions de date
Les expressions régulières
Les variables globales $_GET, $_POST, $_GOBAL, $_SESSION, $_COOKIE, $_SERVER
Le traitement de fichiers