Archives pour la catégorie Codage

Article ayant pour thématique le codage

la formule d'Haversine mise en pratique

Bonjour !

Aujourd'hui, nous allons essayer d'appréhender la formule d'haversine, mais tout d'abord, à quoi ça sert ?

La formule d'haversine permet, grâce à une expression mathématique,de trouver la distance à vol d'oiseau entre deux points sur terre. Cette formule est basée sur les coordonnées géographiques et les fonctions trigonométriques.

Toujours dans la présentation, je vais vous dévoiler la formule en question. Elle peut vous sembler obscure, mais ne vous inquiétez pas, je vous l'explique par la suite !

 a = sin(\frac{\Delta_\theta}{2})^2+cos(\theta_1)*cos(\theta_2)*sin(\frac{\Delta_\lambda}{2})^2

 c= 2*atan2(\sqrt{a}, \sqrt{1-a})

 d= R*c

Quelques précisions, sinon vous ne pourrez pas comprendre cette formule : On divise toujours cette formule en 3 parties pour la rendre plus digeste, c'est en quelque sorte une convention. Ensuite, les \theta sont des latitudes, les \lambda des longitudes et R est le rayon de la terre. Enfin,  \Delta_\theta = \theta_2 - \theta_2 et \Delta_\lambda = \lambda_2 - \lambda_1

Nous avons bien sur le souci de la précision, nous allons donc chercher un rayon de la terre le plus précis possible, et pour ce genre de recherche scientifique, j'ai un favori, wolfram alpha . Selon ce moteur de recherche, R=6367,5 km (si vous voulez essayer vous même, tapez "earth radius" dans le champ de recherche.)

Maintenant que les présentations sont faites, passons à la partie qui nous intéresse le plus : Le programme : Les habitudes ne changent pas, ce programme sera codé en PHP, mais en OO ,(Orienté Objet) car on m'a demandé des approfondissements sur ce sujet !

Partie 1 : Identifions les fonctions trigonométriques et mathématiques à utiliser dans le code.

Tout d'abord, les latitudes sont fournies en degrés, il faut les convertir en radians, et pour cela on utilisera la fonction deg2rad(nombre)

Les fonctions trigonométriques utilisées ici (sin, cos, atan2) sont nativements intégrées à PHP sous leur nom d'origine, pas besoin de plus de détails.

Partie 2 : Créons le "squelette" de notre code.

Je vous l'ai dit plus haut, nous allons faire de la POO, pour cela, il faut changer ses habitudes par rapport au procédurale et créer une nouvelle forme de document comme ce qui suit :


<?php

class Haversine{

public function calculate($lat1, $long1, $lat2, $long2){

//Ici notre code

}

?>

Nous avons donc créer une classe qui comporte une fonction qui elle même comporte des arguments: ces 4 arguments, ou paramètres, sont les coordonnées de deux points GPS, une latitude et une longitude par point.

Partie 3 : Codons notre formule.

Créez un fichier haversine.php ou tout autre nom tant que le fichier est bien en PHP, et on va le remplir au fur et à mesure :


<?php

class Haversine{

/* On créer une fonction avec 4 paramètres, ou arguments :

*2 latitudes et 2 longitudes qui définissent deux points GPS

*/

public function calculate($lat1, $long1, $lat2, $long2){

//On définie la constante R

$R = "6367.5";

//On calcul les deltas

$delta_lat =  deg2rad($lat2 - $lat1);

$delta_long = deg2rad($long2 - $long1);

//On calcul a

$a = sin($delta_lat/2)*sin($delta_lat/2)+cos(deg2rad($lat1))*cos(deg2rad($lat2))*sin($delta_long/2)*sin($delta_long/2);

//On calcul c

$c = 2*atan2(sqrt($a), sqrt(1-$a));

//On applique la formule

$d = $R*$c;

//On retourne la valeur pour pouvoir l'utiliser par le biais de cette classe.

return $d;

}

?>

Notre classe est codée et presque prête à l'emploi ! Pour qu'elle soit réellement prête, on va faire cela :


<?php

class Haversine{

public function calculate($lat1, ...,$long2){

//Le code est ici !

}}

$Haversine = new Haversine();

?>

Grâce à cette ligne, notre objet est déjà créer et pourra être utilisé directement dans le fichier qui contiendra ce code.

Partie 4 : Mettons en place un formulaire.

Nous allons maintenant mettre en place un formulaire pour permettre à nos utilisateurs de rentrer leurs propres données sans avoir à modifier notre code. Créez donc un fichier index.html et rentrez-y ceci :


<!doctype>

<html>

<head>

</head>

<body>

<form method="post" action="traitement.php">

<label for="lat1">Latitude 1 :</label><input type="text" name="lat1" id="lat1" />

<label for="long1">Longitude 1 :</label><input type="text" name="long1" id="long1" /> <br />

<label for="lat2">Latitude 2 :</label><input type="text" name="lat2" id="lat2" />

<label for="long2">Longitude 2 :</label><input type="text" name="long2" id="long2" />

<input type="submit" value="valider" />

</form>

</body>

</html>

Je ne me suis pas embêté avec le html, ce n'est pas l'objet de notre tutoriel donc, si vous comptez mettre en ligne cet outil, retouchez ce code !

Partie 5: The last, but not the least : Traitons et affichons les données !

Créons un fichier traitement.php . Nous allons maintenant vérifier que les champs n'étaient pas vides puis nous traiteront les données ! Je ne m'étendrais pas sur l'aspect sécurité, ce n'est pas l'objet de cet article, mais toujours si vous comptez mettre en ligne l'outil, vérifiez bien que les champs ne sont pas vides et que ce sont bien des chiffres !


<?php

extract($_POST); //$_POST['xxx'] devient $xxx

if(!empty($lat1) && !empty($long1) && !empty($lat2) && !empty($long2)){

require "haversine.php"; // On inclue notre classe.

$distance = $Haversine->calculate($lat1, $long1, $lat2, $long2);

echo $distance.' km';

}

?>

Et voilà, une classe tout à fait utilisable et très (trop) précise, en effet, vous trouvez un chiffre à 12 chiffres après la virgule. On aime la précision mais trop trop c'est trop, passons donc à 3 chiffres après la virgule !

Partie 6 : C'est vraiment la dernière, et on fignole !

Pour raccourci le chiffre, on va utiliser la fonction substr :


<?php
// On a notre distance, mais on ne l'a pas encore affichée (ligne 9)

$distance = substr($distance, 0, -10);

echo $distance;

?>

Et voilà, on a notre distance avec deux chiffres après la virgule, je vous laisse le choix de ce nombre (-9 = 3, -8 = 4 etc ..)

Ce tutoriel est fini, j'espère qu'il vous a plu autant qu'il m'a plu de l'écrire ! J'espère que vous aurez remarqué l'intégration de \LaTeX dans cet article pour m'aider à écrire les formules mathématiques, winiwake vous parlera de ça un de ces quatres !

A bientôt, et si vous avez des questions, c'est plus bas, dans les commentaires ou sur twitter : @sitewaide !

exifs

Récupérer les informations EXIF en PHP

Dans ce tutoriel, vous apprendrez à utiliser la fonction exif_read_data() de PHP dans le but d'afficher les informations exifs d'une image jpg.

Voir la démonstration

Les notions abordées sont les suivantes :

  • Les foreachs, pour parcourir un tableau
  • Les ternaires, pour condenser des conditions
  • La mise en place d'une carte Google Maps avec un marqueur
  • L'activation d'une extension PHP

Ce tutoriel est de niveau confirmé : les bases ne sont pas reprises et le fonctionnement de base n'est pas expliqué.

Liens :

Avant de vous lancer dans ce tutoriel, voilà un exemple d'utilisation des données EXIF : 500px.com


Récupérer les informations EXIF en PHP par sitewaide

Télécharger la source (exif.zip - 2,04 Mo)

Apprendre le PHP par la pratique #3 : Correction

Salut !

Pas mal de retard pour cette correction (manque de motivation ..), mais elle est là ! Je vous rappel donc les règles du précédent TP :

Nous reprenons le même code que le précédent TP (prenez la correction si vous ne l’avez pas fait et que vous ne voulez pas le faire ! )

L’utilisateur va rentrer donc une date de naissance (utilisez la technique des 3 champs, ce sera la seule manière de laquelle vous pourrez réaliser ce TP), vous devrez, si il a plus de 36 ans, qu’il est né un jour supérieur au 13 et à un mois supérieur ou égal à Avril, lui afficher un message lui affichant qu’il à gagner un gros lot !

Vous aurez besoin de tout ce que l’on a vu au tp d’avant et au conditions if..else et au mot clef AND (je vous aide trop là !!)

Passons donc à la correction :

Pour coller à la demande du TP, nous allons devoir modifier légèrement index.html de la façon suivante :

<!-- nous sommes dans la balise body -->

<form method="post" action="page.php">

<label for="nat">Nationalité</label> <input type="text" id="nat" name="nat" /><br />

<label for="prenom">Prénom</label> <input type="text" id="prenom" name="prenom" /><br />

<label for="nom">Nom</label> <input type="text" id="nom" name="nom"/><br />

<label for="adr">Adresse</label> <input type="text" id="adr" name="adr"/><br />

<label for="date">Date de naissance</label> <input type="text" id="date" name="jour" placeholder="Jour"/>

<input type="text" name="mois (sous forme de chiffres)" placeholder="Mois" />

<input type="text" name="annee" placeholder="Année"/><br />

<input type="submit" value="Valider ! " />

</form>

Voilà ! Passons au PHP !

Tout  d'abord, nous allons réfléchir à la manière de faire :

  • Nous allons utiliser du PHP,ce code ne pourras par conséquent pas être mis dans un fichier .html, le fichier index.html est donc à mettre de coter (bien qu'il serve de formulaire de base !)
  • Est-il utile de faire une autre page PHP? non car nous allons travailler sur des variables qui sont présentes dans pages.php, nos conditions seront donc dans cette page !
  • Enfin, quand mettre les conditions? Avant l'affichage, dans l'affichage ou après l'affichage? La dernière solution est la mauvaise, mais nous verrons que les deux premières sont possibles !

C'est parti pour coder, mais avant d'ouvrir page.php dans votre éditeur, nous allons réfléchir à la condition à utiliser :

  •  Nous avons 3 champs à traiter, et nous devons utiliser le mot clef AND , la condition ressemblera donc à cela :  if(... AND ... AND ... ) 
  • Chaque champ est stocké dans une variable POST que nous allons "déPostiser"
  • Enfin, nous devons tester son âge (nous nous basons sur une constante définie à 2012 en tant qu'année courante), son jour de naissance et enfin son mois de naissance !

Allez, on code !

On commence par déPostiser nos variable jours, mois, année :

page.php


<?php $nat = $_POST['nat']; //Nationalité $prenom = $_POST['prenom']; //Prénom $nom = $_POST['nom']; //Nom $adr = $_POST['adr'];//Adresse $jour = $_POST['jour']; //Jour de naissance

$mois = $_POST['mois']; //Mois de naissance

$annee = $_POST['annee']; //Année de naissance

?>

Nous venons donc de déPostiser nos variables, nous allons commencer par la méthode que je qualifierais d'instinctive pour implémenter notre condition :

page.php


<? $nat = $_POST['nat']; //Nationalité

$prenom = $_POST['prenom']; //Prénom

$nom = $_POST['nom']; //Nom

$adr = $_POST['adr'];//Adresse

&nbsp;

//On affiche les différents champ

s echo '<i>Nationalité :</i> ';

echo $nat;

echo  '<br /><i>Prenom :</i> ';

echo  $prenom;

echo   '<br /><i>Nom :</i> ';

echo  $nom;

echo  '<br /><i>Adresse :</i> ';

echo  $adr;

echo   '<br /><i>Date de naissance :</i> ';

echo  $jour;

echo '/';

echo $mois;

echo '/';

echo $annee;

if(2012-$annee > 36 && $jour > 13 && $mois >= 4){

echo "Vous avez gagné une Ferrari! ";
}

?>

Voilà, votre script est donc fini et fonctionnel ! Mais je vous parlais d'une seconde méthode : A la base, le TP ne demandait pas d'afficher un message si l'utilisateur ne remplissait pas les conditions, mais pour les besoins de cette méthode, nous allons le faire. L'astuce, ici, consiste à donner une certaine valeur à une variable, cette valeur changera en fonction de la réussite des conditions ou non.

page.php


if(2012-$annee > 36 && $jour > 13 && $mois >= 4){

$grosLot = "Vous avez gagné une Ferrari! ";

}else{

$grosLot = "Nous n'avez rien gagné, désolé !";

}

Ensuite, à la place de là où nous avions mis la condition dans le code tout à l'heure, vous mettez juste la variable $grosLot :

page.php


<?php

echo $grosLot;

?>

Et ça marche aussi !

Alors, quel intérêt pour cette technique? Tout d'abord, d'un point de vue chronophage, elle n'est pas très longue à mettre en place, malgré cela, le principal intérêt de cette technique réside dans la propreté du code : vous pouvez, grâce à cette technique, faire des "blocs" de code : Vous ne l'avez peut-être pas remarqué, mais c'est comme cela que je vous ai appris pour le premier TP :

  1. Déclaration des variables
  2. Affichage

Si l'on utilise la première méthode, schématiquement, ça donnerait cela :

  1. Déclaration des variables
  2. Affichage & conditions

Alors que, lors de l'utilisation de la seconde méthode, cela donne :

  1. Déclaration des variables
  2. Conditions
  3. Affichage

On peut donc qualifier le code d'ordonné et de propre. Dans notre cas, ce n'est pas trop utile dans le sens où nous avions seulement une condition à effectuer. Mais, si nous avions dû (et c'est un passage obligé avec php dans le but de sécuriser votre site) tester chaque valeur, ça aurait sûrement fini en "sac de code" (Vous noterez  la dérivation de l'expression sac de noeuds .. ) !

Pour en finir avec cet article, ce type de programmation est, à mon avis (qui n'est sûrement pas le meilleur) une preuve de recherche et de tentative de rendre un code facilement maintenable !

A bientôt !

Apprendre PHP par la pratique #3 : Les conditions

Salut !

Aujourd'hui, nous allons voir une partie importante et non négligeable de PHP, c'est une des fondations d'un langage dynamique : Les conditions.

Qu'est-ce qu'une condition? Une condition sert lorsque nous voulons en quelque sorte tester nos données, lorsque nous voulons voir si elles respectent certains critères. On appelle cela "conditions" car, si nos données ne respectent pas les critères requis, le programme va éxécuter un morceau de code différent de celui qu'il éxecuterais si les critères requis étais respectés. Les données doivent donc respecter certaines conditions !

Pour créer une condition en PHP et dans d'autres langages, il y a des symboles à connaître : ceux-ci vous permettent de travailler avec vos données et de tester différentes propriétés :

Symbôle Signification
== Est égal à
!= Est différent de
< Est inférieur à
> Est supérieur à
<= Est inférieur ou égal à
>= Est supérieur ou égal à

Attention ! Ne confondez pas "==" et "=", le premier signifie "Est égal à" et est utilisé dans les conditions et le second signifie "vaut" et est utilisé pour l'initialisation des variables ! 

En PHP, il existe deux types de conditions : le If .. Else et le switch, nous nous attarderons sur les deux conditions et essaierons d'en comprendre le fonctionnement !

If .. Else

Les anglophones ici présents auront -normalement- compris la signification de cette condition : Si .. Sinon. Je m'explique : la condition se divise en 2 blocs :

  • Le premier, si la condition est remplie : c'est ce bloc qui est exécuté.
  • Le second, si la condition n'est pas remplie : c'est ce bloc qui est exécuté.

Et comme un exemple vaut mieux que des mots, allons-y :


<?php

$compte_en_banque = 1600;

if($compte_en_banque == 1600){

echo "vous avez 1600€";

}

else{

echo "vous n'avez pas 1600€";

}

J'explique : la ligne if peut se traduire comme cela : "si $compte_en_banque est égal à 1600€, alors .." . Ici, $compte_en_banque vaut bien 1600€, c'est donc le bloc "if" qui est exécuté, le code affiche donc "vous avez 1600€". A l'inverse, si $compte_en_banque était différent de 1600€, il afficherait "vous n'avez pas 1600€".

Si vous n'avez pas compris, faites différents tests, changer la valeur de $compte_en_banque, vous verrez comment varie le message qui s'affiche !

Vous pouvez, maintenant, utiliser les différents symboles :


<?php

$compte_en_banque = 1650;

if($compte_en_banque <= 1600){

echo "vous avez moins de 1600€";

}

elseif($compte_en_banque >= 1600){

echo "vous avez  1600€ ou plus";

}

else{

echo "heuuu, tu as combien, au juste?";

}

Ici, deux nouveautés : tout d'abord, "elseif" : On utilise cette conditions lorsque on voudrait faire plusieurs if à la suite, c'est plus "propre" ! :)

ensuite, les symboles "<=" et ">=", qui signifie respectivement "inférieur ou égal à" et "supérieur ou égal à". On va "traduire" ce code : "Si compte en banque est inférieur ou égal à 1600, tu affiches "vous avez moins de 1600€", sinon si compte en banque est supérieur ou égal à 1600€, tu affiche "vous avez 1600€ ou plus" sinon, tu affiches "heuuu, tu as combien au juste?"". Comme vous avez vu, j'en ai profiter pour traduire le elseif en sinon si !

Ensuite, on peut aussir tester une variable pour voir si elle est vide (et définie par la même occasion ! ):


$t = "1";

if(emtpy($t)){

echo 'la variable t ne contient rien";

}else{

echo $t;

}

le mot clef "empty" nous permet de tester la présence de la variable et si elle est remplie ! Si vous aviez voulu tester le fait qu'elle soit bien initialiser, vous auriez fait comme cela :


$t = 1;

if(!empty($t)){

echo $t;

}else{

echo " t est vide";

}

Le "!" devant empty signifie "différent" et on l'utilise dans ce type de cas !

Enfin, nous allons voir que l'on peut combiner des conditions ou en "ouIfier" certaines (vous comprendrez, vous verrez ^^ ) :

</pre>
$compte_en_banque = $cb = 15000;

if($cb >= 1200 AND $cb <= 20000){

echo " vous avez entre 1200 et 20000€";
}

else{

echo "vous avez .. autres chose ! ";

}

Nous avons donc combiner deux conditions ici : "si $cb est supérieur ou égal à 1200 et inférieur ou égal à 20000€". 0 savoir que nous aurions pu remplacer AND par && !


$cb = 12;

$cb2 = 15000;

if($cb >= 1500 OR $cb2 >= 1500){

echo " vous avez plus de 1500€ sur au moins un compte ! ";

}

else{

echo "vous avez moins de 1500€";

}

Nous avons ouIfier une condition : "Si cb est supérieur ou égal à 1500 OU cb2 est supérieur ou égal à 1500€". Tout comme pour AND, OU aurait pu être changer par || (altGr+6 sous windows deux fois ! ).
Je crois que pour la condition if .. ele, c'est bon ! On passe à la prochaine ! :)

Switch

La condition switch est, à quelque chose près, un concentré de if /elseif avec un else ! je m'explique : Imaginez, vous voulez quantifier la richesse d'une personne (l'argent présent sur son compte en banque est stocké dans la variable $compte_en_banque) de façon a la mettre dans 8 catégories : à la rue, a la dure, pas facile, moyen, joli, pactole, millionnaire, milliardaire.  Avec un if/elseif, il faudrait faire ça :

</pre>
<?php

$compte_en_banque = $cb = 15000;

if($cb == 0){

echo "à la rue";

}

elseif($cb ==100){

echo "à la dure"

}

elseif($cb == 500){

echo "pas facile";

}

elseif($cb == 1500){

echo "moyen";

}

elseif($cb== 2500){

echo "joli";

}

elseif($cb== 5000){

echo "pactole";

}

elseif($cb == 1000000 ){

echo "Millionnaireé;

}

elseif($cb == 1000000000){

echo "milliardaire";

}

else{

echo "problème ! ";

}

J'ai mal à la main. Ecrire toutes ces conditions est .. barbant, répétitif et j'en passe ! PHP à donc intégré un système qui nous facilite un peu la tache, switch :


<?php

$cb = 1500;

switch($cb){

case 0:

echo "à la rue";

break;

case 100:

echo "à la dure";

break;

// ...

cas 1000000000:

echo "Milliardaire";

break;

default:

echo "problème";

}

explications : switch($cb) nous permet à la fois d'initialiser la condition et de lui donner la variable sur laquelle nous allons travailler(ici, $cb). Ensuite, nous avons le "bloc" de condition :

case 0: => Dans le cas ou $cb est égal à 0

Echo "à la rue"; => on affiche "à la rue"

break; => On termine l'instruction.

et ainsi de suite !

enfin, default: => Equivalent du else

echo "problème" => Ce qui est affiché quand rien ne correspond.

Ici, dans notre cas, cette condition afficherait : "moyen".

Voilà pour switch ! Passons au boléen (eh oui, il y a une surprise :p )

Les boléens

Les boléens sont des variables .. spéciales, en effet, elle ne peuvent prendre que deux valeurs : true ou false , et, pour les utiliser dans les conditions, il y a quelques subtilitées toujours utiles à savoir !

allez, l'exemple de ce qui nous paraitrait "logique" au premier abord :


<?php

$b = true; // C'est un boléen

if($b == "true" ){

echo "bouh";

}else{

echo "aaah";

}

Voilà un exemple tout bête, avec des messages d'erreurs ou de réussites tout aussi bêtes ;)

Maintenant, je vais vous montrer deux "techniques" qui marchent avec les boléens (je ne montre que le if)


$b = true;

if($b == true) //Sans guillemets, ça marche !

if($b)//Sans rien, ça marche !

Je vous explique rapidement :

  • Dans le premier cas, true n'est pas considéré comme une chaîne de caractères, mais une entité à part entière : pas besoin de guillemets !
  • Dans le second cas, la condition équivalente est "if($b == true)", tout simplement ! :)

Et voilà, c'est fini pour le cours !

TP

Nous reprenons le même code que le précédent TP (prenez la correction si vous ne l'avez pas fait et que vous ne voulez pas le faire ! )

L'utilisateur va rentrer donc une date de naissance (utilisez la technique des 3 champs, ce sera la seule manière de laquelle vous pourrez réaliser ce TP), vous devrez, si il a plus de 36 ans, qu'il est né un jour supérieur au 13 et à un mois supérieur ou égal à Avril, lui afficher un message lui affichant qu'il à gagner un gros lot !

Vous aurez besoin de tout ce que l'on a vu au tp d'avant et au conditions if..else et au mot clef AND (je vous aide trop là !!)

Bonne chance et à dans deux jours !!

Apprendre PHP par la pratique #2: Correction

Salut !

Je vous fournis la correction du 2eme A2PLP (Apprendre PHP Par La Pratique :p )qui concernait les variables, les formulaires et les commentaires :

Méthode

Tout d'abord, il nous faut un formulaire sur lequel nous appuyer pour le PHP :

index.html


<!-- nous sommes dans la balise body -->

<form method="post" action="page.php">

<label for="nat">Nationalité</label> <input type="text" id="nat" name="nat" /><br />

<label for="prenom">Prénom</label> <input type="text" id="prenom" name="prenom" /><br />

<label for="nom">Nom</label> <input type="text" id="nom" name="nom"/><br />

<label for="adr">Adresse</label> <input type="text" id="adr" name="adr"/><br />

<label for="date">Date de naissance</label> <input type="text" id="date" name="date"/><br />

<input type="submit" value="Valider ! " />

</form>

Nous avons maintenant un formulaire sur lequel nous appuyer. Dans les paramètres de la balise form, nous avons dit que le formulaire envoyait les données vers page.php (créez cette page) et utilisait le format "POST". Nous allons écrire les différentes variables :

page.php


<?php

$nat = $_POST['nat']; //Nationalité

$prenom = $_POST['prenom']; //Prénom

$nom = $_POST['nom']; //Nom

$adr = $_POST['adr'];//Adresse

$date = $_POST['date'];//Date de naissance

?>

Maintenant que tout est stocké, affichons les données :

page.php


<?

$nat = $_POST['nat']; //Nationalité

$prenom = $_POST['prenom']; //Prénom

$nom = $_POST['nom']; //Nom

$adr = $_POST['adr'];//Adresse

$date = $_POST['date'];//Date de naissance

//On affiche les différents champs

echo '<i>Nationalité :</i> ';

echo $nat;

echo  '<br /><i>Prenom :</i> ';

echo  $prenom;

echo   '<br /><i>Nom :</i> ';

echo  $nom;

echo  '<br /><i>Adresse :</i> ';

echo  $adresse;

echo   '<br /><i>Date de naissance :</i> ';

echo  $date;

?>

Voilà, le script marche parfaitement ! Je ne sais pas ce que vous en pensez, mais je me rappelle qu'a mes débuts en PHP, c'est la partie interaction avec les formulaires que je préferais !

Deux petites choses à noter :

  1. Il n'y à ici aucune vérification de faite, l'utilisateur peut ne pas rentrer tout les champs ou faire n'importe quoi avec. Une partie des vérifications se fera au prochain TP ;)
  2. Je vous donne d'avance le gros morceau du prochain numéro de A2PLP : Les conditions !

Voilà, si vous voulez tester la démo : http://site-waide.fr/demos/A2PLP/2/

Enfin, vous pouvez vous entrainez avec d'autres exemples et me les envoyer par mail pour que je les corriges ou que je vous aide si vous avez un problème !!

Salut !

P.S: On m'a demandé comment "forcer" l'utilisateur à entrer une date : Avec notre niveau, ce n'est pas possible, la meilleur technique consisterait à utiliser des selects dans votre formulaire. A la place d'avoir une seule variable date, vous en auriez trois : un jour, un mois, une année !

Apprenez PHP par la pratique #2 : Les variables, les formulaires et les commentaires

Salut à tous !

Je poursuis comme prévu la série, et aujourd'hui, on vas voir la base de php, les variables !

Qu'est-ce qu'une variable? Une variable est, dans la pratique, un mot précédé d'un symbole qui vous permet de stocker des données temporairement et de pouvoir réutiliser ces données plus loin dans la page.

Ensuite, le titre parle des formulaires, pour ceux qui auraient oublié comment ça marche en html, un petit rappel :


<form method="post" action="page.php">

<input type="text" name="nom" />

<input type="submit" value="Bouton" />

</form>

Explication :

form : On déclare le formulaire, on dit au navigateur "ici, ça sera un formulaire"

method : C'est le type d'envoi que vas faire le formulaire, ici, post, les données ne seront pas visibles par l'utilisateur.

action : Vers quelle page le formulaire pointe

input : On déclare un champ modifiable

type : Quel type de bouton est-ce? un champ de texte (text/texte) ou un bouton de validation(submit/soumettre)

name : Le nom du champ, qui nous sera très utile en PHP !

Allé, maintenant, on passe au PHP : comment créer(=initialiser) une variable et comment récupérer les données d'un formulaire !

Initialiser une variable

Avant de rentrer dans le vif du sujet, je vais vous montrer comment on "écrit" du php : En effet, le php, comme le html, doit être "déclaré", on doit dire au serveur ou se commence et ou se termine le script. On vas donc utiliser ces différents "tags" :


<?php //début du script

?> //Fin du script

Et enfin, pour conclure cette entête, le texte qui se trouve après les "//" sont des commentaires, cela veut dire qu'ils ne seront pas visibles sur votre site, le visiteur ne les verras pas. Pour mettre des commentaires, il y a deux manières :


<?php

//C'est un commentaire qui commence par //
//Il ne marche que sur une ligne !

/* C'est encore un commentaire, mais il commence par /*

et il marche sur plusieurs lignes ! Il finit par */

?>

Allé, maintenant que vous savez ça, on passe à la partie sur les variables !

En php, contrairement à beaucoup de langages, on initialise nos variables à la volée, pour mieux comprendre, voici un exemple :

PHP :


<?php

$variable = 4;

?>

En C# (exemple) :


int variable;

variable = 4;

Voilà pourquoi on qualifie ce type d'initialisation "à la volée" en PHP: Vous n'avez pas besoin de créer votre variable avant ni de lui attribuer de type de données. Facile !

Allé, un exemple plus concret, avec l'utilisation de "echo" qui permet d'afficher des caractères à l'écran :


<?php

//On initialise les variables

$prenom = "Henri";

$nom = "Bidule";

$age = "14";

// On les affiches

echo "prenom :";

echo $prenom;

echo "<br /> Nom : ";

echo $nom

echo <br /> Age : ;

echo $age;

?>

Essayez ce code ! Vous verrez qu'il y a plusieurs problèmes, et c'est le cas, voici certaines règles à respecter avec echo et les variables :

  • Quel que soit votre instruction (=ligne du code) elle se finit par un ";"
  • Si vous voulez écrire du texte, il doit être entouré de ""(quotes) ou de ''(guillemets simples)
  • si vous voulez afficher une variable, ne mettez pas de quotes ou de guillemets !

Voilà, donc si on suit ces "règles", le code donne ça :


<?php

//On initialise les variables

$prenom = "Henri";

$nom = "Bidule";

$age = "14";

// On les affiches

echo "prenom :";

echo $prenom;

echo "<br /> Nom : ";

echo $nom; // Un ; en plus ici !

echo "<br /> Age :" ; // Les quotes en plus ici !

echo $age;

?>

De plus, comme vous venez de le voir, on peut utiliser du html avec echo !

Récupérer les données d'un formulaire

Je vous ai fait au début un petit récap' sur les formulaires, et vous avez vu trois choses les attributs suivants :

  • method : Ce peut-être soit post, soit get, la différence réside en deux points : post, l'utilisateur ne voit pas les données passée et la taille de celles-ci sont illimitées, pour get, l'utilisateur voit les données dans l'URL et la taille des données ne peut dépasser 255 caractères !
  • action : C'est la page vers laquelle pointe le formulaire, c'est dans cette page que le code php qui traitera le formulaire se trouvera.
  • name : C'est avec cet attribut que nous récupérerons les données du champ de texte !

Voici les différentes manières de récupérer des données :


<?php

$_POST['name']; //Ici, dans le cas d'une requète POST

$_GET['name']; //Ici, dans le cas d'une requète GET

/* vous avez pû voir comment on utilise l'attribut name : on le met entre crochet puis entre guillemets ! */

?>

Passons maintenant à un exemple pratique :

Page du formulaire :


<form method="post" action="page.php">

<input type="text" name="prenom" placeholder="prenom" /> <!-- placeholder permet d'inscrire du texte dans le champ -->

<input type="submit" value="envoyer ! " />

</form>

page.php :


<?php

$prenom  = $_POST['prenom']; // On stocke la valeur du champ prénom dans la variable prenom

echo "tu t'appelles ";

echo $prenom; // On vas afficher "tu t'appelles {le prenom rentré}

?>

Voilà ! Je crois que la partie cours est finie ! Place maintenant à vos devoirs !

LE TP

Objectif : Créer une page avec un formulaire demandant les données suivantes : Nationalité, prénom, nom, adresse et date de naissance. Ces données devront être affichées sur une page suivante avec chaque champ correspondant en italique (exemple : prenom : hubert, "prenom" sera en italique). Vous devrez associé chaque valeur POST à une variable (comme dans l'exemple plus haut). De plus votre code sera commenté.

Outils : Les variables, les formulaires, les commentaires, votre cerveau

Date de fin : 21/06/2012

C'est parti ! Si vous avez un problème, une question , n'hésitez pas dans les commentaires, ça pourrait aider les autres participants ! Si vous désirez une correction en avance, contactez moi par le formulaire de contact en copiant votre code dans celui-ci, mais n'utilisez pas les commentaires !

A bientôt !

Apprenez PHP par la pratique #1

Salut à tous !  Aujourd'hui, je lance une nouvelle série destinée aux néophytes du développement web qui veulent apprendre PHP. Au cours de cette série, vous apprendrez à utiliser et à maîtriser PHP. Vous vous posez peut-être la question suivante : "Pourquoi lances-tu ce genre de série, alors que plein de sites nous proposent des tutoriels pour apprendre ce langage?". Tout simplement car la plupart de ces sites vous apprenne la théorie avec quelques TPs, où vous réutiliserez les notions de tout un chapitre. Ici, le but est d'axé l'apprentissage sur ces TPs, que vous voyiez concrètement votre avancée et l'utilisation de ce langage.

Ces TP ce passerons de la manière suivante : Je vous poserais un objectif avec un "mini-cours" sur la notion-clé utilisée pour arriver à réaliser le système proposé, puis je vous mettrais des liens complémentaires en annexe. Vous aurez deux jours pour réaliser ce TP avant que je mette la solution publiquement, mais, si vous finissez avant ou que vous voulez un corrigé "personnalisé", vous n'aurez qu'a m'envoyer un mail via la formulaire de contact.

J'essairais dans la mesure du possible de mettre à chaque fois les solutions avec tout les OS (osx, windows, linux) si il y a des différences.

Aujourd'hui, nous allons mettre en place notre environnement de développement : Il n'y aura donc pas de correction dans 2 jours, mais votre premier TP ;). C'est parti !

1-Executons le PHP

Le php un langage côté "serveur", c'est à dire qu'il faut une sorte de traducteur pour faire marcher ce langage sur votre PC/MAC car votre ordinateur n'arrive pas à "déchiffrer" le code que vous lui envoyez et ne sait donc pas comment l'éxécuter. Nous allons donc installer ce traducteur sur nos différents OS.

Windows

Nous allons donc mettre en place un environnement de développement que nous qualifierons de "tout-en-un" : En effet, vous avez la possibilité d'installer chaque composant de l'éxécuteur un a un, mais cette méthode à comme désavantage d'être obscur et semée d'embûches pour un débutant ! Nous allons donc utiliser WAMP, "Windows Apache Mysql PHP" : Les trois mots après PHP sont enfaite les différents composant de l'éxécuteur :

  • Apache permet de gérer les requêtes HTTP, c'est enfaite un serveur HTTP : C'est grâce à lui que nous pouvons visiter des pages internet. "HTTP", késako? C'est un protocole de communication (=langage qu'utilisent les ordinateurs pour se parler) utilisé sur le web pour naviguer de page en page. C'est le protocole que vous utilisez actuellement, vous pouvez voir cela dans la barre d'adresse de votre navigateur : si vous ne le voyez pas, c'est normal : la plupart des nouveaux navigateurs cachent cette parti de l'url ;)
  • MySQL est un système de gestion de base de données : Il vous permettra de sauvegarder durablement vos informations lorsque vous ferez votre site!
  • PHP, lui, est le langage que nous utiliserons et qui interargira avec ces deux logiciels.

Téléchargeons donc WAMP : http://www.wampserver.com/#download-wrapper

Je vous passe l'installation, sauf pour la configuration SMTP : Laisser tomber, cela ne vous servira que lorsque vous enverrez un mail et, croyez-moi, quand vous en êtes là, c'est que vous avez normalement déjà un serveur qui supporte le PHP !

Voilà, si vous avez tout laissé comme c'était lors de l'installation, vous avez un dossier C:\wamp avec un icone rose "W" : c'est ce qui vous permettra de lancer votre serveur ! Vous stockerez vos fichiers PHP dans le dossier "www" ! Vous avez maintenant accès à votre "serveur" à l'adresse http://localhost/

Et voilà, vous pouvez maintenant éxécuter du php sur votre PC !

Mac

Pour mac, je serais plus concis car je n'ai que très peu d'expérience avec cet OS et j'écris cet article sur windows, mais si vous avez une erreur, n'hésitez pas à m'envoyer un mail : je vous aiderais volontiers !

Mac à déjà une partie des composants nécessaires à PHP, mais comme avec windows, nous choisirons une solutions clés en mains : Mamp http://www.mamp.info/en/index.html

Toujours comme windows, si vous laissez les paramêtres d'origine, vous retrouverez votre dossiers MAMP dans votre dossier Applications ;) Vous mettrez vos différents fichiers php dans le dossier Htdocs, et votre serveur est toujours accessible à l'adresse http://localhost:80/ normalement !

Linux

Pour linux, je vous l'avoue, je suis dépassé, ça fait tellement longtemps que je ne l'ai plus utilisé. Mais je vous propose LAMP, que je vous laisse installer par l'intermédiaire de la doc ubuntu  ! http://doc.ubuntu-fr.org/lamp

2-Ecrivons du PHP

Pour cela, nous pourrions utiliser le bloc-notes windows ou tout autre équivalent sur les différents systèmes. Mais il vaut mieux se tourner vers quelque chose de plus performant du fait de la taille que vos scripts peuvent vite prendre. Je vais donc vous conseiller plusieurs IDE (Integrated Development Environment)/éditeurs de code pour démarrer mais bien sur, c'est à vous de faire votre choix  !

Windows

Mon choix se porte sur 3 IDE :

  • Notepad ++, simple, léger mais redoutablement rapide et efficace
  • Sublime text 2, Un notepad ++ plus avancé et, à mon avis, plus beau !
  • Komodo edit, un vrai IDE, plus lourd que les deux précédent mais beaucoup plus complet et plus personnalisable

Dans la pratique, je vous conseille notepad++ pour commencer, sublime text quand vous vous sentirez à l'aise et komodo lorsque vous vous lancerez dans des projets (bien que sur certains projets je travail toujours avec notepad++ ;) )

Mac

Le problème de osx, c'est que tout est très beau, très efficace et que tout se paye (troll on), je vais donc vous proposer deux éditeurs gratuit dont un mythique et un payant, je ne vous cache pas que je préfère d'avance le payant qui est juste magnifique et que personne ne me contrediras sur ce point, je pense pouvoir l'affirmer !

  • TextWrangler, gratuit, sympa et simple à utiliser !
  • Vim, gratuit, en ligne de commande, c'est THE éditeur mythique (exemple : lancer un terminal, positionner vous sur votre dossier htdocs et faites vim index.php)!
  • Enfin, Coda, il magnifique et je l'aime <3, c'est le meilleur éditeur que j'ai jamais essayer, j'attends toujours de le voir un jour arriver sur windows (ce qui est quand même peu probable :) )

Linux

Linux, je vous conseil nano, en ligne de commande, à la façon de vim ou komodo edit, qui est cross platform !

Pour vous aider dans votre choix, choisissez d'abord des éditeurs gratuit, vous verrez ensuite si ça vaut le coup de payer un éditeur ;) Enfin, vous le verrez bien assez tôt, l'éditeur est avant tout une question de goût : quand on passe plusieurs heures sur ce logiciel, on aime bien qu'il soit à notre goût !

3-Vérifions si tout marche bien !

Voilà, PHP est prêt à être éxécuté. Si vous voulez vous en assurer , créer un fichier "tuto.php" dans les différents dossiers de php (www, htdocs etc ..) et ouvrez-le avec votre éditeur. Ensuite, écrivez cela dedans :


echo 'Bah ça alors, PHP marche ! ';

allez ensuite à l'adresse http://localhost/tuto.php sur windows et linux ou http://localhost:80/tuto.php sur osx : Vous deviez voir apparaître "Bah ça alors, PHP marche ! ". Si ca n'est pas le cas, n'hésitez pas à commenter ou à m'envoyer un mail !

A dans deux jours ! :)

sécurité

Sécuriser ses formulaires PHP

Salut à tous ! Le titre vous évoque peut-être quelque chose si vous avez vus ma dernière vidéo, en effet, je vous disais d'aller sur google, que le web regorgait de ce genre d'article etc .. Mais après une (très) courte recherche, je me suis dit que quitte à faire la vidéo, autant faire le billet qui allait avec ! On va donc, dans ce billet, traiter de la sécurité dans les formulaires sur votre site web, notamment lorsqu'on les affiche, pour éviter les injections côté client.

Contexte

Je reprends le même que celui de la vidéo : Nous souhaitons mettre en place un espace membre qui contiendra donc un formulaire d'inscription dont il est vitale de sécuriser les données avant de les enregistrer dans la Base De Données (BDD), voici le formulaire en question :


<form method="post" action="insert.php">

 <input type="text" placeholder="pseudo" name="pseudo" />
 <input type="text" placeholder="mail" name="mail" />
 <input type="password" placeholder="password" name="pass" />
 <input type="submit" value="valider" />

</form>

Au vu de ce formulaire, nous aurons trois "sortie" (output) à filtrer: le pseudo, le mail et le mot de passe.

Méthode

Pour sécuriser ses formulaires, nous allons utiliser deux "filtres" PHP :htmlentities: elle échappe les caractères html, et strip_tags: supprime toutes les balises PHP et HTML du code. Nous pourrions superposer les filtres sur chaque variables, mais nous allons tenter d'automatiser au maximum cette tâche grâce à une fonction, que nous nommerons "secure".

Au travail

Commençons par la fonction : Elle doit être simple à mettre en place, commentée, utilisée les deux filtres évoqués plus haut et surtout retourner une valeur sécurisée de la variable qu'elle aura prise en commentaire. Si on met bout à bout cette fonction, cela nous donne :


<?php

//On déclare la fonction

function secure($var){

//On "nettoie" la variable avec les trois filtres

$foo =  htmlentities(strip_tags($var));

//On retourne la variable nettoyée

return $foo

}

La fonction (secure.func.php) est donc faite, nous n'avons plus qu'a l'appliquer aux variables  :

La fonction "prepare()" de PDO protège vos variables, il est donc inutile de l'appliquer aux différentes variables.


<?php

//On inclue la fonction créée plus haut

require_once "secure.func.php";

//Je ne met que la requête, je passe l'étape de connexion à la BDD

$req = $db->prepare("INSERT INTO users (id, pseudo, mail, pass) VALUES('', :pseudo, :mail, :pass)" ) ;

&nbsp;

//On sécurise les variables dans la requète
 $req->execute(array(
 "pseudo" =>$_POST['pseudo'],
 "mail" =>$_POST['mail'],
 "pass" =>md5($_POST['pass'])
 ));

Maintenant, nous allons nous occuper de l'affichage de ces données, c'est ici que la fonction sera utile :


require_once "secure.func.php"

$req->db("SELECT * FROM users");

while($data = $req->fetch()){

echo secure($data['pseudo']);

}

Voilà, nous avons donc sécuriser notre formulaire, en nettoyant nos données. Même si cela peut vous paraître superficiel ou inutile, ne passez jamais cette étape, je m'en veux même de l'avoir passer sur la vidéo de l'espace membre : Une erreur comme celle-là peut vous coûter des heures de travail alors que vous ne "perdez" que 10 minutes à sécuriser ces variables !

Si jamais vous pensez qu'une autre fonction, ou qu'un autre filtre serait intéressant à ajouter à cette fonction, n'hésitez pas à la mettre en commentaire !

Salut !

edit

Merci à @YannickDa et le hollandais volant pour leurs informations, l'article à été édité dans leur sens !

[#1]Créer un compteur en CSS

Hop ! J'ai parlé la semaine dernière d'une série d'astuces qui porterait sur tout ce qui touche au web sur mon twitter. Je vous présente donc le premier volume : la propriété counter en css !  Amusez-vous bien !

Utilisation de cette propriété :

  • Slider
  • Présentation
  • Mise en page avec php
  • Javascript(effet grâce aux numéros)
  • etc ...

[dailymotion]http://www.dailymotion.com/video/xmgr0u_astuce-1-creer-un-counter-en-css_tech[/dailymotion]

A bientôt !

zend

Installation du zend Framework ...

... Une vraie galère !  Sur leur quickstart, les dev' de Zend nous disent de juste télécharger le Zend Server et ce sera fait, sinon, ajoutez juste le dossier library dans l'include_path du php.ini. Réellement? Ca marche pas !! Bon, ça y est, j'ai fini ma période pas content ^^. Je vais donc essayer de vous expliquer simplement comment installer le Zend Framework sur wamp, et c'est au final assez simple ! C'est parti, suivez le guide !

Téléchargeons et préparons le framework !

Allez sur le site de zend framework, http://framework.zend.com/, cliquez sur le GROS bouton "download now" et télécharger le framework. Pour les besoins du tuto, j'ai pris le full, mais le minimal devrait suffire :).Après un interminable temps de téléchargement, décompresser le framework, et ouvrez le dossier (Ca aussi ça prends du temps ^^) , nous nous occuperons de 2 dossiers seulement !

Préparons l'environnement !

Tout d'abord, si vous avez bien la dernière version de wamp en cours ( la 2.1), allez dans le dossier C:\wamp\bin\php\php5.3.4 et ouvrez le fichier php.ini . Une fois cela fait, allez à la ligne 793 (Je ne suis pas sur de cette ligne, chez moi, c'est celle là, mais cela peut varier), vous devriez trouver ça : Vous allez supprimez la virgule devant le "include_path", qui décommentera et rendra active cette directive.

Une fois la directive activée, allez à la racine de votre ordinateur, le dossier C:\ et créez l'arborescence de dossiers suivante :

Enfin, allez dans le panneau ordinateur, faites clique droit->propriétés->paramètres système avancés->variables d'environnement.ensuite, à la fin de la valeur de la variable Path, rajoutez cela :

;C:\wamp\bin\php\php5.3.4;C:\wamp\bin\php\php5.3.4\zend-bin\;

Voilà, la préparation est finie, on installe le framework maintenant !

Dernière ligne droite !

Dans le dossier du framework, prenez le dossier bin, et mettez le dans le dossier C:\wamp\bin\php\php5.3.4\ puis renommez le dossier bin en zend-bin.

Enfin, prenez le dossier Zend qui se trouve dans le dossier library et mettez le dans le dossier C:\php\includes\

C'est fini !

Pour tester si tout à bien marché, lancer la commande (éxécuter->cmd) et tapez zf --help Si vous ne voyez aucune erreur, c'est bon ! Le Zend Framework est installé !

Bon développement !