Avoir accès aux fichiers sur le serveur web Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 02 / 40
Enregistrer les données sur un disque dur Pérennité Partage ou pas (configuration de apache) (sauvegarde en dehors du web) Souplesse de programmation aucun format imposé Mais code «bas niveau» Elément de Configuration d apache <FilesMatch "^\.ht"> Order allow,deny Deny from all Satisfy All </FilesMatch> #idem pour <Files *.inc> ou < Files *~> Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 03 / 40
Équivalent des opérations sur les fichiers fournies par les systèmes d exploitation glob ( $pattern) : recherche des chemins qui vérifient une expression $pattern <?php $files = glob("*.php"); // que les fichiers php du dossier courant foreach ($files as $filename) { echo «<a hef="$filename >".basename($filename)."</a><br />\n"; }?> is_dir ($nomfichier) -- Indique si le fichier est un dossier is_file ($nomfichier) -- Indique si le fichier est un fichier is_readable ($nomfichier) -- Indique si un fichier est autorisé en lecture is_writable ($nomfichier) -- Indique si un fichier est autorisé en écriture Les résultats de ces fonctions sont mis en cache Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 04 / 40
mkdir ( $chemin [, int mode]) Crée un dossier $chemin (ou retourne faux) Mode : droit d accès : 0777 par avoir les droits d écriture (c est nobody ou www-data ou qui crée ) rename ( $oldname, $newname) Renomme un fichier ou un dossier de nom $oldname en $newname Retourne true si cela fonctionne, faux en cas d échec Permet de déplacer un fichier rmdir ( $dir) Efface le dossier $dir, s il est vide et si le script à les droits Retourne true si cela fonctionne, faux en cas d échec touch ($nomfichier) Modifie la date de modification et de dernier accès d'un fichier Retourne vrai ou faux unlink ($nomfichier) -- Efface un fichier [retourne vrai ou faux] Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 05 / 40
filesize($nomfichier) Retourne la taille en octet du fichier Ou false (+ error E_WARNING) filemtime($nomfichier) Retourne la date de modification du fichier sous forme d un nombre de secondes écoulées depuis le début 1970 Elément de Configuration Configuration de php.ini pour l affichage des erreurs) error_reporting display_errors Etc. Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 06 / 40
file($nomfichier) Lecture de tout un fichier sous forme d un tableau de string, 1 ligne = une case Fin de ligne absent rtrim($str) : enlève les «espaces» à la fin de $str url possible Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 07 / 40
Exécute une itération à chaque passage de la boucle Itération sur les indices Ou pour «n» itérations Il faut préciser: l initialisation du compteur d itération On peut commencer à 0; à 2; etc.. Attention à la plage des indices d un tableau la condition d arrêt de la boucle; Limite supérieur si le compteur augmente Limite inférieur si le compteur diminue la ou les instructions faisant évoluer ces valeurs à chaque itération $longeur=count($tab); for ($a=0,$a<$longueur; $a = $a+1) { echo $tab[$a] ; } Boucles équivalentes for ($x=0; $x <10; $x++) { // Ici des instructions } foreach($tab as $case) { echo $case; } Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 08 / 40
file_get_contents($nomfichier, [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]]) Idem file, mais le résultat est dans une chaine Possibilité de préciser une sous partie (par des octets) Utilisation possible de include_path de php.ini pour rechercher le fichier $context : NULL (si on n en utilise pas) file_put_contents(string $nomfichier, mixed $data [, int $flags = 0 [, resource $context ]]) Pour écrire dans un fichier $date : string ou tableau (ou stream resource) $flags : FILE_USE_INCLUDE_PATH ou FILE_APPEND ou LOCK_EX Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 09 / 40
Mais code «bas niveau» Refaire toujours les mêmes morceaux de code Pas de structure «commune», non partegeable Cas du CSV (comma separeted values) format d export textuel de tableur $chaine = file($fichier); $donnees = explode(";", $chaine[$i]) ; // $donnees => un tableau défini par les ; Manque de sémantiques ordre des colonnes Contenu des colonnes Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 10 / 40
Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 11 / 40
Vision «brute» Utilisation d un style fourni : <link media="screen" type="text/css" rel="stylesheet" href="style.css" /> Dans une variable $filename mémoriser le nom et le chemin d un fichier : «news/politique/1.news» Avec la fonction file_get_contents affichez le contenu de cet article dans la page dans une balise «article». file_get_contents($filename) Lecture de tout un fichier, retourne son contenu dans une chaine http://www.php.net/manual/fr/function.file-get-contents.php Si le fichier n existe pas, affichez le message «article inexistant» (toujours dans une div de classe css «article»). Essayer votre page en modifiant la valeur de $filename. N hésitez pas à mettre des valeurs farfelues Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 12 / 40
Il faut remplacer la fonction «file_get_contents» par du code plus évoluer. Avec la fonction file, vous récupérez le contenu d un fichier sous forme d un tableau de chaine de caractère. Chaque élément du tableau est une ligne du fichier. Dans le cas d un fichier «.news», le premier élément du tableau retourné par la fonction file sera le titre de l article, le deuxième sera l auteur, le reste sera le contenu de l article (c.f. l illustration ci-dessous) Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 13 / 40
Titre de l article Auteur de l article Contenu de l article Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 14 / 40
A partir de ce tableau, il faudra générer un code html semblable à celui ci-dessous, à condition qu il y ait au moins 2 lignes dans le fichier «.news» (la première pour le titre, la seconde pour l auteur). Sinon, utilisez file_get_contents (comme avant). <article> </article> <h2>le titre</h2> <p>l auteur</p> Le reste de l article, c est-à-dire la fin du tableau (à partir de l indice 2, jusqu au bout) Voici le code css pour centrer le titre de l article, changer sa couleur de fond pour un gris clair opaque à 0.5 (50%), placer un trait en bas (avec boder-bottom) article > h2 { text-align: center; background: rgba(225,225,225,0.5); border-bottom: black thin solid; } Voici le code css aligner pour le nom de l auteur à droite, l écrire en italique article > h2 + p { text-align: right; font-style: italic; } Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 15 / 40
En attendant les formulaires Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 16 / 40
Chaque page exécutée (ou obtenue) indépendamment Continuité dans la navigation, dans l interaction Comment partager des valeurs? Persistance à long terme (fichiers, bd) Persistance à court terme (session) Formulaires (saisie par l utilisateur) Paramètre dans l url et lien spécifique Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 17 / 40
Ajout à la fin de l url http://serveur.domaine/chemin/page?variable=valeur Une variable dans une url se définit par Un nom Une valeur (après égal) Plusieurs variables possibles Séparation par des & entre les variables https://www.google.fr/search?q=philippe+renevier- Gonin&aq=f&oq=Philippe+Renevier- Gonin&aqs=chrome.0.59j61l3j0j62.6424&sourceid=chrome&ie=UTF-8 Fonctionne dans des liens <a href="?q=philippe+renevier-gonin&aq=f"> Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 18 / 40
$_GET Variable super globale http://www.php.net/manual/fr/language.variables.superglobals.p hp Un tableau associatif des valeurs passées au script courant via les paramètres d'url. Les clefs sont les noms des variables de l url Les valeurs sont définies après le signe = (et avant le &) $_GET décode déjà les paramètres Encodage de l url Décodage avec urldecode ou rawurldecode Encodage avec urlencode ou rawurldecode http://www.faqs.org/rfcs/rfc3986.html Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 19 / 40
$val = "valeur par defaut"; If ( isset($_get["variable"]) ) { $val = $_GET["variable"]; // faire des tests sur les valeurs // convertion } Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 20 / 40
Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 21 / 40
À la place d avoir une variable $filename, utiliser une variable $dossier = "news/politque"; $file = "01.news"; $filename = $dossier."/".$file; La suite est inchangée Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 22 / 40
Les urls devront avoir la forme : article.php?article=01.news&dossier=politiqu e Après avoir initialiser $dossier et $file, regarder si : $_GET["article"] existe $_GET["dossier"] existe Si oui, affectez ces valeurs aux variables correspondantes Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 23 / 40
Dans les li, générez des liens vers article.php avec les paramètres nécessaires pour ouvrir le bon article Utilisez urlencode sur les noms de dossier et d article s il y a des caractères spéciaux (attention, glob renvoie le chemin complet) La fonction basename donne le nom du fichier à partir d un chemin (fonctionne s il n y a pas d accent dans le nom du fichier) Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 24 / 40
Entrer des données depuis un navigateur Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 25 / 40
Envoi de données depuis le navigateur Pour traitement dans le serveur Deux façons de faire Passage des informations dans l url (méthode GET, déjà utilisée) Passage des informations dans la requête (méthode POST) Attention : ce n est pas sécurisé Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 26 / 40
<form action="page.php" method="post"> <fieldset> <legend>placez une alerte</legend> <p>message de l'alerte : <input type="text" name="alerte" /></p> <input type="submit" name="setalerte" value="declenchez l'alerte" /> </fieldset> </form> Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 27 / 40
<form action="page.php" method="post"> <fieldset> <legend>placez une alerte</legend> <p>message de l'alerte : <input type="text" name="alerte" /></p> <input type="submit" name="setalerte" value="declenchez l'alerte" /> </fieldset> </form> if (isset($_post["setalerte"])) { $alerte = rawurlencode(trim($_post["alerte"])); file_put_contents("alerte.txt", $alerte); } Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 28 / 40
Contient des éléments de contrôle de formulaire (bouton, champs, etc.) «block» (sauf form) ou script Attributs action (uri) method ("get" ou "post") get : envoi dans l url des paires key/value :?toto=val&titi=val2& post : envoi enctype (pour une méthode "post") Par défaut : application/x-www-form-urlencoded - encodage : espace devient + et les autres non alphanumériques %HH et les retours à la ligne : "CR LF" (i.e., `%0D%0A' ) multipart/form-data - envoi en différentes parties (types à préciser à la source) accept-charset (liste -, - d encodage possible pour les caractères acceptés par le server) Accept (liste -, - de types de contenu acceptés par le server) events : onsubmit et onreset Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 29 / 40
text : champs d entrée de texte. password : l écho sont des *. sécutité pauvre. submit : un bouton pour envoyer reset (bouton). file : sélection d un fichier Etc. Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 30 / 40
Balise vide Attributs type name : nom de contrôle (très important) value (valeur initiale ou libellé) : optionnel sauf pour radio et checkbox size (en pixel sauf pour text et password où c est un nombre de caractère) maxlength : pour text ou password : nombre de caractères maximum checked : pour radio et checkbox src : pour image : la source (ne pas oublier alt) Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 31 / 40
select : menu ( optgroup option )+ attributs name : nom de contrôle size (nombre) : nombre d éléments visibles pour une scroll list multiple (pas de valeur) : permet la sélection multiple option #pcdata (texte) attributs selected : pour présélectionner l élément value (texte) : pour donner une valeur autre que le texte (#pcdata) label (texte) : pour faire apparaître un autre nom (plus court) à la charge du navigateur!! (pas sûr que cela fonctionne!!) optgroup regrouper les options : (option)+ attribut : label (texte) : libellé Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 32 / 40
Champs d entrée sur plusieurs lignes textarea #PCDATA : texte initiale Attributs name : nom de contrôle cols : nombre de colonne rows : nombre de ligne Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 33 / 40
Permet d associer un texte à un élément de formulaire sans texte inline Start tag: required, End tag: required Attaché par l attribut for Valeur = id d un champ de contrôle Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 34 / 40
<form action="recoit.php" method="post"> <fieldset> <legend>ajouter une news</legend> <select name="categorie"> <option value='france' >france</option> <option value='monde' >monde</option> <option value='politique' >politique</option> <option value='sports' >sports</option> </select><br /> </form> <label for="titre">titre : </label><input type="text" name="titre" value='' /><br /> <label for="auteur">auteur : </label><input type="text" name="auteur" value='' /><br /> <label for="texte">texte : </label><textarea name="texte"></textarea ><br /> <input type="submit" /></fieldset> Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 35 / 40
Page qui reçoit le formulaire : attribut «action» du form Valeur(s) accessible(s) par : - tableau associatif : index est l attribut «name» de l input $_POST ou $_GET sont des «superglobales» Un peu de sécurité trim(htmlspecialchars(addslashes( ) ) ) str_replace pour remplacer des caractères «spéciaux» Tests complémentaires Les valeurs peuvent être des tableaux (si le name de l input est du style nom[] Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 36 / 40
// si toutes les valeurs du formulaires sont bien présentes if (isset($_post["titre"],$_post["auteur"],$_post["texte"],$_post["categorie"])) { // et si elles sont toutes remplies avec quelques choses if ($_POST["titre"] && $_POST["auteur"] && $_POST["texte"] && $_POST["categorie"]) { // on prépare le contenu de la nouvelle / article $article = trim($_post["titre"]). "\n"; $article.= trim($_post["auteur"]). "\n"; $article.= trim($_post["texte"]) ; // il faut déterminer un nom de fichier $nomfichier = "news/".$_post["categorie"]."/".$_post["titre"].".news"; // si le fichier n existe pas... if (! file_exists($nomfichier) ) { //... il est créé file_put_contents($nomfichier, $article); } } } Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 37 / 40
Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 38 / 40
Créez une page ajouter.php. Cette page permettra d ajouter une nouvelle. Cette page «ajouter.php» contient une page web (entêtes inclues) comprenant un formulaire (pour saisir une nouvelle) : Comprenant un champ «select» nommé «categorie» avec comme option les catégories de nouvelle existants (les options sont écrites en dur ou générer en php, avec glob «onlydir») Un champ de texte (input) nommée «titre» Un champ de texte nommée «auteur» Un textarea nommée «texte» pour saisir le texte de la nouvelle Un champ «submit» pour soumettre le formulaire A vous de fixer le champ action du formulaire, mais celui-ci peut-être ajouter.php. La méthode d envoie sera post. Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 39 / 40
Il s agit maintenant de traiter le formulaire reçu lors de l ajout d une nouvelle. Vous devez «blinder» votre code avec des tests sur la faisabilité de la création. Notamment car il faut gérer les droits d accès du php (c est dans le groupe «other», c est à fixer avec chmod o+w ). Au début du fichier «ajouter.php», faites le test si le formulaire vient d être soumis via l existence des variables $_POST["categorie"], $_POST["titre"], $_POST["auteur"] et $_POST["contenu"]. Si c est le cas, déterminez la catégorie (le chemin complet est «news/»). Si la catégorie existe (is_dir) et si elle est modifiable (is_writable), alors créez un fichier : Construisez une chaine de caractère $nouvelle correspondant à la nouvelle nouvelle N oubliez pas les \n pour ajouter les retours à ligne Déterminez un nom de fichier (par exemple strtotime("now") puis «_» puis le titre encodé avec urlencode puis «.news»). N oubliez pas de préciser le chemin complet (news/catégorie/ ) Si le fichier n existe pas, créez le avec la fonction file_put_contents. Le résultat retourné par file_put_contents est le nombre d octet écrit. Si c est différent de strlen($nouvelle) alors il y a un problème Générer une phrase qui donne et explique le résultat du traitement du formulaire. Affichez cette phrase (juste avant le formulaire). Philippe Renevier Gonin - Php, Fichiers et Formulaires - formation ISN, 2014-2015 40 / 40