Articles - PHP

Site Web avec PHP et MySQL

  |   29104  |  Poster commentaire  |  PHP
Sommaire :

Transmettre des données de page en page




    Envoyer des données dans l'URL



    Envoie des données


    Soit deux pages index.php et bonjour.php. La page index.php envoie les variables nom et prénom à la page bonjour.php. Cette dernière les récupère et affiche bonjour à la personne.

    Il suffit de créer un lien avec des paramètres qui mène vers la page bonjour de la forme suivante :
    page.php?param1=valeur1¶m2=valeur2¶m3=valeur3¶m4=valeur4…


    Il n'est pas conseillé de dépasser les 256 caractères

    Ouvrez index.php et insérez-y par exemple le code suivant :

    Code HTML :
    <a href="bonjour.php?nom=Dupont&prenom=Jean">Dis-moi bonjour !</a>


    Récupération des données



    La commande $_GET permet de récupérer les données. On va d'abord tester l’existence des paramètres avant de les récupérer au cas où le visiteur aurait trafiquer l'URL

    Code PHP :
     
    <?php
    //La commande isset teste l'existence des paramètres
    if (isset($_GET['prenom']) AND isset($_GET['nom'])) // On a le nom et le prénom
    {
        echo 'Bonjour ' . $_GET['prenom'] . ' ' . $_GET['nom'] . ' !';
    }
    else // Il manque des paramètres, on avertit le visiteur
    {
        echo 'Il faut renseigner un nom et un prénom !';
    }
    ?>
     


    Envoyer des données via un formulaire



    Base du formulaire



    Code HTML :
     
    <form method="post" action="page_cible.php">
    <p>
        On insèrera ici les éléments de notre formulaire.
    </p>
    </form>
     


    Les données seront récupérées grâce à la fonction $_POST.

    Les éléments du formulaire



    Code HTML :
     
    <!--//**********************************************************************************************
    //champ de texte
    //name(obligatoire)  : La valeur du champ récupérée via $_POST['pseudo']
    //value(facultatif) : valeur par défaut du champ
    //**********************************************************************************************-->
    <input type="text" name="pseudo"  value="pearson"/>
    <!--//**********************************************************************************************
    //Les grandes zones de texte
    //Récupération du contenu via $_POST['message']
    //**********************************************************************************************-->
    <textarea name="message" rows="8" cols="45">
    Votre message ici.
    </textarea>
    <!--//**********************************************************************************************
    //La liste déroulante
    //Une variable $_POST['choix'] contenant le choix de l'utilisateur est créé. 
    //S'il a choisi « Choix 3 », la variable $_POST['choix'] sera égale au value correspondant, c'est-à-dire choix3.
    //**********************************************************************************************-->
    <select name="choix">
        <option value="choix1">Choix 1</option>
        <option value="choix2" selected="selected">Choix 2</option>//choix par défaut grâce à l'option selected
        <option value="choix3">Choix 3</option>
    </select>
    <!--//**********************************************************************************************
    //Case à cocher
    //la variable $_POST['case'] est créée dans la page cible. Si elle est cochée, sa valeur est égale "on"; sinon elle n'existe pas
    //Pour cocher une case par défaut : mettre l'attribut checked="checked"
    // Faire un test avec isset($_POST['case']) pour vérifier si la case a été cochée ou non.
    **********************************************************************************************-->
    <input type="checkbox" name="case" id="case" /> <label for="case">case</label> 
    <!--**********************************************************************************************
    //Bouton d’options
    //Pour pré-cocher une case par défaut : mettre l'attribut checked="checked"
    //Variable créée $_POST['frites']. Elle aura la valeur du bouton d'option choisi par le visiteur, issue de l'attribut value. 
    //Si on aime les frites, alors on aura $_POST['frites'] = 'oui'.
    //**********************************************************************************************-->
    Aimez-vous les frites ?
    <input type="radio" name="frites" value="oui" id="oui" checked="checked" /> <label for="oui">Oui</label>
    <input type="radio" name="frites" value="non" id="non" /> <label for="non">Non</label>
    <!--**********************************************************************************************
    //Les champs cachés
    //Le champ n'est pas affiché aux visiteurs mais il est envoyé à la page cible lors de la validation du formulaire
    //**********************************************************************************************-->
    <input type="hidden" name="pseudo" value="pearson" />
    <!--**********************************************************************************************
    //Bouton d’envois du formulaire
    //**********************************************************************************************-->
    <input type="submit" value="Valider" />
     


    champ de texte

    Les grandes zones de texte

    La liste déroulante

    Case à cocher




    Bouton d'options Aimez-vous les frites ?

    Bouton valider



    Récupération des données



    Code PHP :
     
    <?php 
    //échappement des balises html
    echo htmlspecialchars($_POST['prenom']); 
    //suppression des balises html
    echo strip_tags($_POST['prenom']);
    ?>
     



    Notez l'utilisation de la fonction htmlspecialchars. Elle permet d'échapper les balises HTML insérées par le visiteurs protégeant ainsi votre site d'éventuelles attaques. Les balises HTML seront affichées mais non exécutées.



    Si vous préférez retirer les balises HTML que le visiteur a tenté d'envoyer plutôt que de les afficher, utilisez la fonction strip_tags.


    Envoyer un fichier



    Formulaire d'envois



    Si le formulaire propose aux visiteurs d'envoyer un fichier, il faut ajouter l'attribut enctype="multipart/form-data" à la balise <form>.

    Code HTML :
     
    <form action="page_cible.php" method="post" enctype="multipart/form-data">
            <p>
                    Formulaire d'envoi de fichier :<br />
                    <input type="file" name="monfichier" /><br />
                    <input type="submit" value="Envoyer le fichier" />
            </p>
    </form>
     


    Traitement de l'envoi



    Code PHP :
     
    <?php
    // Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
    if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
    {
            // Testons si le fichier n'est pas trop gros
            if ($_FILES['monfichier']['size'] <= 1000000) // en octet; 1 MO = 1000 000 octets
            {
                    // Testons si l'extension est autorisée
                    $infosfichier = pathinfo($_FILES['monfichier']['name']);
                    $extension_upload = $infosfichier['extension'];
                    $extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
                    if (in_array($extension_upload, $extensions_autorisees))
                    {
                            // On peut valider le fichier et le stocker définitivement
                            move_uploaded_file($_FILES['monfichier']['tmp_name'], 'uploads/' . basename($_FILES['monfichier']['name']));
                            echo "L'envoi a bien été effectué !";
                    }
            }
    }
    ?>
     



    Le fichier est placé dans le dossier uploads. Vérifiez que le dossier upload existe sur le serveur et qu'il a les droits d'écriture (CHMOD 733)



    Ce script est encore à améliorer. Par exemple, si le nom du fichier contient des espaces ou des accents, ça posera un problème une fois envoyé sur le Web. D'autre part, si quelqu'un envoie un fichier qui a le même nom que celui d'une autre personne, l'ancien sera écrasé !
    La solution consiste en général à « choisir » nous-mêmes le nom du fichier stocké sur le serveur plutôt que de se servir du nom d'origine. Vous pouvez faire un compteur qui s'incrémente : 1.png, 2.png, 3.jpg, etc.


    Les variables superglobales, sessions et cookie



    Les variables superglobales sont accessibles sur toutes les pages de votre site.

    Les sessions



    Pour chaque visiteur, un numéro de session unique est créé automatiquement par PHP. PHP transmet cet ID de page en page en utilisant généralement un cookie.

    • session_start() : démarre le système de sessions.
    • session_destroy() : ferme la session du visiteur. Cette fonction est automatiquement appelée lorsque le visiteur ne charge plus de page de votre site pendant plusieurs minutes (c'est le timeout), mais elle peut être utilisée pour la déconnexion manuelle du visiteur.



    Il faut appeler session_start() sur chacune de vos pages AVANT d'écrire le moindre code HTML (avant même la balise <!DOCTYPE> ). Si vous oubliez de lancer session_start(), vous ne pourrez pas accéder aux variables superglobales $_SESSION


    Exemple
    Code HTML :
     
    <?php
    // On démarre la session AVANT d'écrire du code HTML
    session_start();
     
    // On s'amuse à créer quelques variables de session dans $_SESSION
    $_SESSION['prenom'] = 'Jean';
    $_SESSION['nom'] = 'Dupont';
    $_SESSION['age'] = 24;
    ?>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
       <head>
           <title>Titre de ma page</title>
        </head>
        <body>
        <p>
            Salut <?php echo $_SESSION['prenom']; ?> !<br />
            Tu es à l'accueil de mon site (index.php). Tu veux aller sur une autre page ?
        </p>
        </body>
    </html>
     


    Les cookies



    Un cookie, c'est un petit fichier que l'on enregistre sur l'ordinateur du visiteur. Ce fichier contient du texte permettant de « retenir » des informations sur le visiteur.

    Ecrire un cookie

    On utilise la fonction PHP setcookie en lui donnant, en général trois paramètres, dans l'ordre suivant :

    le nom du cookie (ex. : pseudo) ;
    la valeur du cookie (ex. : M@teo21) ;
    la date d'expiration du cookie, sous forme de timestamp (ex. : 1090521508).

    Si vous voulez supprimer le cookie dans un an, il vous faudra donc écrire : time() + 365*24*3600. Cela veut dire : timestamp actuel $+$ nombre de secondes dans une année.

    La commande est la suivante pour créer un cookie:

    Code PHP :
     
    <?php setcookie('pseudo', 'M@teo21', time() + 365*24*3600); 
    //Sécuriser son cookie avec le mode httpOnly; le dernier true active le httpOnly
    setcookie('pseudo', 'M@teo21', time() + 365*24*3600, null, null, false, true);
    ?>
     



    Comme pour session_start, setcookie ne marche QUE si vous l'appelez avant tout code HTML (donc avant la balise <!DOCTYPE>;).


    Code PHP :
     
    <?php
    setcookie('pseudo', 'M@teo21', time() + 365*24*3600, null, null, false, true); // On écrit un cookie
    setcookie('pays', 'France', time() + 365*24*3600, null, null, false, true); // On écrit un autre cookie...
     
    // Et SEULEMENT MAINTENANT, on peut commencer à écrire du code html
    ?>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
       <head>
           <title>Ma super page PHP</title>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        </head>
        <body>
     
      etc.
     


    Afficher un cookie


    Il faut faire un isset pour vérifier si le cookie existe ou non.


    Code PHP :
     
    <p>
        Hé ! Je me souviens de toi !<br />
        Tu t'appelles <?php echo $_COOKIE['pseudo']; ?> et tu viens de <?php echo $_COOKIE['pays']; ?> c'est bien ça ?
    </p>
     



    Les cookies viennent du visiteur. Il peut les avoir modifiés, donc soyez prudents et n'ayez pas une confiance aveugle en leur contenu !


    Modifier un cookie existant
    Code PHP :
     
    setcookie('pays', 'Chine', time() + 365*24*3600, null, null, false, true);