Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 50 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
50
Dung lượng
0,97 MB
Nội dung
Tab. 7.8 : Les modes d’ouverture de fichier Mode Description A Écriture seule, ajoute au contenu existant en plaçant le pointeur en fin de fichier. A+ Lecture et écriture, ajoute au contenu en plaçant le pointeur en fin de fichier. Tab. 7.9 : Informations sur le statut du fichier ou du répertoire Fonction Description int chmod (string fichier, int mode) Les permissions sont changées sur des répertoires ou des fichiers. int file_exists (string fichier) Vrai si le fichier existe. int fileatime (string fichier) Date du dernier accès au fichier. int filectime (string fichier) Date de modification du nœud. int filemtime (string fichier) Date de modification du fichier. int fileperms (string fichier) Droits du fichier. int filesize (string fichier) Taille du fichier. int filetype (string fichier) Type du fichier. Bool is_dir (string fichier) Vrai si c’est un répertoire. Bool is_executable (string fichier) Vrai si le fichier est exécutable. Bool is_file (string fichier) Vrai si c’est un fichier. Bool is_readable (string fichier) Vrai s’il est lisible. Bool is_writeable (string fichier) Vrai s’il est modifiable. Bool is_linkinfo (string fichier) Vrai si le fichier pointé existe. String readlink (string chemin) Nom du fichier pointé. array stat (string fichier) Information sur le statut. int touch (string fichier [, int time]) Met à jour l’heure de modification. int umask (int masque) Définit un masque de permission par défaut (l’opposé de chmod). Sondages et concours Double Poche PHP & MySQL • 251 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. chmod Comme chmod utilise un nombre octal, il est indispensable de le noter précédé d’un 0, par exemple sous la forme 0755. Voici les valeurs des permissions chmod pour Unix. Tab. 7.10 : Permissions de fichier ou de répertoire de 0755 Permission Propriétaire (owner) Groupe (group) Public (other) Lecture (4) x x x Écriture (2) x o o Exécution (1) x x x Total 4+2+1=7 4+1=5 4+1=5 Ici, l’umask du fichier est 022, c’est-à-dire qu’il exclut la permission 2 (écriture) pour le groupe et le public. Vous affichez les interdictions plutôt que les permissions. Le umask sert de configuration par défaut sur un serveur pour une création de fichier. Il est configuré dans le répertoire etc/profile/ avec Unix. Les fichiers : ¶ 777. Tout le monde peut lire, écrire et exécuter. ¶ 755. Le propriétaire (vos programmes) peut tout faire, groupe et public peuvent lire et exécuter. ¶ 644. Le propriétaire (vos fichiers) peut lire/écrire, groupe et public, seulement lire. Les répertoires : ¶ 777. Tout le monde peut lire, écrire et chercher. ¶ 755. Le propriétaire peut tout faire, groupe et public peuvent seule- ment chercher. Voici les réglages courants. 7 Des algorithmes, des outils et des fonctions 252 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Les fichiers : ¶ scripts, 755 ; ¶ fichiers de données, 666 ; ¶ fichiers de configuration, 644 (pour les fichiers non modifiés par des programmes PHP). Les répertoires : ¶ 777 (n’oubliez pas de mettre les permissions adéquates sur les fichiers à l’intérieur). Tab. 7.11 : Arborescence Fonction Description bool chdir (string répertoire) Change le pointeur de répertoire courant. Void closedir (string descripteur) Ferme le descripteur de répertoire. int opendir (string chemin) Ouvre un répertoire. String readdir (int descripteur) Retourne le nom du fichier suivant associé au descripteur de répertoire. Void rewinddir (int descripteur) Place le pointeur au début du répertoire. int rmdir (string répertoire) Supprime un répertoire (vide). Formater avec sprintf(), sscanf(), fscanf() Tab. 7.12 : Le formatage des données Signe Source Affichage % Pourcentage Pourcentage littéral. b Entier Binaire. c Entier Caractère ASCII de cette valeur. d Entier Nombre décimal signé. u Entier Nombre décimal non signé. f Nombre réel Nombre réel. Sondages et concours Double Poche PHP & MySQL • 253 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Tab. 7.12 : Le formatage des données Signe Source Affichage o Entier Nombre octal. s Chaîne de caractères Chaîne de caractères. x Entier Nombre hexadécimal dont les lettres sont des minuscules. X Entier Nombre hexadécimal dont les lettres sont des majuscules. 7.5 Compteurs et statistiques Les compteurs et les statistiques sont, comme le stéthoscope du médecin, des instruments d’écoute de l’activité cardiaque de votre site. Analyser la circulation sur votre site vous permet de voir quels sujets sont plébiscités, donc de projeter son développement futur. La réflexion Le compteur est une colonne mise à jour à chaque chargement de la page. Pour avoir des statistiques, il suffit que le compteur incrémente une ligne différente chaque jour. Ensuite, le jeu consiste à l’afficher en montrant les pages les plus souvent visitées et les statistiques quotidiennes et mensuel- les. Vous pouvez complexifier à loisir, mais les statistiques horaires ou annuelles présentent un moindre intérêt. Créer le compteur quotidien Dans la table compteur, nous insérons les champs : ¶ fois pour le nombre de chargements de la page ; ¶ date sous forme AAAAMMJJ ; ¶ page pour insérer le nom de la page et placer ainsi toutes les pages sur la même table. 7 Des algorithmes, des outils et des fonctions 254 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Créons la table : CREATE TABLE compteur ( clef int(11) NOT NULL auto_increment, fois int(11) NOT NULL default ’0’, an char(2) NOT NULL default ’0’, mois char(2) NOT NULL default ’0’, jour char(2) NOT NULL default ’0’, repertoire varchar(255) NOT NULL default ’’,page varchar(60) NOT NULL default ’’, PRIMARY KEY (clef), KEY clef (clef)) Le principe est simple. Si la date est différente de la dernière date, on crée une nouvelle ligne dans la table ; autrement, on se contente de faire une mise à jour du champ fois qu’on incrémente. La page est identifiée par la variable globale, $SCRIPT_FILENAME, qui donne le nom du fichier et du répertoire depuis la racine du site (au-dessus du répertoire www ou htdocs): Listing 7.13 : Les statistiques stats.inc.php <? $table=’compteurs’; $chemin=ereg_replace(’/le chemin vers/www’,’’,$SCRIPT_FILENAME); $repertoire=dirname($chemin); $page=basename($chemin); $sql= "select * from $table where page=’$page’ AND repertoire=’$repertoire’ ORDER BY clef DESC LIMIT 1"; //vérifions la dernière date entrée dans la table pour cette page $resultat=@mysql_query($sql,$id_link); $rang=@mysql_fetch_array($resultat); $jour=$rang[’jour’]; $mois=$rang[’mois’]; $an=$rang[’an’]; if ($jour!=date("d")){ //si la date est différente, la nouvelle ligne est créée $an=date("y"); $mois=date("m"); $jour=date("d"); $sql= "insert into $table (fois, an, mois, jour, repertoire, page) VALUES(’1’, ’$an’, ’$mois’, ’$jour’, ’$repertoire’,’$page’)"; } else { //sinon elle est juste mise à jour $sql= "update $table set fois=fois+1 where jour=’$jour’ AND mois= ’$mois’ AND an=’$an’ AND page=’$page’ AND repertoire=’$repertoire’"; } @mysql_query($sql,$id_link); ?> Compteurs et statistiques Double Poche PHP & MySQL • 255 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Pour appeler maintenant ce programme, il vous suffit de le nommer stats.inc.php et de l’inclure dans vos pages par la ligne : include_once RACINE."/commun/stats.inc.php"; $SCRIPT_NAME ou $SCRIPT_FILENAME Vous pourriez utiliser $SCRIPT_NAME, cela vous éviterait d’en- lever le chemin entre la racine et votre répertoire www. Cepen- dant, si vous avez des sous-domaines comme http://vins .bonsvivants.com, $SCRIPTNAME vous donnera le même répertoire que pour http://www.bonsvivants.com, c’est-à-dire "/". Pour éviter ce pro- blème, il vaut mieux utiliser $SCRIPT_FILENAME et en enlever le chemin au-dessus du répertoire web. Tab. 7.13 : Découpage du chemin d’un fichier Fonction Description String basename (string chemin) Extrait le nom du fichier d’un chemin. String dirname (string chemin) Retourne le chemin sans le nom de fichier. La page d’affichage des statistiques de page Si vous avez bien conçu votre site, vous avez groupé vos applications par répertoire. Il devient alors intéressant de disposer de statistiques par répertoire en plus des statistiques par fichier. Quant aux statistiques quotidiennes et mensuelles, sans doute disposez-vous de chiffres fournis par votre hébergeur. Les vôtres les compléteront et les affineront. Par ailleurs, vous avez un certain nombre de fichiers chargés à chaque page. Ce n’est pas la peine d’inclure ces derniers dans vos statistiques. Pour la page, nous utiliserons des fonctions de manipulations de fichiers et de répertoires. La page comprend la liste des répertoires avec leurs statistiques par mois classées par ordre décroissant. Pour chaque répertoire affiché, un menu permet de choisir un fichier dont les statistiques s’ouvriront dans une nouvelle fenêtre. 7 Des algorithmes, des outils et des fonctions 256 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Listing 7.14 : Affichage des statistiques : affichage_stats.php <? $extensions=array (’htm’, ’html’, ’php’, ’php3’); echo ’<TABLE width="95%">’; $sql="select SUM(fois) as somme, repertoire, an, mois from compteurs GROUP BY repertoire, an, mois ORDER BY an, mois, somme DESC"; $resultat=@mysql_query($sql,$id_link); while($rang=@mysql_fetch_array($resultat)){ $somme=$rang[’somme’]; $repertoire=$rang[’repertoire’]; $an=$rang[’an’]; $mois=$rang[’mois’]; echo "<TR><TD width=\"18%\">"; echo "$repertoire</TD>"; $dernier_repertoire=$repertoire; echo "</td><TD width=\"20%\">\n"; echo "<form action=\"stats_fichier.php\" method=\"post\" target=\"_blank\">\n"; echo "<select name=\"fichier\">\n"; $sql_fichiers="select page DISTINCT from compteurs where repertoire=’$repertoire’ ORDER BY page"; $result=@mysql_query($sql_fichiers,$id_link); while($rangee=@mysql_fetch_array($result)){ $page=$rangee[’page’]; preg_match("#^(.*)\.([A-z0-9]{3,4})$#", $page, $tableau); $extension=$tableau[2]; /* NOUS TRICHONS UN PEU style "Retour vers le futur". Nous vous expliquerons la manipulation dans le prochain chapitre. Promis! */ in_array ($extension, $extensions)){ echo "<option value=\""; echo "$repertoire$page"; echo "\">$page</option>\n"; } } echo "</select>\n"; echo "<input type=\"submit\" value=\"voir\">\n"; echo "</form>"; echo "</TD><TD>"; if ($an!=$dernier_an){ echo $an; $dernier_an=$an; } echo "</TD><TD>"; echo $mois; echo "</TD><TD>$somme</TD></TR>"; } echo"< /TABLE>"; ?> Compteurs et statistiques Double Poche PHP & MySQL • 257 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Par le formulaire et son menu déroulant, nous envoyons le chemin du fichier dont nous désirons afficher les statistiques. C’est le même fichier. Dans le tableau HTML, il vous suffit d’enlever la colonne du formulaire et d’ajouter une colonne pour afficher le jour. N’oubliez pas d’ajouter les deux lignes suivantes : $repertoire=dirname($fichier); $page=basename($fichier); Ensuite, la requête SQL est : $sql="select SUM(fois) as somme, fichier, an, mois, jour from compteurs GROUP BY fichier, an, mois, jour ORDER BY an, mois, jour somme DESC"; 7.6 Le chariot électronique Imaginons que, dans ce club, un marchand de vin ou un producteur vous propose de mettre une boutique en ligne. Une boutique est avant tout une calculatrice qui suit le client de page en page durant sa visite. Nous gardons les informations pendant la visite. Elles correspondent aux articles achetés avec leur clé dans la table et leur quantité. Le catalogue consiste en une liste de produits dans chaque page, accompagnés d’une photo, d’un champ quantité et d’un bouton pour acheter. Cliquer sur le bouton ajoute dans le tableau en session une ligne comprenant la clé du produit et sa quantité. Une fenêtre s’ouvre et confirme que le produit a été ajouté dans le chariot. Dans chaque page sont affichés deux boutons, l’un pour voir le contenu du chariot et l’autre pour finir la visite et payer les marchandises avec le port. Ce tableau est construit avec comme clé la référence du produit (la clé dans la table produits) et comme valeur, la quantité. Le premier travail consiste à concevoir et à construire la base de données. Dans l’exemple d’un vin, nous pouvons affiner les caractéristiques : nature (blanc, champagne, rosé, rouge, mousseux), cépage, terroir, pays, année, appellation, commentaire, contenance, prix, promotion. Ensuite, 7 Des algorithmes, des outils et des fonctions 258 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. vous créez une table avec ces caractéristiques. Nous pouvons intégrer dans l’identifiant référence un certain nombre de renseignements qui économiseront de la place et du temps de frappe. Nous commençons par les trois premiers caractères du type puis une lettre tirée d’une table caractérisant le cépage… Dans notre exemple, nous utilisons le vin, mais vous pouvez faire la même chose avec des livres, de l’épicerie, des séjours à la montagne… Seules les caractéristiques changeront. Avant de com- mencer, visitez plusieurs sites sur le même thème. La promotion La valeur promotion peut être constituée de la date de début, de la date de fin, de la quantité et du prix sous la forme 2002090220020917330. Dans l’exemple, la promotion commence le 2 septembre 2002 (8 premiers chiffres 2002 09 02) et finit le 17 septembre 2002 (du 9 e au 17 e chiffre) ; enfin, l’offre consiste en trois bouteilles (18 e chiffre) pour 30 Q,ou30$(19 e et 20 e chiffres). Voilà des astuces qui économisent de la place dans la base. Vous créez une fonction qui décode la référence et la promotion. Ce livre n’étant pas spécialisé dans le commerce des vins, nous n’entrerons pas dans le détail des références de vins. Si vous voulez approfondir, visitez l’excellent site www.vitis.org. Étudions de plus près la fonction promotion() : Listing 7.15 : Transformation du chiffre de la colonne promotion : fonction_promotion.php $mois_franc=array(’’, ’janvier’, ’février’, ’mars’, ’avril’, ’mai’, ’juin’, ’juillet’, ’août’, ’septembre’, ’octobre’, ’novembre’, ’décembre’); echo promotion("2002091020020929330") function promotion($chiffre){ $debut=substr($chiffre,0,8); $an=substr($debut,0,4); $mois=(int)substr($debut,4,2); $mois= $mois_franc["$mois"]; $jour= (int) substr($debut,6,2); $debut="$jour $mois $an"; $promo[’debut’]=$debut; $fin=substr($chiffre,8,8); $an=substr($fin,0,4); $mois=(int)substr($fin,4,2); $mois= $mois_franc["$mois"]; $jour= (int) substr($fin,6,2); Le chariot électronique Double Poche PHP & MySQL • 259 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. $fin="$jour $mois $an"; $promo[’fin’]=$fin; $nombre=substr($chiffre,16,1); $promo[’nombre’]=$nombre; $prix=substr($prix,17,2); $promo[’prix’]=$prix; return $promo; } Le prix affiché doit être formaté, car les nombres à virgule flottante sont écrits avec un point pour les décimales alors qu’en français on utilise une virgule. Si un nombre comprend une virgule, il devient une chaîne de caractères. Il existe une fonction pour remédier à ce problème. Les prix Pour afficher vos prix, vous devrez les formater pour le français. Dans la table produits, ce sont des nombres à virgule flottante où la virgule est représentée par un point. number_format() Cette fonction sert à formater un nombre pour le conformer aux usages locaux. Syntaxe : string number_format ( float nombre [, int decimals [, string point_dec [, string sep_milliers]]]) Pour formater un nombre en français, le code serait : $prix_total=number_format ($prix_total, ’2’, ’,’, ’ ’); Dans cet exemple, nous afficherons un nombre qui comprend deux décimales après une virgule et utilise une espace pour séparer les milliers. Le nombre formaté Le nombre formaté a changé de nature. Il est non plus un nombre à virgule flottante mais une chaîne de caractères. Cela signifie que, si vous le traitez avec un opérateur arithmétique, il devient un entier et perd ses décimales. 7 Des algorithmes, des outils et des fonctions 260 • Double Poche PHP & MySQL Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [...]... (isset($exif[’DateTimeOriginal’])) { $date=$exif[’DateTimeOriginal’]; } if (!$date && isset($exif[’DateTime’])) { $date=$exif[’DateTime’]; } if ($date) { $date=split(’:’,str_replace(’ ’,’:’,$date)); $date=mktime($date[3],$date[4],’0’,$date[1], $date[2], $date[0]); //ici la date sera au format français setlocale (LC_ALL, ’fr_FR’); $ladate=strftime ("%e %B %Y, %Hh%M", $date); echo $ladate.""; } if (isset($exif[’COMPUTED’][’ApertureFNumber’]))... et voyages Il vous suffit ensuite d’incrémenter une lettre dans le code pour chaque insertion (’A’, ’B’…) Utilisez des lettres pour le code Nous évitons de mettre un chiffre dans le code car nous n’en avons que dix à notre disposition, en incluant le 0 Si nous ajoutons des catégories par la suite, il vaudra mieux disposer des vingt-six lettres Si vous avez besoin de plus de code, incrémentez les lettres... différentes valeurs)"; @mysql_ query($sql,$id_link); $clef_commande =mysql_ insert_id(); puis dans le formulaire : Une fois les coordonnées du client insérées dans la table clients, ajoutez dans la table commandes : $clef_client =mysql_ insert_id(); $sql="update commandes set $clef_client=’$clef_client’ where clef=’$clef_commande’"; @mysql_ query($sql,$id_link);... clef=’$clef_commande’"; @mysql_ query($sql,$id_link); mysql_ insert_id() Cette fonction correspond à la fonction MySQL : last_insert_id() Elle permet donc de récupérer la dernière valeur d’une colonne AUTO_INCREMENT En haut du fichier, pour traiter la suppression d’un article par l’internaute qui aurait cliqué sur le lien enlever, nous ajoutons le code suivant : if ($_GET[‘act’]==’f’){ $autre_chariot["$clef"]=$quantite;... design de vos pages, travaillez sur le modèle Le contenu et le design sont clairement séparés, ce qui donne plus de souplesse Vous travaillez sur un modèle et non sur chaque page Ensuite, le changement se fait en un clic La réflexion Cette application demande une longue réflexion La maquette doit être faite comme pour un magazine papier Chaque page et article sont calibrés avec le nombre de signes, la... décodé et la colonne nbre_images, incrémentée de 1 sur la ligne correspondant à l’article et au numéro Voici le formulaire dans le fichier nommé images_mag.php : . dont les lettres sont des minuscules. X Entier Nombre hexadécimal dont les lettres sont des majuscules. 7.5 Compteurs et statistiques Les compteurs et les. la dernière date entrée dans la table pour cette page $resultat= @mysql_ query($sql,$id_link); $rang= @mysql_ fetch_array($resultat); $jour=$rang[’jour’];