Trieur Organisé de Solutions et de Ressources Informatiques

logo du site TOSRI

Mot-clé - programmation

Fil des billets - Fil des commentaires

22 février 2012

Niveau : personne ayant des connaissances informatique de niveau BAC+2/BAC+3

Uploader vos fichiers via PHP en 3 lignes

Introduction

Bonjour,

Non je ne vous mens pas vous pouvez envoyer vos fichiers sur un serveur par un formulaire HTML en seulement 3 lignes de codes, démonstration :

<?php
    include_once "Uploader.php";
    $up = new Uploader();
    $r = $up->upload("monFichier", $dossier);
?>

Facile hein ?

Bon d'accord, je vous explique : j'utilise un fichier qui contient une classe PHP que j'ai réalisée qui effectue des uploads via un minimum de paramètres. Je ne détaillerais pas totalement cette classe au sein de cet article, le fichier est commenté. Je vais donc simplement faire une démonstration des méthodes qu'elle utilise.
 

Présentation externe

Commençons par mettre ses 3 lignes au milieu d'un code plus complet et surtout plus détaillé/commenté :

<?php
// définir un dossier de sauvegarde des fichiers envoyés
define("dossier", dirname(__FILE__)."/fichiers");

// inclure la classe de l'Uploader
include_once "Uploader.php";

    // création d'un objet Uploader
    $up = new Uploader();

    // test pour savoir si des fichiers ont été envoyés
    if($up->demande()){
        $r1 = $up->upload("monFichier", dossier);             // Upload du fichier "monFichier"       
        $r2 = $up->uploads("monFichier2", dossier, false);    // Upload des fichiers "monFichier2"
    }

// un formulaire qui fait appel à la même page à la validation et qui peut envoyer des fichiers
?>
<form action="?" method="post" <?php echo $up->attForm()?>>
<?php
echo $up->inputSize(); // écriture d'un champ pour limiter la taille des fichiers à envoyer

// puis les champs pour envoyer les fichiers et un bouton de validation
?>
    <input type="file" name="monFichier" size="50" /><br />
    <input type="file" name="monFichier2[0]" size="50" /><br />
    <input type="file" name="monFichier2[1][a]" size="50"/><br />
    <input type="file" name="monFichier2[1][b]" size="50"/><br />
    <input type="submit" value="GO" />
</form>

Vous obtenez visuellement :






Pour ceux qui n'ont pas encore cliqué sur les boutons, vous ne pouvez pas envoyer de fichiers. ^^

Ensuite, les lignes qui ne sont pas claires :

if($up->demande()){

C'est tout bêtement une fonction qui regarde si $_FILES contient des éléments, son code est simple :

function demande(){
    return !empty($_FILES);
}


Les méthodes "upload()" et "uploads()"  seront vues plus loin, voyons d'abord la page sans envoyer de fichiers.

<form action="?" method="post" <?php echo $up->attForm()?>>

L'entête du formulaire est étrange n'est-ce pas ?
En fait un formulaire qui envoie des fichiers doit posséder un attribut particulier : enctype="multipart/form-data"
Comme on dit que les développeurs sont feignants, cette fonction vous permet de ne pas connaitre la syntaxe exacte de l'attribut, affichez juste le résultat de cette méthode.

function attForm(){
    return 'enctype="multipart/form-data"';
}

Ensuite cette ligne au début du formulaire :

echo $up->inputSize();

Elle n'est pas obligatoire, elle affiche un champs de type input hidden qui limite la taille des fichiers à envoyer. Elle peut prendre un paramètre qui correspond en octets à la taille maximale des fichiers.

Les 4 input file qui suivent correspondent aux différentes syntaxes de l'attribut "name" pour envoyer des fichiers.
 

Présentation des méthodes principales

Les méthodes "upload()" et "uploads()". Que font-elles ?

Ces méthodes permettent de déplacer les fichiers depuis la zone temporaire du serveur vers le dossier de votre choix.

La première prend entre 2 et 4 paramètres et la seconde entre 2 et 3. Leur différence hormis le nombre de paramètres est que l'une envoie un seul fichier alors que la seconde peut envoyer plusieurs.

Définition de la fonction "upload"

function upload($name, $dossier, $ecraser=false, $indices=array())

Détails des paramètres :

  1. Une chaine de caractères correspondant à l'attribut name d'un input file.
  2. Une chaine de caractères correspondant au dossier dans lequel doit être transféré le fichier.
  3. Un booléen pour déterminer si en cas de fichier possédant le même nom on écrase l'existant ou pas.
  4. Un tableau d'indices sous forme de chaine de caractères. Ce paramètre sera vu plutôt avec la seconde méthode, considérons le comme un tableau vide.

Avec les paramètres détaillés je me demande si il est nécessaire d'expliquer ce que fait cette méthode : elle déplace le fichier identifié par "$name" dans le dossier "$dossier" en écrasant ou pas le fichier si il existe déjà avec "$ecraser".

Avant de décrire la seconde fonction je vais préciser un point qui doit être flou depuis un certain temps maintenant : "Pourquoi avoir créé 2 fonctions pour la même opération ?".

Tout simplement parce que la structure de $_FILES dépend de la forme des attributs "name" des "input", je veux parler de la structure en tableau. Affichons ce que $_FILES retourne avec le formulaire ci-dessus :

Array
(
    [monFichier] => Array
        (
            [name] =>
            [type] =>
            [tmp_name] =>
            [error] => 4
            [size] => 0
        )

    [monFichier2] => Array
        (
            [name] => Array
                (
                    [0] =>
                    [1] => Array
                        (
                            [a] =>
                            [b] =>
                        )

                )

            [type] => Array
                (
                    [0] =>
                    [1] => Array
                        (
                            [a] =>
                            [b] =>
                        )

                )

            [tmp_name] => Array
                (
                    [0] =>
                    [1] => Array
                        (
                            [a] =>
                            [b] =>
                        )

                )

            [error] => Array
                (
                    [0] => 4
                    [1] => Array
                        (
                            [a] => 4
                            [b] => 4
                        )

                )

            [size] => Array
                (
                    [0] => 0
                    [1] => Array
                        (
                            [a] => 0
                            [b] => 0
                        )

                )

        )

)

Dans le cas de "monFichier2" on voit que les résultats sont également sous la forme d'un tableau. Comme il est possible de souhaiter un comportement différent pour chaque fichier avec le même name, j'ai ajouté cette seconde méthode.

Définition de la fonction "uploads"

function uploads($name, $dossiers, $ecraser=false)

Détails des paramètres :

  1. Une chaine de caractères correspondant à l'attribut name d'un input file.
  2. Un tableau de chaines de caractères ou une chaine de caractères correspondant aux dossiers dans lesquels doivent être transférés les fichiers envoyés.
  3. Un tableau de booléens pour déterminer si en cas de fichier possédant le même nom on écrase l'existant ou pas.

Vous remarquez que là on ne voit plus le paramètre 4 de la méthode précédente.
En fait ce paramètre de "upload" a été mis car il est utilisé par "uploads". Il s'agit de la liste des indices qui permet de déterminer quel est l'exact fichier parmi ceux de "monFichier2" on souhaite traiter (exemple : pour pour monFichier2[1][b], il faut passer le tableau : array("1", "b")).

Dans le cas de plusieurs fichiers la recherche des indices est interne, puis on fait appel à "uplload()", d'où l'utilité de son 4ème paramètre.

Vous voyez que le second paramètre (les dossiers de destination) a changé depuis la première méthode. En effet vous pouvez utiliser un tableau de dossier pour définir un dossier de destination par fichier. Pour cela les indices doivent correspondre à ceux du "name".
Exemple :

Array
(
    [0] => dossier1
    [1] => Array
        (
            [a] => dossier2
            [b] => dossier3
        )

)

Mais ce qui est plus intéressant c'est que vous pouvez dire "Je veux que le fichier [0] aille dans le dossier 1 mais que les fichiers [1][a] et [1][b] aillent dans le dossier 2.".

Au lieu d'avoir un tableau avec [a] et [b] vous avez juste une chaine avec le nom du dossier.
Vous écrivez simplement :

Array
(
    [0] => dossier1
    [1] => dossier2
)

Sympa non ?
De même vous pouvez vouloir mettre vos fichiers dans le même dossier auquel cas vous n'avez même plus besoin de tableau, indiquez juste le nom du dossier.

Ce fonctionnement marche peut importe le niveau de profondeur du tableau. Veillez simplement à vous assurer que les indices soient exacts.

Vous voulez savoir un truc marrant ? Le booléen pour savoir si on écrase ou pas le fichier ? Et bien il fonctionne comme le tableau des dossiers !
Vous pouvez grouper ou détailler l'écrasement de vos fichiers !

En conclusion si vous ne voulez pas vous prendre la tête à savoir si il y a un ou plusieurs fichiers sur le même name, utilisez "uploads" avec un dossier, le booléen pour savoir si on écrase les fichiers et il fera le reste.

Présentation de méthodes internes

Cette classe possède 2 méthodes d'une importance capitale que je me doit de vous détailler.

function nomSimple($n)

Cette méthode altère une chaine de caractères ou dans le cas qui nous intéresse, un nom de fichier.
Elle altère une chaine de manière à la "simplifer" de plusieurs fioritures potentielles qui sont potentiellement problématiques. J'ai d'ailleurs fait l'expérience de pas mal d'erreurs pas potentielles du tout dont je me serais bien passé, notamment avec les accents et les encodages.

Les opérations qu'elle effectue :

  1. Elle définie un caractère de remplacement pour les espaces blancs (ici le tiret "-").
  2. Elle retire le caractère de remplacement des espaces par un espace (si si, vous allez voir il n'y a pas de problème).
  3. Elle remplace TOUS les GROUPES d'espaces par LE caractère de remplacement des espaces (en partant de "a - b" on obtient avec l'étape 2. "a-b" et "a---b" sans l'étape 2)
  4. elle retire les accents que l'on connait, en remplaçant non pas les caractères en eux-mêmes mais leur entité html (exemple : 'é' et 'è', on remplace '&eacute;' et '&egrave;' par 'e'). Les entités trop complexes seront remplacées par le tiret bas "_".
  5. Elle remplace les derniers caractères complexes par un tiret bas "_".
  6. Elle met la chaine en minuscules.

Cette opération est appliquée sur le nom des fichiers envoyés, elle est destinée à simplifier les noms de fichier pour une utilisation ultérieure.

function unique($nom, $dossier)

Cette méthode retourne un nom de fichier qui n'existe pas dans le dossier $dossier en se basant sur le nom de fichier $nom. Lorsque vous demandez à ne pas écraser un fichier existant, cette méthode sera appelée pour trouver un nom qui n'est pas pris.

Pourquoi je vous parle de cette méthode ? Parce-que votre serviteur s'est bien embêté à vous fournir la possibilité de renommer vos fichiers selon vos masques.

Concrètement vous pourrez placer le numéro du fichier où vous voulez.

La liste des masques doit être présenté sous la forme d'un tableau où l'indice est le masque et la valeur le texte à remplacer.
Les masques présents par défaut sont :
Array(
    '#^(.*)\.([^.]*)$#' => '$1(%s).$2',
    '#^(.+)$#' => '$1(%s)'
);


Concrètement "fichier.txt" devient "fichier(1).txt" (masque 1) alors que ".fichier" devient ".fichier1" (masque 2).
Dès qu'un masque est trouvé le remplacement est appliqué. N'oubliez pas le "%s" dans le remplacement il n'agit du numéro de fichier.

Résultats

Maintenant vous avez appuyé sur "GO" et que se passe t-il ?!

Vos fichiers ont été envoyés sur le serveur si tout c'est bien passé, sinon il aura essayé et vous aura envoyé une erreur.

Les méthodes "upload" et "uploads" retournent des résultats assez intéressants, voyez plutôt :

// données récupérées de $r1 = $up->upload("monFichier", dossier);
UplObjet Object
(
    [input] => monFichier
    [nom] => Fichier - accentué.txt
    [dossier] => C:\wamp\www\SCRIPTS\uploader/fichiers
    [erreur] =>
    [code] => ok
    [message] => Le fichier a bien été envoyé.
    [indices] => Array
        (
        )

    [ecraser] =>
    [type] => text/plain
    [nomReel] => fichier-accentue.txt
    [taille] => 312
)

// données récupérées de $r2 = $up->uploads("monFichier2", dossier);
Array
(
    [0] => UplObjet Object
        (
            [input] => monFichier2
            [nom] =>
            [dossier] => C:\wamp\www\SCRIPTS\uploader/fichiers
            [erreur] => 1
            [code] => no-name
            [message] => Le fichier n'existe pas.
            [indices] => Array
                (
                    [0] => 0
                )

            [ecraser] =>
            [type] =>
            [nomReel] =>
            [taille] => 0
        )

    [1] => UplObjet Object
        (
            [input] => monFichier2
            [nom] =>
            [dossier] => C:\wamp\www\SCRIPTS\uploader/fichiers
            [erreur] => 1
            [code] => no-name
            [message] => Le fichier n'existe pas.
            [indices] => Array
                (
                    [0] => 1
                    [1] => a
                )

            [ecraser] =>
            [type] =>
            [nomReel] =>
            [taille] => 0
        )

    [2] => UplObjet Object
        (
            [input] => monFichier2
            [nom] =>
            [dossier] => C:\wamp\www\SCRIPTS\uploader/fichiers
            [erreur] => 1
            [code] => no-name
            [message] => Le fichier n'existe pas.
            [indices] => Array
                (
                    [0] => 1
                    [1] => b
                )

            [ecraser] =>
            [type] =>
            [nomReel] =>
            [taille] => 0
        )

)

Que c'est compliqué ! J'en conviens, j'ai potentiellement surchargé les informations retournées. ^^
Mais observons plutôt :

Le premier retour est un objet de type "UplObjet", les méthodes qui le concerne ne concernent que lui, donc je n'en parlerai pas, voyez la doc. En revanche ses attributs sont assez intéressants :

  1. input : le "name" qui a été utilisé pour envoyer le fichier
  2. nom : le nom originel du fichier
  3. dossier : le dossier dans lequel le fichier a été envoyé
  4. erreur : booléen signifiant "Il y a eu une erreur" lorsque celui-ci est Vrai
  5. code : le code du message retourné
  6. message : le texte correspondant au code de message
  7. indices : les indices du "name" pour ce fichier
  8. ecraser : booléen signifiant "On a demandé à écraser le fichier en cas de nom identique" lorsque celui-ci est Vrai
  9. type : type du fichier, rien de plus que $_FILES['monFichier']['type']
  10. nomReel : nom que possède en réalité le fichier
  11. taille : taille du fichier en octets, rien de plus que $_FILES['monFichier']['size']

Le second retour est un tableau qui contient 3 UplObjet, car il a compter l'envoi de 3 fichiers pour un seul "name".

Il y a beaucoup d'informations c'est vrai. Mais vous pouvez avec un seul de ces objets : voir le détail d'une erreur, comment le fichier a été envoyé, où il a été envoyé, quel est son nom réel, quel était son nom d'origine ...
 

Conclusion

J'espère avoir avoir été assez clair dans l'ensemble. Cette classe est complexe mais c'est pour pouvoir l'utiliser de manière simple.

Je vous met la classe en archive, avec le fichier d'index de test.
Remarque : j'utilise 2 fonctions personnelles dont les détails figurent sur ce site.

Je suis ouvert aux améliorations et aux commentaires constructifs, merci de me poster vos remarques et questions diverses.

Bonne continuation à tous et à bientôt !


23 octobre 2010

Niveau : personne ayant des bases en informatique (terminologie, principe)

AJAX : simplifions la manipulation

Obligatoire : l'AJAX s'utilise sur un serveur pour pouvoir utiliser le PHP

introduction

AJAX ce n'est pas de la lessive, il faut arrêter de faire cette blague, elle est de plus en plus lourde. C'est une technologie basée sur le javascript et qui, pour faire simple, sert à faire des trucs de fous. Comme par exemple un changement de contenu de page sans la recharger en ayant exécuté du PHP. Pour ceux qui ne connaissent pas, ça ne veut rien dire, pour ceux qui connaissent c'est génial !!

Je vais donc vous donner 4 fichiers : 1 fichier HTML d'exemple, 1 fichier JavaScript lié à l'exemple, 1 fichier JavaScript qui utilise de l'AJAX et 1 fichier PHP qui est lié à l'exemple. Ces fichiers sont téléchargeables en pièces jointes à l'article.

Le principe de cet exemple est le suivant :

Nous avons une page web contenant un formulaire sur un serveur, jusque là tout va bien. Ce que nous allons faire c'est qu'à la validation du formulaire (via le submit classique) nous allons exécuter une fonction javascript qui fera appel à de l'AJAX et qui bloquera le transfert classique des variables avec la redirection puis qui remplacera le contenu d'une DIV par un message avec les valeurs du formulaire.

En gros voyez ça comme si vous récupériez les variables du formulaire, vous les envoyez vous-même à un script PHP qui les traite et vous les renvoie sans que vous rechargiez la page. Ensuite vous bloquez le formulaire pour que la page ne change pas. Magique non !?

L'AJAX ne sert pas que pour les formulaires, mais cet exemple comme son nom l'indique est un exemple ...

ajax.js

Ce fichier comprend 3 fonctions. La 1ere est intéressante, mais y toucher serait dangereux ... Elle sert à créer des objets spéciaux utilisés pour AJAX. La seconde fonction est celle que vous allez le plus utiliser et son nom la rend assez explicite : executerAjax ...
Elle prend plusieurs valeurs en paramètres :

  1. les options, ou plutôt variables sous la forme d'une chaine de caractères du type "variable1=contenu1&variable2=contenu2"
  2. le chemin du fichier PHP à exécuter
  3. une fonction javascript à vous ; elle doit prendre une variable en paramètre et il ne sert à rien de lui donner une valeur de retour ; lorsque le PHP sera exécuté, votre fonction sera appelée avec les données reçues
  4. la méthode d'envoi des variables 'get' ou 'post', ce n'est pas obligatoire, si vous ne le mettez pas 'get' sera pris
3eme fonction : getVarsFromForm
Je l'ai rajoutée, car elle peut être assez utile. Ce qu'elle fait ?
  1. elle prends le nom du formulaire que vous lui avez donné
  2. trouve le formulaire associé
  3. fait la liste de tous les champs qu'il contient
  4. prends le name des champs et le couple avec leurs valeurs
  5. retourne la chaine de caractères
Cette fonction sert surtout à éviter de galérer à récupérer toutes les valeurs de champs à la main.
Car après tout c'est bien connu les codeurs sont des feignants, donc ils codent encore plus pour moins se prendre la tête !! logique non ?

index.html

Dans ce fichier d'exemple qu'est-ce qui est important ?

D'abord, ceci :

<script type="text/javascript" src="ajax.js"></script>
<script type="text/javascript" src="script.js"></script>


Ces deux lignes servent à dire "d'abord j'inclus les fonctions qui vont utiliser AJAX, puis j'inclus le fichier qui contient le javascript général de la page".

Ensuite :

<form name="form_test" action="script.php" method="post">

La définition du formulaire est importante :

  • le nom "form_test" sert d'identification pour les fonctions javascript
  • l'action "script.php" s'il y a une erreur pour une raison quelconque et que le formulaire se valide on va quand même l'envoyer vers le traitement PHP
  • la méthode d'envoi "post" pour la même raison que ci-dessus


A titre de remarque :
<select id="civilite" name="civilite">
Le formulaire n'a qu'un seul champ : une liste sélection dont le nom est "civilite"

Pou finir :
<div id="resu" style="background-color: #AAAAAA;">&nbsp;</div>
La DIV qui va contenir le résultat :

  • un identifiant "resu" pour savoir où mettre le contenu
  • un style, pour le distinguer du reste de la page ; mis sur la balise pour alléger le code
  • un espace blanc, pour que la DIV possède une hauteur minimale par défaut, en gris

script.js

Ce fichier contient deux fonctions javascript qui sont liés à l'exemple :
function maFonction(donnees){
    var maDiv = document.getElementById('resu');
    maDiv.innerHTML = donnees;
}
Cette fonction sert à une chose : traiter les données reçues de l'AJAX, ici chercher l'élément qui a pour id "resu" est en remplacer tout le contenu par les données.

Ceci est plus élaboré :
window.onload = function(){
    // lorsque l'on valide le formulaire on va effectuer une fonction javascript
    document.forms['form_test'].onsubmit = function(){
        // on récupère la valeur du champ du formulaire
        var variables = getVarsFromForm('form_test');
        executerAjax(variables, "script.php", maFonction, "post");    // on fait une lessive
   
        return false;        // on bloque le changement de page /!\ important
    }
}

Ces lignes servent à faire du javascript non intrusif, pour ne pas surcharger le HTML.
Maintenant que font ces lignes ?

  • Lorsque la page est chargée on va exécuter le code javascript qui suit
    • on prend le formulaire 'form_test' et on définit un code à exécuter lors de la validation du formulaire
      • on utilise la fonction getVarsFromForm (détaillée plus haut) qui donne toutes les variables d'un formulaire en chaine de caractères.
      • on fait appel à la fonction 'executerAjax' avec
        1. les variables en chaine de caractères vu juste avant
        2. le nom de la page PHP à appeler (la même que 'action' du formulaire en fait) "script.php"
        3. la fonction que l'on souhaite utiliser pour traiter les résultats PHP, ici celle vu juste avant
        4. la méthode d'envoi des variables
      • on stoppe la redirection du formulaire avec 'return false'
      • (fin du code de validation du formulaire)
    • (fin du code à exécuter au chargement de la page)
  • (fin du code général)
Je sais c'est un peu hard, mais le niveau est haut donc bon ...

script.php

Curieusement le plus simple des 4 fichiers : un bout de code PHP, son exécution :
  1. il prend la variable "civilite" qui lui a été envoyé via la méthode POST
  2. il affiche un texte différent selon la valeur
  3. il saute quelques lignes
  4. il affiche un texte brut via PHP
  5. il affiche un texte brut via HTML
C'est tout. Car une fois que le PHP s'est exécuté, le contenu de la page (les affichages) ou un message d'erreur (on ne sait jamais) est envoyé dans la fonction javascript 'maFonction'

Conclusion

Testez vous-même, vous avez une liste de sélection, changez de valeur, validez, le contenu de la DIV change sans recharger la page.
Au final ce que vous avez fait ?
  1. demandé un code spécial à la validation de formulaire
  2. bloqué la redirection de ce formulaire
  3. écrit une fonction de modification de page javascript
  4. utilisé une fonction javascript pour faire une chaine de caractères
  5. utilisé une fonction javascript avec 4 paramètres pour demander d'exécuter du PHP

Excusez-moi si vous trouvez ça dur, mais le plus gros du boulot est fait selon moi ... Dans ce cas laissez des commentaires pour voir ce que l'on peut encore simplifier.

9 août 2010

Niveau : personne ne possédant pas de compétences de bases en informatique

Les bases en informatique : les différentes conditions

Bonjour,
Ce jour-ci si cela vous sied je vais vous enseigner comment s'utilisent les conditions.

Une condition c'est quoi ?
Imaginez un programme qui pose une question, exemple : "Saisissez un entier inférieur à 4 : ". Là votre doigt ripe sur le clavier et vous entrez 12593 (vous ripez facilement avouez le). Cette valeur n'étant pas inférieur à 4 (si si) il faut que le programme disent que vous avez ripé sur votre clavier, mais comment fait-il pour savoir ? Il utilise une condition. Il fait "si jamais la valeur que la personne vient de saisir est incorrecte je dois lui signaler !".


Le Si ... Alors


Reprenons notre exemple précédent.
Voici la condition :

"Saisissez un entier entre 1 et 4 : "
L'utilisateur saisi.
Si nombre tapé > 4 Alors
    agir
Finsi
continuer le programme

traduction code :
if(condition){
    agir
}
continuer le programme


Si on saisi 2 par exemple on ne va pas faire "agir" et on va "continuer le programme".
Si on saisi 12593 on va faire "agir" et on va "continuer le programme".

"agir" peut être beaucoup de choses, remplacer la valeur incorrecte par une valide, afficher un message d'erreur, ...
Si tout va bien est que la condition est incorrecte (si la valeur est inférieure à 4) on n'agira jamais.


Le Si ... Alors ... Sinon


Le si alors sinon sert lorsque l'on veut faire quelque chose de particulier dans le cas où la condition est vraie et autre chose quand la condition est fausse.

Exemple :
"Saisissez un entier entre 1 et 4 : "
L'utilisateur saisi.
Si nombre tapé > 4 Alors
    Afficher "Vous avez fais une erreur"
Sinon
    Afficher "Vous avez bien saisi"
Finsi
continuer le programme

traduction code :
if(condition){
    agir 1
}else{
    agir 2
}
continuer le programme


Ainsi nous avons deux messages chacun affiché dans un cas ou l'autre.


"Mais si jamais on veut plus de deux choix comment on fait ?". Il existe plusieurs solutions.
Ce qui est génial avec les conditions on peux les imbriquer comme on veux dans tous les sens.

Si nombre tapé = 1 Alors
    Afficher "Vous avez tapé le chiffre un"
Sinon
    Si nombre tapé = 2 Alors
        Afficher "Vous avez tapé le chiffre deux"
    Sinon
        Si nombre tapé = 3 Alors
            Afficher "Vous avez tapé le chiffre trois"
        Sinon
            Afficher "Vous avez tapé autre chose que 1, 2 et 3"
        Finsi
    Finsi
Finsi

L'imbrication peut être lourde à écrire mais elle est parfois inévitable voir même plus claire et plus efficace.
Il y a un moyen de l'alléger avec la forme de condition suivante dont je vais vous parler.


Le Si ... Alors ... Sinon Si ...


Cette forme n'existe pas dans la totalité des langages et ne s'écrit pas forcément pareils partout mais elle est très utile.

Elle s'écrit :
Si nombre tapé = 1 Alors
    Afficher "Vous avez tapé le chiffre un"
Sinon Si nombre tapé = 2 Alors
    Afficher "Vous avez tapé le chiffre deux"
Sinon Si nombre tapé = 3 Alors
    Afficher "Vous avez tapé le chiffre trois"
Finsi

Remarque : Si vous tapez 4 ou autre chose, rien ne se passera car si une condition est fausse le programme cherche à vérifier les suivantes, si aucune ne se vérifie aucune des instructions ne sera exécutée.

Vous pouvez tout à fait rajouter à la fin un sinon sans condition :
Si nombre tapé = 1 Alors
    Afficher "Vous avez tapé le chiffre un"
Sinon Si nombre tapé = 2 Alors
    Afficher "Vous avez tapé le chiffre deux"
Sinon Si nombre tapé = 3 Alors
    Afficher "Vous avez tapé le chiffre trois"
Sinon
    Afficher "Vous avez tapé autre chose que 1, 2 et 3"
Finsi
Et vous aurez un traitement dans tous les cas.

En code on peux l'écrire de deux manières :
if(condition){
    agir 1
}elseif(condition 2){
    agir 2
}

ou
if(condition){
    agir 1
}else if(condition 2){
    agir 2
}

Soit un petit espace entre else et if ou pas.

"En effet c'est plus simple mais dans tes exemples tu traite les valeurs possibles de la même variables, il n'y a pas plus simple pour gérer une seule variable ?" Si c'est la forme suivante.


Le Selon ... Faire


Le selon sert, comme dit précédemment, à gérer plusieurs valeurs d'une même variable.
Nous allons changer d'exemple pour être plus concert.
Imaginez que vous voulez un programme qui vous donne la date et plus particulièrement le jour de la semaine (Lumdi, Mardi, ...), mais dans votre code vous ne pouvez identifier cette valeur que par un entier (de 1 à 7).
Le selon va trouver son utilité dans ce cas précis.

Algo :
Selon leJour Faire
    cas 1 : Afficher "Lundi"
                Stop
    cas 2 : Afficher "Mardi"
                Stop
    cas 3 : Afficher "Mercredi"
                Stop
    cas 4 : Afficher "Jeudi"
                Stop
    cas 5 : Afficher "Vendredi"
                Stop
    cas 6 : Afficher "Samedi"
                Stop
    cas 7 : Afficher "Dimanche"
                Stop
    par défaut : Afficher "Votre jour n'existe pas"
FinFaire

"Mais c'est quoi ces "Stop" et ce "par defaut" ? " Patience j'y viens.
Les "Stop" servent à dire "On a fini de tout faire pour le cas en cours, sort du selon et continue le programme".
"Mais pourquoi il le fait pas tout seul ?" Il s'avère que parfois avec plusieurs cas différents on a besoin des mêmes instructions. Donc plutôt que de réécrire les mêmes lignes, on enlève le stop.
Exemple :
    cas 1 :
    cas 2 : Afficher "Mardi"
                Stop

Ici que ce soit lundi ou mardi, on affichera "Mardi".
Exemple plus intéressant :
    cas 1 : Afficher "Nous somme le jour avant : "
    cas 2 : Afficher "Mardi"
                Stop
Pour Lundi on affichera le texte : "Nous somme le jour avant : Mardi".
Et pour mardi on affichera simplement "Mardi". Vous voyez toutes les possibilités ?

De plus vous pouvez traiter autant de cas que vous voulez :
Selon leJour Faire
    cas 1 : Afficher "Lundi"
                Stop
    cas 7 : Afficher "Dimanche"
                Stop
    par défaut : Afficher "Votre jour est différent du Lundi et de Dimanche"
FinFaire

Et je n'ai pas oublié de parler de "par défaut".
Ce qui est écrit dans ce cas là sera fait si aucun des cas précédents n'a été traité. C'est pourquoi on le laisse à la fin et qu'on ne lui met pas de stop (on est déjà à la fin du selon). Le "par défaut" n'es pas obligatoire, si on ne veux rien faire par exemple on ne le met pas, on peut même laisser autant de cas que l'on veut vide, le stop nous emmènera à la fin de toutes façons.

En code on peux l'écrire :
switch(leJour){
    case 1 : Afficher "Lundi"
                break;
    case 2 : Afficher "Mardi"
                break;
    case 3 : Afficher "Mercredi"
                break;
    case 4 : Afficher "Jeudi"
                break;
    case 5 : Afficher "Vendredi"
                break;
    case 6 : Afficher "Samedi"
                break;
    case 7 : Afficher "Dimanche"
                break;
    default : Afficher "Votre jour n'existe pas"
}


Remarque importante :
Le selon ne prend pas n'importe quel type de variable, il est utilisé pour les nombres et les caractères. Dans certains langages les chaines de caractères sont acceptées (PHP par exemple).


Remarque finale : Dans les langages orienté objet, il existe ce que l'on appelle des exceptions qui sont des sortes de conditions mais elles sont utilisées dans les cas d'erreur d'exécution de programme, pour faire des traitements particuliers, j'en parlerai dans un article de niveau plus avancé.


Voilà pour les différents types de conditions existantes dans le monde de la programmation. J'espère avoir été clair, n'hésitez pas à laisser des remarques et/ou des questions.