Web dynamique avec PHP et MySQL
Transcription
Web dynamique avec PHP et MySQL
Web dynamique avec PHP et MySQL Programmation Internet, IvMad, 2005-2013 1 Modèle Client Serveur Le modèle client serveur est tripartite, c.à.d. constitué en trois parties: 1. Client Web qui visualise le contenu des pages HTML et JavaScript demandées au serveur Web 2. Serveur Web qui stocke l'intégralité des pages d'un site : HTML, PHP, JSP, ASP, CGI, JavaScript 3. Serveur d'application et de base de données qui stocke et traite la partie dynamique d'un site. Programmation Internet, IvMad, 2005-2013 2 PHP et les BD PHP permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est pas directement supportée par PHP, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec la BD. La communication avec les bases de données se fait à l'aide de requêtes SQL, un langage reconnu par l'ensemble des SGBDR. Le système de gestion de bases de données (SGBDR) MySQL est un système gratuit et rapide fonctionnant sous Linux et Windows. MySQL est le SGBDR le plus utilisé avec PHP sur des serveurs Web. Programmation Internet, IvMad, 2005-2013 3 PHP et MySQL SGBD MySQL – Libre ( GNU ) – Multiplateforme – multi‐utilisateurs Principe: – Utilisation de requêtes SQL dans du code PHP – API MySQL : Ensemble de fonctions PHP permettant d'accéder aux bases de données MySQL Différences entre MySQL et le standard SGBD – Pas de gestion des transactions – Pas de procédure stockée ni de trigger – Pas de vue (view) Programmation Internet, IvMad, 2005-2013 4 Connexion à une BD La première étape consiste à déclarer les variables qui vont permettre la connexion à la base de données: – – – – $user : $passwd : $host : $bdd : Le nom d'utilisateur; Le mot de passe; L'hôte hébergeant le SGBD; Le nom de la base de données. $bdd= "mabase"; $host="mysql.univ-mrs.fr"; $user= "etude"; $pass= "12345"; Programmation Internet, IvMad, 2005-2013 5 Connexion à une BD PHP fournit un grand choix de fonctions permettant de manipuler les BD, dont quatre fonctions sont essentielles : – – – – La La La La fonction fonction fonction fonction de de de de connexion au serveur choix de la base de données requête déconnexion Avec MySQL ces fonctions sont : – – – – mysql_connect(); mysql_select_db(); mysql_query(); mysql_close(); Programmation Internet, IvMad, 2005-2013 6 Bases de Données Connexion à une BD (MySQL) <?php $bdd= "mabase"; // Base de données $host="jumbo.univ-mrs.fr"; // Serveur $user= "etude"; // Utilisateur $pass= "12345"; // Mot de passe mysql_connect($host, $user, $pass) or die ("Impossible de se connecter à la BD"); mysql_select_db($bdd); ?> Programmation Internet, IvMad, 2005-2013 7 Requêtes SQL La requête SQL en chaîne de caractères $query = "SELECT num, pays, date FROM $nomtable"; Le résultat $result = mysql_query($query); Traitement de l'erreur if (mysql_error()) { print "Erreur dans la BD: " .mysql_error(); exit(); } Programmation Internet, IvMad, 2005-2013 8 Requêtes SQL Créer une table dans MySQL <?php $user="webuser"; $password="123456"; $database="hotel"; $dbserver="mysql.iut.fr"; mysql_connect($dbserver, $user, $password); mysql_select_db($database) or die ("BD inaccessible"); $query="CREATE TABLE reservation (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, nom varchar(25), email varchar(20), date_arr date, date_dep date, nbjours int);"; if(mysql_query($query)) echo "Création de la table"; else echo "échec de création!"; mysql_close(); ?> Programmation Internet, IvMad, 2005-2013 9 Requêtes SQL Insérer des données dans une table <?php $nom=$_POST["nom"]; $email=$_POST["email1"]; $date_arr=$_POST["date1"]; // la date en format jj/mm/aaaa $date_dep=$_POST["date2"]; $nbjours=$_POST["jours"]; // passer la date en format yyyy-mm-dd $date_arr = substr($date_arr, 6, 4)."-".substr($date_arr, 3, 2)."".substr($date_arr, 0, 2); $date_dep = substr($date_dep, 6, 4)."-".substr($date_dep, 3, 2)."".substr($date_dep, 0, 2); $database="hotel"; $user="user"; $password=""; $dbserver="s.iut.fr"; mysql_connect($dbserver, $user, $password); mysql_select_db($database) or die("BD inaccessible"); $query = "INSERT INTO reservation (nom, email, date_arr, date_dep, nbjours) VALUES ('$nom','$email','$date_arr','$date_dep','$nbjours');"; $result = mysql_query($query); if ($result) { echo "Une réservation ajoutée"; } else echo "Il y a un problème!"; mysql_close(); ?> Programmation Internet, IvMad, 2005-2013 10 Requêtes SQL Afficher le contenu d’une table <?php $database="test"; mysql_connect("mysql.iut.fr", "user", ""); mysql_select_db($database) or die ("BD inaccessible"); $result = mysql_query ("SELECT nom, email, nbjours FROM reservation"); echo '<TABLE border="1">'; Echo '<TR><TH>Nom</TH><th>Mail</TH><th>Jours</th></TR>'; while ($myrow = mysql_fetch_array($result)) { echo "<TR><TD>"; echo $myrow["nom"]; echo "</td><td>"; echo $myrow["email"]; echo "</td><td>"; echo $myrow["nbjours"]; echo "</TD></tr>"; } echo "</TABLE>"; ?> Programmation Internet, IvMad, 2005-2013 11 Récupération résultats La fonction mysql_fetch_row() array mysql_fetch_row ( $result ) – retourne un tableau qui contient tous les champs d’une rangée de résultat (un tuple). Chaque appel produit le tuple jusqu’à ce qu’il n’y en ait plus (FALSE). – La ressource $result provient de la fonction mysql_query() Programmation Internet, IvMad, 2005-2013 12 Récupération résultats <?php $result = mysql_query ("SELECT id, email FROM people WHERE id = '42'"); if (!$result) { echo 'Requête impossible : ' . mysql_error(); exit; } $row = mysql_fetch_row($result); echo $row[0]; // 42 echo $row[1]; // [email protected] ?> Programmation Internet, IvMad, 2005-2013 13 Récupération résultats while ($row = mysql_fetch_row($result)) // $result a été obtenu par le msql_query () { // récupération des informations $num = mysql_result($row[0]); $pays = mysql_result($row[1]); $date = mysql_result($row[2]); print "… "; } Programmation Internet, IvMad, 2005-2013 14 Fonctions utiles État de MySql ou connaître le contenu de MySql (show databases;): mysql_list_dbs($connexion); État d'une base ou la liste des tables contenues dans une BD (show tables;) $pointeur_resultat = mysql_list_tables ($nom_de_la_table, $pointeur_de_connexion); Programmation Internet, IvMad, 2005-2013 15 Fonctions utiles mysql_fetch_array() - Retourne une ligne de résultat MySQL sous la forme d'un tableau associatif, d'un tableau indexé, ou les deux mysql_fetch_assoc() - Lit une ligne de résultat MySQL dans un tableau associatif mysql_fetch_object() - Retourne une ligne de résultat MySQL sous la forme d'un objet mysql_data_seek() - Déplace le pointeur interne de résultat MySQL mysql_fetch_lengths() - Retourne la taille de chaque colonne d'une ligne de résultat MySQL mysql_result() - Retourne un champ d'un résultat MySQL Programmation Internet, IvMad, 2005-2013 16 Fonctions utiles mysql_drop_db : Efface une base de données MySQL mysql_errno : Retourne le numéro d'erreur de la dernière commande MySQL mysql_error : Retourne le texte associé avec l'erreur générée lors de la dernière requête mysql_escape_string : Protège une chaîne pour la passer à mysql_query mysql_fetch_assoc : Lit une ligne de résultat MySQL dans un tableau associatif mysql_fetch_field : Retourne les données enregistrées dans une colonne MySQL sous forme d'objet Programmation Internet, IvMad, 2005-2013 17 BD Perso Luminy Connexion à la BD perso sans passer en claire ses identifiants: <?php $link = mysql_connect ( $_SERVER['dbHost'], // le nom du serveur MySQL $_SERVER['dbLogin'], // nom d'utilisateur MySQL $_SERVER['dbPass']) // mot de passe associé or die ("Impossible de se connecter : " . mysql_error() ); echo "Connexion réussie"; mysql_close($link); ?> Une configuration assurée par la DOSI à Luminy Programmation Internet, IvMad, 2005-2013 18 BD Perso Luminy Création d'une table dans votre BD perso: <?php $link = mysql_connect( $_SERVER['dbHost'], $_SERVER['dbLogin'], $_SERVER['dbPass'] ) or die("Impossible de se connecter : " . mysql_error()); echo 'Connexion réussie'; mysql_select_db($_SERVER['dbBd'], $link) or die( "Unable to select db"); echo 'BD selectionnée'; $query="CREATE TABLE carnet (id int, prenom varchar(25), nom varchar(20), email varchar(35), PRIMARY KEY (id))"; mysql_query($query); echo 'Création réussie'; mysql_close($link); ?> Programmation Internet, IvMad, 2005-2013 19 BD Perso Luminy Insertion de données dans la table "carnet" de la BD perso <?php $name="carnet"; $link = mysql_connect($_SERVER['dbHost'], $_SERVER['dbLogin'], $_SERVER['dbPass']) or die("Impossible de se connecter : " . mysql_error()); echo 'Connexion réussie'; mysql_select_db($_SERVER['dbBd'], $link) or die( "Unable to select database"); $query = "INSERT INTO carnet VALUES ('1','Yves','BLANC', '[email protected]')"; $result = mysql_db_query($_SERVER['dbBd'], $query); if ($result) { echo "<p>$name est ajouté à la base</p>"; } else { echo "<p>Il y a un problème!</p>"; } mysql_close($link); ?> Programmation Internet, IvMad, 2005-2013 20 BD Perso Luminy Afficher le contenu de la table "carnet" <?php $name="carnet"; $link = mysql_connect($_SERVER['dbHost'], $_SERVER['dbLogin'], $_SERVER['dbPass']) or die("Impossible de se connecter : " . mysql_error()); mysql_select_db($_SERVER['dbBd'], $link) or die("Unable to select database"); $result = mysql_query("SELECT * FROM carnet",$link); echo "<TABLE>"; echo "<TR><th>| Id </th><TH>| Prenom </TH><TH>| Nom </TH></TR>"; while ($myrow = mysql_fetch_array($result)) { echo "<TR><TD>"; echo $myrow["| id "]; echo "</td><td>"; echo $myrow["prenom"]; echo " | </td>"; echo $myrow["nom"]; echo " | </td> </tr>"; } echo "</TABLE>"; mysql_close($link); ?> Programmation Internet, IvMad, 2005-2013 21 PHP et les Images Formats supportés – JPG, GIF, PNG Fonctionnalités – Récupération, – Création, – Modification, – Manipulation. Programmation Internet, IvMad, 2005-2013 22 Fonctions liées aux images Avec la bibliothèque GD – id = getimagesize (nom de fichier) – id = imagecreate(largeur, hauteur) • GIF, JPG, PNG – imagedestroy(identifiant image) – imagefill (image, x, y, couleur) – imagechar($image, police, x, y, "txt", couleur) – imagecharup ... Programmation Internet, IvMad, 2005-2013 23 Gestion des fichiers La fonction fopen( ) permet d'ouvrir un fichier pour un certain mode d'utilisation: entier fopen(chaine nomdufichier, chaine mode); Différents modes: r : ouverture en lecture seulement w : ouverture en écriture seulement (la fonction crée le fichier s'il n'existe pas) a : ouverture en écriture seulement avec ajout du contenu à la fin du fichier et le crée s'il n'existe pas r+ : ouverture en lecture et écriture w+ : ouverture en lecture et écriture (la fonction crée le fichier s'il n'existe pas) a+ : ouverture en lecture et écriture avec ajout du contenu à la fin du fichier et le crée s'il n'existe pas. Programmation Internet, IvMad, 2005-2013 24 Gestion des fichiers Exemples : $fp = fopen("../fichier.txt", "r"); // lecture $fp = fopen("ftp://iut.univ.fr/pub/fichier.txt", "w"); // écriture depuis début du fichier $fp = fopen(http://www.nexen.com/fichier.txt, "a"); // écriture depuis fin du fichier Remarque: $fp contient l'adresse du buffer d'Entrée/Sortie Programmation Internet, IvMad, 2005-2013 25 Gestion des fichiers File diagram des opérations sur fichiers Programmation Internet, IvMad, 2005-2013 26 Lecture dans un fichier $monfichier = fopen("monfichier.txt", "r") ; if ( !($monfichier)) { print("Impossible d’ouvrir le fichier") ; exit ; } while ( !feof($monfichier) ) { $ligne = fgets($monfichier, 255); // 255 caractères max. ou bien fin de ligne. print " $ligne <BR>"; } fclose ($monfichier) ; Programmation Internet, IvMad, 2005-2013 27 Écriture dans un fichier < ? php // ouverture en écriture $monFichier = fopen("monfichier.txt", "w") ; if ( !($monfichier)) { print("Impossible de créer le fichier \n") ; exit ; } // on écrit deux lignes fputs($monfichier, "ligne 1") ; fputs($monfichier, "ligne 2") ; fclose($monfichier) ; // on ferme le fichier, on libère les ressources ?> Programmation Internet, IvMad, 2005-2013 28 Exemple de script Réaliser un compteur dans un fichier texte. <?php $fic="cpt.txt"; if (!file_exists($fic)) { print "<H3>fichier compteur manquant</H3>"; exit;} else { $fd = fopen($fic, "w+"); $hits = fgets($fd, 10); $hits++; fseek($fd, 0); fputs($fd, $hits); fclose($fd); print "<b><i>$hits</i></b>"; } php?> Programmation Internet, IvMad, 2005-2013 29 Fonction Explode Il est fréquent d’avoir des fichiers contenant différents champs séparés par un délimiteur quelconque. Une fonction très utile dans ces cas là: explode ("caractère délimiteur", chaîne de donnée) Roose | Philippe | 27 Goudin | David | 28 Programmation Internet, IvMad, 2005-2013 30 Fonction Explode <?php if (!file_exists("test.txt")) { print "<H3><BR>fichier manquant<BR>"; exit; } else { $fd = fopen($fic,"r"); while (!feof($fd)) { $ligne = fgets($fd, 255); $tab=explode("|",$ligne); print "Nom : $tab[0]<br>"; print "Prénom : $tab[1]<br>"; print "Age : $tab[2]<br>"; } fclose($fd); } ?> Programmation Internet, IvMad, 2005-2013 31 Programmation OO Déclaration de classe class Personne { // attributs, méthodes var $nom, $adresse; function Personne($nom, $adresse, $age) { $this->nom = $nom; $this->adresse = $adresse; } function toprint() { print $this->nom; } } Instanciation $p = new Personne("Jacques","Aubagne"); Référenciassions print $p->nom; $p->print(); Programmation Internet, IvMad, 2005-2013 32 Programmation OO Héritage class Cadre extends Personne { var $poste, $salaire; function Cadre($nom, $adresse, $poste, $salaire) { $this->Person($nom, $adresse, $age); $this->poste = $poste; $this->salaire = $salaire; } function toprint() { print parent::toprint(); print $this->salaire; print $this->poste; } } Programmation Internet, IvMad, 2005-2013 33 Programmation OO Exécution $p=new Personne("Jacques","Aubagne"); echo "<p><i>la classe Personne</i></p>"; print $p->nom; echo "<p><i>la classe Cadre</i></p>"; $c=new Cadre("Ivan", "Marseille", "MCF", "XXX"); $c->toprint(); Programmation Internet, IvMad, 2005-2013 34