Li288 C5 PHP
Li288 C5 PHP
Li288 C5 PHP
Introduction
HTML : pages destinées à être publiées sur Internet
Texte à afficher + instructions de mise en page
Pas d’instructions de calcul ou de traitements conditionnels
Confiance :
Sourcesdu programme disponibles
Données envoyées au serveur pas fiables
Base de données stockée chez le client ?
Web dynamique – coté serveur
L'interprétation est réalisée par le serveur :
Indépendant de la machine et du navigateur
"Compatible" avec tous les navigateurs
Les échanges ne concernent que du HTML (ou Json ou autre)
Les sources sont sur le serveur donc invisibles
Php :
Le navigateur demande le fichier php
Le serveur exécute le code php et envoie le résultat
La page envoyée au navigateur est affichée
Code Php – autre version
Seules les parties purement dynamiques sont faites en
Php
Tout le reste est du html de base
Pas forcément très lisible
<html>
<body>
<?php
for ($i=1 ; $i<=3 ; $i++) {
?>
<?php echo $i ?> : <?php echo $i*$i; ?><br />
<?php
}
?>
</body>
</html>
Code Php – autre version
Tout le fichier html est créé en Php :
Syntaxe assez lourde
<?php
echo "<html>\n";
echo "<body>\n";
for ($i=1 ; $i<=3 ; $i++ ) {
echo $i." : ".($i*$i)."<br />\n";
}
echo "</body>\n";
echo "</html>\n";
?>
PHP - SYNTAXE
VARIABLES
Variables
Une variable est toujours précédée de $
$i est une variable qui s'appelle i
Types :
Entiers, réels, chaînes de caractères, objets
$var = 1;
function test(){
global $var;
echo $var;
}
Chaînes de caractères
Création/affectation entre guillemets
$test="a";
Concaténation avec le signe .
$test="bonjour" . "au revoir";
$var="test";
$$var="test2"; // similaire à $test="test2";
Comparaison ==
$x == $y
Concaténation .
$x.$y
…
INSTRUCTIONS
Instructions conditionnelles
if then else
définition spéciale pour le else if (pas obligatoire)
if (cond) {
...
} elseif (cond) {
...
} else {
...
}
// version courte :
(condition)?instructionSiVrai:instructionSiFaux;
Instructions conditionnelles
switch (…) { case … : … ; }
switch (expression) {
case "1" : ... ; break;
case "2" : ... ; break;
case "3" : ... ; break;
default : ...
}
Boucles
Boucles for :
for ( initialisation ; condition ; increment ) { ... }
Boucles while :
while (condition) { ... }
do { ... } while (condition);
Instructions conditionnelles
Saut inconditionnel
continue : termine l'itération courante de la boucle
Arrêt inconditionnel
break : termine la boucle complètement
Arrêt d'exécution du script
exit : termine le script
Fonction :
count() pour avoir le nombre d’éléments d’un tableau
Tableaux simples
Association numéro - valeur
// Création du tableau
$tableau = array(valeur0, valeur1,..., valeurN);
// Parcours version 1
for ($i=0; $i<count($tableau) ; $i++)
echo $i." ".$tableau[$i]."<br />";
// Parcours version 2
foreach($tableau as $valeur)
echo $valeur."<br />";
Tableaux associatifs
Associations clé d'index - valeur
// Création du tableau
$tableau = array(cle0 => val0, cle1 => val1,..., cleN => valN);
// Parcours version 1
foreach($tableau as $cle => $valeur)
echo $cle." ".$valeur."<br />;
// Parcours version 2
reset($tableau);
while (list($cle, $valeur) = each($tableau))
echo $cle." ".$valeur."<br />;
Tableaux multidimensionnels
Pas de méthode de création native :
On imbrique des tableaux.
// Création d'un tableau à deux dimensions
$tab1 = array(Val0, Val1,..., ValN);
$tab2 = array(Val0, Val1,..., ValN);
$tableau = array($tab1, $tab2);
// Parcours
for ($i=0 ; $i<count($tableau) ; $i++)
for ($j=0 ; $j<count($tableau[$i]) ; $j++)
echo $i." ".$j." ".$tableau[$i][$j]."<br />";
Fonctions sur les tableaux
Taille d'un tableau :
count()
Compter le nombre d'occurrences des valeurs d'un tableau :
$tab2 = array_count_values($tab);
Tri :
sort($tab); // selon les valeurs
ksort($tab); // selon les clefs
?>
Fonctions
Valeurs par défaut possibles pour les arguments
Tous les arguments peuvent avoir des valeurs par défaut
function racine($x, $racine=2) {}
Appel : racine($a, $b) ou racine($a)
Valeurs par défaut uniquement pour les derniers arguments
racine($x=4,$degre) impossible
$x = 10;
$y = double($x); // y=20 x=10
$y = double(&$x); // y=20 x=20
Variables globales et statiques
Static permet de conserver une variable dans une
fonction
$v = 2;
function test () {
global $v; // variable globale
static $x=0; // variable statique
$x+=$v;
echo $x."<br />";
}
test(); // affiche 2
test(); // affiche 4
Appel dynamique
Similaire aux variables dynamiques
function bonjour(){
echo "bonjour<br />" ;
}
$salut();
Fonctions de fonctions
Vérifie l'existence d'une fonction :
function_exists("fonction");
…
Fonctions utiles
Header :
Permet de modifier l'entête du protocole http
Utilisation principale : redirection vers une autre page
if (isConnected($user)) {
header("Location: accueil.php");
} else {
header("Location: login.php");
}
LES FORMULAIRES
Exploitation d’un formulaire
Accès à la page du formulaire
Remplissage/modification des champs Client
Envoi du formulaire(submit)
Exemple
Dans le formulaire <input name="nom" >
On récupère le contenu en php avec :
$_POST["nom"]
$_GET["nom"]
Pour continuer
Le plus simple pour comprendre :
Utiliser
la méthode GET pour passer les arguments
Regarder l'URL appelée
http://www.test.com/test.php?champ=valeur
Les différents paramètres envoyés et leur valeur sont visibles
Ici $_GET["champ"] vaut valeur
Puis utiliser POST une fois qu'on a compris
test.php?Champ1=Texte&Champ2=Texte&Champ3=Option_2&Champ4[]=Case_1&Champ4[]=Case_2&Champ
5=Case_2&Soumission=Soumettre
Un exemple
Récupération avec $_GET
Vérification de l'existence d'une variable :
isset(var)
Attention au contenu des choses reçues
Nombreuses failles si on ne fait pas attention !
// affichage de tous les champs reçus via le formulaire
$resultat = $_GET["Champ1"]."<br>";
$resultat .= $_GET["Champ2"]."<br>";
$resultat .= $_GET["Champ3"]."<br>";
for ($i = 0; $i < count($_GET["Champ4"]); $i++) {
$resultat .= $_GET["Champ4"][$i]."<br>";
}
if (isset($_GET["Champ5"]))
$resultat .= $_GET["Champ5"]."<br>";
echo $resultat;
FONCTIONNALITÉS
SUPPLÉMENTAIRES
Date et heure
Retourner la date courante dans une chaîne de
caractères :
$chaine = date(format [, nombre]);
$chaine=date("Y/m/d"); retourne 2010/03/10
if (!isset($_COOKIE["PremierCookie"])) {
echo "cookie non défini<br />";
} else {
echo $_COOKIE["PremierCookie"]."<br />";
}
Les sessions
Objectif : garder des données de page en page.
session_start()
Crée une nouvelle session
Ou ravive une session déjà existante
$_SESSION["nom"]=valeur permet de créer une variable de
session
session_destroy() détruit la session en cours
session_start();
$_SESSION["ma_variable"]=12;
Sessions – exemple
<html>
<body>
<form method="post" action="test.php">
<table border="0">
<tr>
<td>Nom :</td>
<td><input type="text" name="Nom" size="20" value="x"></td></tr>
<tr>
<td>Prénom :</td>
<td><input type="text" name="Prenom" size="20" value="y"></td></tr>
<tr>
<td>eMail :</td>
<td><input type="text" name="Email" size="20" value="z"></td></tr>
<tr>
<td colspan="2"><input type="submit" name="soumettre" value="Envoyer"></td>
</tr>
</table>
</form>
</body>
</html>
Sessions – exemple "test.php"
<?php
session_start();
$_SESSION["nom"] = $_POST["Nom"];
$_SESSION["prenom"] = $_POST["Prenom"];
$_SESSION["email"] = $_POST["Email"];
?>
Sessions – exemple "session.php"
<html>
<body>
<?php
session_start();
echo "Identifiant :".session_id()."<br />";
echo "Nom de la session :".session_name()."<br />";
echo "Nom : ".$_SESSION["nom"]."<br>";
echo "Prénom : ".$_SESSION["prenom"]."<br>";
echo "Mail : ".$_SESSION["email"]."<br>";
session_destroy();
?>
</body>
</html>
Envoyer des emails
La fonction mail :
mail($recipient, $subject, $message[, $headers, $params]);
Nécessite un serveur mail accessible sur le serveur
<?php
?>
Créer autre chose que du HTML
Php peut créer autre chose que du HTML
Images :
grand choix de formats, comme GIF , PNG , JPEG , WBMP…
Fichiers pdf (librairie tcpdf), csv, word, excel, …
Aucune limitation, il suffit de savoir comment modifier
l'entête (header) puis afficher le contenu…
<?php
header("Content-type: image/png");
$im = imagecreatefrompng("test.png");
$im = imagerotate($im, 90, 0);
imagepng($im);
?>
PHP ET MYSQL
Bases de données
Présentation :
HTML, Javascript
Navigateur : IE, Firefox, Chrome, …
Données :
Tables SQL
Serveur BD Access, Oracle, MySQL, PostGreSQL, …
Bases de données
PHP permet de travailler nativement avec la plupart des
SGBDR
Mysql, Oracle, Sybase, Microsoft SQL Server, PostgreSQL, …
Dans les autres cas on peut utiliser des drivers spécifiques
...
// fermeture de la connexion
$dbh = null;
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
MySQL et Php – requêtes
Avec :
la méthode query pour les recherches
Le méthode exec pour les modifications
...
$reponse->closeCursor();
$dbh = null;
MySQL et Php – traitement
Nombre de réponses :
rowCount()
Traitement des réponses :
fetch() : retourne les résultats un par un
fetchAll() : retourne un tableau avec tous les résultats
if ($reponse->rowCount() > 0) {
while ($donnees = $reponse->fetch()) {
echo $donnees['test_id'].' '.$donnees['test_val'].'<br />';
}
} else {
echo "aucun résultat<br />";
}
MySQL et Php – Un exemple
<html><body>
<ul>
<?php
try {
$dbh = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
$id=$_POST['id'];
$reponse = $dbh->query('SELECT * FROM `test` WHERE test_id='.$id);
if ($reponse->rowCount() > 0) {
while ($donnees = $reponse->fetch()) {
echo "<li>".$donnees['test_id'].' : '.$donnees['test_val'].'</li>';
}
} else {
echo "<li>aucun résultat</li>";
}
$reponse->closeCursor();
$dbh = null;
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
?>
</ul>
</body></html>
Sécurité
Que se passe-t-il si :
$id = "12"
$id = "12 OR 1"
$id=$_POST['id'];
$reponse = $dbh->query(
'SELECT * FROM `test` WHERE test_id='.$id
);
Et beaucoup d'autres
MySQL – opérations
Création de bases de données
CREATE DATABASE nom_bd
Remplacer un enregistrement
REPLACE INTO article
(Champ1, Champ2)
VALUES ('13', 'test');
MySQL – opérations
Modification des valeurs
UPDATE table_name
SET column_name=expr1
[WHERE section_condition_where]
Suppression d’enregistrements
DELETE FROM table_name
[WHERE definition]
MySQL – opérations
Sélection d’enregistrement
SELECT [DISTINCT|ALL] expression_de_selection
FROM tables
WHERE expression_where
[GROUP BY col_name, …]
[HAVING where_definition]
[ORDER BY [ASC|DESC]]
Exemples
SELECT * FROM article WHERE PrixArt > 50
SELECT NumGrArt, AVG(PrixArt) FROM article GROUP BY
NumArt
UN EXEMPLE "COMPLET"
SIMPLE
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head><title>Site de vente en ligne</title></head>
<body>
<div id="container">
<div id="header">
<ul id="top_menu">
<li><a href="index.php">index</a></li>
<li><a href="rechercher.php">rechercher</a></li>
<li><a href="commander.php">commander</a></li>
</ul>
</div> <!-- /header -->
<div id="main">
<div id="footer">
<p>Copyright 2011 © SdVeL. Tous droits réservés</p>
</div> <!-- /footer -->
</body>
</html>
config.php
<?php
session_start();
$user = "root";
$pwd = "";
$host = "127.0.0.1" ;
$bdd = "test";
try {
$dbh = new PDO('mysql:host='.$host.';dbname='.$bdd, $user, $pwd);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
$menu = array(
"index.php" => "index",
"rechercher.php" => "rechercher",
"commander.php" => "commander"
);
?>
header.php
<?php include_once('config.php'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
strict.dtd">
<html>
<body>
<div id="container">
<div id="header">
<ul id="top_menu">
<?php
foreach ($menu as $page_url => $page_title)
echo " <li><a href=\"$page_url\">$page_title</a></li>\n";
?>
</ul>
</div> <!-- / header -->
<div id="main">
footer.php
</div> <!-- / main -->
<div id="footer">
<p>Copyright 2011 © DVD Club. Tous droits réservés</p>
</div> <!-- / footer -->
</body>
</html>
Toutes les autres pages
Création d'autant de pages que nécessaire :
Modification de l'entête ou du pied de page via les fichiers header.php, footer.php
Modification des identifiants de connexion via le fichier config.php
…
Reste à modifier les fichiers header/footer et faire une css.
<?php include('header.php'); ?>
<!– Affichage du catalogue venant de la base de données -->
<?php
$reponse = $dbh->query('SELECT * FROM `test`');
if ($reponse->rowCount() > 0) {
while ($donnees = $reponse->fetch()) {
echo ...
}
} else {
echo "<li>aucun résultat</li>";
}
?>
<?php include('footer.php'); ?>
Pour aller plus loin
Il faut ensuite apprendre :
Quelques fonctions de base supplémentaires
A ne jamais faire confiance au client