Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Officiels > Site Web > Lecture du tutoriel

PHP et les formulaires

Avatar
Auteur : M@teo21
Créé : le 28/08/2005 01:10:44
Modifié : le 27/05/2007 09:36:27
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Une des applications les plus intéressantes du PHP est que l'on peut travailler sur des formulaires, et de manière très puissante.

Les formulaires sont le seul et unique moyen pour vos visiteurs de rentrer des informations sur votre site, donc de produire l'interactivité.
Regardez par exemple, sur un forum on doit rentrer du texte puis cliquer sur un bouton pour envoyer son message. Sur un livre d'or, sur un mini-chat, pareil. On a besoin des formulaires partout.

Vous allez voir qu'il y a de nombreux rappels de HTML dans ce chapitre... Et ce n'est pas un hasard : ici le PHP et le HTML sont très liés.
A quoi sert PHP dans l'histoire ? Il va nous permettre de traiter les données qu'a rentré l'utilisateur. Cela va nous servir de base pour tous nos prochains TP (livre d'or, news...) donc soyez attentifs.

Go ! :D
Sommaire du chapitre :
Chapitre précédent Sommaire Chapitre suivant

Fonctionnement du formulaire

En HTML, pour dire qu'on va insérer un formulaire on se sert de la balise <form>. On l'utilise de la manière suivante :

Code : HTML
1
2
3
4
5
6
7
8
<form method="post" action="cible.php">
 
<p>
    On mettra ici les éléments de notre formulaire.<br />
    Notez qu'il n'y a pour l'instant pas de PHP.
</p>
 
</form>


Ce qu'il faut retenir, c'est qu'on met le contenu de notre formulaire entre les balises <form> et </form>
Il y a 2 attributs intéressants à connaître pour la balise <form> :

Retenez donc bien que vous travaillez normalement sur 2 pages différentes : la page qui contient le formulaire (formulaire.php dans notre exemple), et celle qui reçoit les données du formulaire pour les traiter (cible.php).

Mais du coup vous devez vous demander quelque chose : pour les TP "mot de passe" et "mini-chat", n'a-t-on pas utilisé une seule et même page ? Eh oui en effet, la page cible était la même page que celle où il y avait le formulaire. Par exemple, on avait mis le formulaire dans minichat.php, mais aussi le traitement des données dans la même page (car on avait un action="minichat.php" qui renvoyait sur la même page).

Du coup les choses devraient devenir plus claires dans votre tête :

Et tout ça se fait sur une seule et même page :D

Dans la pratique, vous verrez qu'on préfère utiliser deux pages distinctes car c'est plus simple à gérer (ça nous épargne le isset). Mais souvent, vous serez contraints à travailler sur une même page, donc à utiliser la même technique que dans les TP précédents.

Si vous vous souvenez bien, on avait très rapidement parlé des formulaires avec zone de texte dans le chapitre sur les variables. Je vous avais promis qu'on reviendrait dessus plus tard et qu'on verrait tous les éléments de formulaires que l'on peut traiter avec PHP.
Ce moment est enfin venu :)

Les éléments du formulaire

Dans un formulaire, vous le savez peut-être déjà, on peut mettre beaucoup d'éléments différents : zones de textes, boutons, cases à cocher etc etc...
Je vais ici tous les lister et vous montrer comment vous servir de chacun d'eux. Avec ça, vous devriez être parés pour partir à l'assaut des formulaires tous seuls :pirate:

Les petites zones de texte



Une zone de texte ressemble à ceci : Image utilisateur

En HTML, on l'insère tout simplement avec la balise :
<input type="text" />

Pour les mots de passe, vous pouvez utiliser type="password", ce qui aura pour effet de cacher le texte rentré par le visiteur.

Mais il y a 2 attributs que vous allez devoir rajouter qui vous seront très importants :

Oui, je sais que vous commencez à vous inquiéter car vous n'avez pas encore vu de PHP pour le moment et vous craignez ce qui risque de vous tomber sur la tronche.
Rassurez-vous, vous ne risquez rien :p

En fait, c'est tout bête : le texte que le visiteur aura rentré sera disponible dans cible.php sous la forme d'une variable appelée $_POST['pseudo'].

Et je ne vous apprends rien d'extraordinaire, on avait déjà vu ça dans le chapitre sur les variables. D'ailleurs, pour l'exemple, je ne vais pas m'amuser à en faire un nouveau, je vous ressors celui que je vous avais fait (comment ça "feignasse" ? :p)

Code : HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<p>
    Cette page, elle aussi, ne contient que du HTML.<br />
    Veuillez taper votre prénom :
</p>

<form action="cible.php" method="post">
<p>
<input type="text" name="prenom" /> <input type="submit" value="Valider" />
</p>
</form>


Code : PHP
1
2
3
4
5
<p>Bonjour !</p>

<p>Je sais comment tu t'appelles, hé hé. Tu t'appelles <?php echo $_POST['prenom']; ?> !</p>

<p>Si tu veux changer de prénom, <a href="3.3.1.php">clique ici</a> pour revenir à appel.php</p>


Ce bouton va ouvrir la page appel.php :



Dans cible.php on a affiché une variable $_POST['prenom'] qui contient ce que l'utilisateur a rentré dans le formulaire.

Comme il s'agissait d'un exemple des premiers chapitres du cours, je n'y avais pas encore parlé de htmlspecialchars(pour rendre le html inoffensif). Mais, par sécurité, vous DEVEZ appliquer un htmlspecialcharsà la variable $_POST['prenom']. D'ailleurs, si vous testez mon exemple, vous verrez que moi j'ai pris la précaution d'appliquer un htmlspecialchars ! :D
L'utilisation de la fonction mysql_real_escape_string n'est pas nécessaire ici. Vous n'en avez besoin que lorsque vous devez exécuter une requête SQL avec cette variable, ce qui n'est pas le cas ici.

De même, pour en revenir au mini-chat, on peut sans problème réécrire le pseudo dans le champ "pseudo" si la variable $_POST['pseudo'] existe. Ce qui nous donnerait quelque chose du genre :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<input type="text" name="pseudo"
<?php
if (isset($_POST['pseudo'])) // Si on a le pseudo rentré par le visiteur
{
    echo 'value="' . $_POST['pseudo'] . '"'; // On pré-remplit le champ avec le pseudo du visiteur
}

// Et on n'oublie pas de fermer la balise <input /> tout en bas :
?>

/>


En gros, on a mis du PHP en plein milieu de la balise <input /> (oui oui on a tout à fait le droit).
SI on a le pseudo du visiteur, ALORS on rajoute l'attribut value="Le pseudo", ce qui fera que la zone de texte sera pré-remplie :)

N'oubliez surtout pas de mettre le /> tout à la fin pour fermer la balise <input />

Vous reconnaîtrez entre autres l'intérêt des apostrophes et de la concaténation pour séparer le texte des variables. Grâce à ça on n'a pas eu à mettre d'antislash devant les guillemets.

Les grosses zones de texte



La grosse zone de texte (qu'on appelle aussi "Zone de saisie multiligne" ^^), ça ressemble à ceci :

Image utilisateur

On peut y écrire autant de lignes que l'on veut. C'est plus adapté si le visiteur doit écrire un long message par exemple.

On va utiliser le code HTML suivant pour insérer cette grosse zone de texte :

Code : HTML
1
2
3
<textarea name="message" rows="8" cols="45">
Votre message ici.
</textarea>


Là encore, on a un attribut name qui va définir le nom de la variable qui sera créée dans cible.php. Dans notre cas, ce sera la variable $_POST['message'].

Chose plus particulière : il n'y a pas d'attribut value. En fait, le texte par défaut est ici écrit entre le <textarea> et le </textarea>. C'est plus pratique du coup pour faire un echo au milieu ;)
Si vous ne voulez rien mettre par défaut, alors n'écrivez rien entre <textarea> et </textarea>

La liste déroulante



La liste déroulante, c'est ça :

Image utilisateur


On utilise le code HTML suivant :

Code : HTML
1
2
3
4
5
6
<select name="choix">
    <option value="choix1">Choix 1</option>
    <option value="choix2">Choix 2</option>
    <option value="choix3">Choix 3</option>
    <option value="choix4">Choix 4</option>
</select>


Tout bêtement, on utilise la balise <select> à laquelle on donne un nom (ici : "choix").
On écrit les différentes options disponibles...
Puis on referme la balise avec </select>.

Ici, une variable $_POST['choix'] sera créée, et elle contiendra le choix qu'a fait l'utilisateur. S'il a choisi "Choix 3", la variable $_POST['choix'] sera égale au value correspondant, c'est-à-dire "choix3".

Un truc important qu'il peut être utile de savoir faire, c'est de définir le choix par défaut. Normalement c'est le premier, mais si vous rajoutez l'attribut selected="selected" à une balise <option>, alors ce sera le choix par défaut. On pourrait par exemple écrire :
<option value="choix3" selected="selected">Choix 3</option>

Les cases à cocher



Une case à cocher ressemble à ceci :

Image utilisateur


On utilisera le code suivant pour afficher des cases à cocher :

Code : HTML
1
<input type="checkbox" name="case" /> Ma case à cocher


Là encore, on donne un nom à la case à cocher (ici : "case"). Ce nom va générer une variable dans la page cible, par exemple $_POST['case'].

Si vous voulez que la case soit cochée par défaut, il faudra lui rajouter l'attribut checked="checked". Par exemple :
<input type="checkbox" name="case" checked="checked" />
On aura du coup une case déjà cochée.

Les boutons d'option



Les boutons d'option fonctionnent par groupes de 2 minimum. Par exemple :

Image utilisateur


Le code correspondant à cet exemple est le suivant :

Code : HTML
1
2
3
Aimez-vous les frites ?
<input type="radio" name="frites" value="oui" checked="checked" /> Oui
<input type="radio" name="frites" value="non" /> Non


Comme vous pouvez le voir, les deux boutons d'option ont le même nom ("frites"). C'est très important, car les boutons d'options fonctionnent par "groupes" : tous les boutons d'option d'un même groupe ont le même nom.
Cela permet au navigateur de savoir quels boutons d'option désactiver quand on active un autre bouton d'option du groupe. Il serait bête en effet de pouvoir sélectionner "Oui" et "Non" à la fois :D

Pour pré-cocher l'un de ces boutons d'option, vous faites pareil que pour les cases à cocher : vous rajoutez un checked. Ici, commme vous pouvez le voir, "Oui" est sélectionné par défaut.

Dans la page cible, une variable $_POST['frites'] sera créée. Elle aura la valeur du bouton d'option choisi par le visiteur. Si on aime les frites, alors on aura $_POST['frites'] = 'oui'.
Il faut bien penser à remplir l'attribut "value" du bouton d'option car c'est lui qui va déterminer la valeur de la variable :)

Les champs cachés



Si y'a un truc bien pratique avec les formulaires et php, ce sont les champs cachés :D

En quoi ça consiste ? C'est un code dans votre formulaire qui n'apparaîtra pas aux yeux du visiteur, mais qui va quand même créer une variable avec une valeur.
Je m'explique : supposons que vous ayez besoin de "retenir" que le pseudo du visiteur est "Mateo21". Vous allez taper ce code :

Code : HTML
1
<input type="hidden" name="pseudo" value="Mateo21" />


A l'écran, vous ne verrez rien.
Mais dans la page cible, une variable $_POST['pseudo'] sera créée (correspondant à name), et elle aura la valeur "Mateo21" (correspondant à value) ! :D

C'est apparemment inutile, mais vous verrez que lorsque vous commencerez à créer des formulaires vous en aurez vite besoin ;)

Petit exercice

Pour s'entraîner, on va travailler sur une liste déroulante. On va demander au visiteur quelle est sa couleur préférée. Lorsqu'il aura choisi, on doit arriver à faire 2 choses :
  1. On va écrire sa couleur préférée (à l'aide d'un echo tout bête)
  2. On va faire de cette couleur le choix par défaut de la liste déroulante

On va faire appel à un vieux truc qu'on n'a pas utilisé depuis la partie I : les fonctions que vous pouvez définir vous-même. On va définir une fonction appelée choixParDefaut qui va renvoyer 'selected' si la couleur qu'on lui donne est bien le choix de l'utilisateur, ou qui ne renvoie rien si ce n'est pas sa couleur préférée.

Allez, on arrête de bavarder et on code :D

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
function choixParDefaut($couleur) // Création de la fonction
{
$par_defaut = ''; // On crée une variable (vide par défaut) que l'on retournera à la fin

    if (isset($_POST['couleur'])) // Si le visiteur a choisi une couleur
    {
        if ($_POST['couleur'] == $couleur) // Si cette couleur correspond à la couleur que l'on est en train de traiter
        {
            $par_defaut='selected="selected"'; // Alors on modifie la variable que l'on retournera et on lui met selected
        }
    }

return $par_defaut; // On ne retourne rien si ce n'était pas la couleur choisie, selected si c'était la bonne couleur
}


// -------------- Fin de la fonction ---------------


if (isset($_POST['couleur'])) // On vérifie si le visiteur a déjà choisi une couleur
{
    echo '<p>Votre couleur préférée est le : ' . htmlspecialchars($_POST['couleur']) . '</p>';
}
?>


<p>Quelle est votre couleur préférée ?</p>

<form method="post">
<p>
    <select name="couleur">
        <option value="Bleu" <?php echo choixParDefaut('Bleu'); ?>>Le Bleu</option>
        <option value="Marron" <?php echo choixParDefaut('Marron'); ?>>Le Marron</option>
        <option value="Vert" <?php echo choixParDefaut('Vert'); ?>>Le Vert</option>
        <option value="Rose" <?php echo choixParDefaut('Rose'); ?>>Le Rose</option>
    </select>
    <input type="submit" value="OK" />
</p>
</form>



J'imagine votre tête lorsque vous avez regardé ce code : o_O
D'un côté, ça ne m'étonne pas que ce code vous ait fait un peu peur. D'un autre, évitez de me le dire parce que je risquerais de ma fâcher tout rouge :diable:

Pourquoi ? Parce que j'ai "juste" utilisé une fonction, et c'est quelque chose que je vous ai appris dans un des premiers chapitres de ce cours de PHP !!!
Donc, en toute logique, vous devriez être capables de comprendre tout cela.

Je vais quand même vous expliquer rapidement comment ça marche, j'ai pas envie que vous me jetiez des tomates pour ça
En gros, oubliez le haut de ce code. Regardez après le commentaire "Fin de la fonction". Si l'utilisateur a fait un choix, alors on affiche quelle est sa couleur préférée.

Alerte rouge : quand vous affichez les résultats d'un formulaire, prenez l'habitude de TOUJOURS appliquer un htmlspecialchars. Et quand je dis toujours, c'est tout le temps : même sur une liste déroulante ou un champ caché, un visiteur peut modifier la source pour aller mettre du html ou du javascript !

Ensuite, on affiche notre formulaire tout bête. Comme on veut recharger la même page, je n'ai pas mis d'attribut action.
Pour chaque option, j'affiche ce que me renvoie ma fonction choixParDefaut quand je lui donne la couleur 'Vert' par exemple. Soit la fonction renvoie 'selected="selected"', dans ce cas on affiche selected et ce sera le choix par défaut, soit la fonction ne renvoie rien, donc ce ne sera pas le choix par défaut.

Si vous ne comprenez pas bien comment marche ma fonction, je vous conseille vivement de relire le chapitre sur les fonctions.
N'hésitez pas à passer un peu de temps sur ce code pour comprendre comment il marche, car je le trouve très intéressant. Si vous avez compris ça, vous avez tout compris :)

L'envoi de fichiers

Vous saviez qu'on pouvait aussi envoyer des fichiers grâce aux formulaires ?

Vous aurez besoin de lire cette section si vous voulez que vos visiteurs puissent envoyer (on dit aussi uploader) des images, des programmes ou tout autre type de fichier sur votre site.

Là encore, ça se passe en 2 temps :

  1. Le visiteur arrive sur votre formulaire et le remplit (en indiquant le fichier à envoyer). Une simple page HTML suffit pour créer le formulaire.
  2. PHP réceptionne les données du formulaire et, s'il y a des fichiers dedans, il les "enregistre" dans un des dossiers du serveur.

Attention : l'envoi du fichier peut être un peu long si celui-ci est gros. Il faudra dire au visiteur de ne pas s'impatienter pendant l'envoi.


On va commencer par créer le formulaire permettant d'envoyer un fichier (une simple page HTML).
Nous verrons ensuite comment traiter l'envoi du fichier côté serveur avec PHP.


Le formulaire d'envoi de fichier



Dès l'instant où votre formulaire propose aux visiteurs d'envoyer un fichier, il faut ajouter l'attribut enctype="multipart/form-data" à la balise <form>.

Code : HTML
1
2
3
<form action="cible_envoi.php" method="post" enctype="multipart/form-data">
    <p>Formulaire d'envoi de fichier</p>
</form>


Grâce à enctype, le navigateur du visiteur sait qu'il s'apprête à envoyer des fichiers.

Maintenant que c'est fait, nous pouvons ajouter à l'intérieur du formulaire une balise permettant d'envoyer un fichier. C'est une balise très simple de type <input type="file" />. Il faut penser comme toujours à donner un nom à ce champ de formulaire (grâce à l'attribut name) pour que PHP puisse reconnaître le champ après.

Code : HTML
1
2
3
4
5
6
7
<form action="cible_envoi.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>


Voilà, c'est suffisant :)

Vous pouvez ajouter d'autres champs plus classiques au formulaire (champ de texte, cases à cocher). Vous pouvez aussi proposer d'envoyer plusieurs fichiers en même temps.
Là on va se contenter d'un seul champ (envoi de fichier) pour rester simple.


Le traitement de l'envoi en PHP



Comme vous avez dû le remarquer, le formulaire pointe vers une page PHP qui s'appelle cible_envoi.php. Le visiteur sera donc redirigé sur cette page après l'envoi du formulaire.

C'est maintenant que ça devient important. Il faut que l'on écrive le code de la page cible_envoi.php pour traiter l'envoi du fichier.

"Traiter l'envoi du fichier" ? C'est-à-dire ?
Si le fichier a été envoyé sur le serveur c'est bon non ? Qu'est-ce que PHP aurait besoin de faire ?


En fait, au moment où la page PHP s'exécute, le fichier a été envoyé sur le serveur mais il est stocké dans un dossier temporaire.
C'est à vous de décider si vous acceptez définitivement le fichier ou non. Vous pouvez par exemple vérifier si le fichier a la bonne extension (si vous demandiez une image et qu'on vous envoie un ".txt", vous devrez refuser le fichier).

Si le fichier est bon, vous l'accepterez définitivement grâce à la fonction move_uploaded_file.


Mais comment je sais si "le fichier est bon" ?


Pour chaque fichier envoyé, une variable $_FILES['nom_du_champ'] est créée. Dans notre cas, la variable s'appellera $_FILES['monfichier'].
Cette variable est un tableau qui contient plusieurs informations sur le fichier :

VariableSignification
$_FILES['monfichier']['name'] Contient le nom du fichier envoyé par le visiteur.
$_FILES['monfichier']['type'] Indique le type du fichier envoyé. Si c'est une image gif par exemple, le type sera image/gif.
$_FILES['monfichier']['size'] Indique la taille du fichier envoyé. Attention : cette taille est en octets. Il faut environ 1 000 octets pour faire 1 Ko, et 1 000 000 octets pour faire 1 Mo.
Attention, la taille de l'envoi est limitée par PHP. Par défaut, il est impossible d'uploader des fichiers de plus de 8 Mo.
$_FILES['monfichier']['tmp_name'] Juste après l'envoi, le fichier est placé dans un répertoire temporaire sur le serveur en attendant que votre script PHP décide si oui ou non il accepte de le stocker définitivement. Cette variable contient l'emplacement temporaire du fichier (c'est PHP qui gère ça).
$_FILES['monfichier']['error'] Contient un code d'erreur permettant de savoir si l'envoi s'est bien effectué ou s'il y a eu un problème, et si oui lequel.
La variable vaut 0 s'il n'y a pas eu d'erreur.

Si vous avez mis un second champ d'envoi de fichier dans votre formulaire, il y aura une seconde variable $_FILES['nom_de_votre_autre_champ'] découpée de la même manière que le tableau qu'on vient de voir là.
$_FILES['nom_de_votre_autre_champ']['size'] contiendra ainsi la taille du second fichier, et ainsi de suite.


Je vous propose de faire les vérifications suivantes pour décider si on accepte le fichier ou non :

  1. Vérifier tout d'abord si le visiteur a bien envoyé un fichier (en testant la variable $_FILES['monfichier'] avec isset) et s'il n'y a pas eu d'erreur d'envoi (grâce à $_FILES['monfichier']['error'])
  2. Vérifier si la taille du fichier ne dépasse pas 1 Mo par exemple (environ 1 000 000 d'octets) grâce à $_FILES['monfichier']['size']
  3. Vérifier si l'extension du fichier est autorisée (il faut interdire à tout prix que les gens puissent envoyer des fichiers PHP, sinon ils pourraient exécuter des scripts sur votre serveur !). Dans notre cas, nous autoriserons seulement les images (fichiers .png, .jpg, .jpeg et .gif).
    Nous analyserons pour cela la variable $_FILES['monfichier']['name'].


Nous allons donc faire une série de tests dans notre page cible_envoi.php.

1/ Tester si le fichier a bien été envoyé



On commence par vérifier qu'un fichier a été envoyé en testant si la variable $_FILES['monfichier'] existe avec isset().
On vérifie dans le même temps s'il n'y a pas d'erreur d'envoi.

Code : PHP
1
2
3
4
5
6
7
<?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)
{
 
}
?>



2/ Vérifier la taille du fichier



On veut interdire que le fichier dépasse 1 Mo, soit environ 1 000 000 d'octets (j'arrondis pour simplifier). On doit donc tester $_FILES['monfichier']['size'] :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?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)
        {
 
        }
}
?>


3/ Vérifier l'extension du fichier



On peut récupérer l'extension du fichier dans une variable grâce à ce code :

Code : PHP
1
2
3
4
<?php
$infosfichier = pathinfo($_FILES['monfichier']['name']);
$extension_upload = $infosfichier['extension'];
?>


La fonction pathinfo renvoie un array contenant entre autres l'extension du fichier dans $infosfichier['extension']. On stocke ça dans une variable $extension_upload.

Une fois l'extension récupérée, on peut la comparer à un tableau d'extensions autorisées (un array) et vérifier si l'extension récupérée fait bien partie des extensions autorisées à l'aide de la fonction in_array().

Ouf ! Ca donne ça au final :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?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)
        {
                // 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))
                {
                
                }
        }
}
?>



4/ Valider l'upload du fichier



Si tout est bon, on accepte le fichier en appelant move_uploaded_file().
Cette fonction prend 2 paramètres :



Je propose de placer le fichier dans un sous-dossier "uploads".
On gardera le même nom de fichier que celui d'origine. Comme $_FILES['monfichier']['name'] contient le chemin entier vers le fichier d'origine (C:\dossier\fichier.png par exemple), il nous faudra extraire le nom du fichier. On peut utiliser pour cela la fonction basename qui renverra juste "fichier.png" :)

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?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)
        {
                // 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é !";
                }
        }
}
?>


Lorsque vous mettrez le script sur le net à l'aide d'un logiciel FTP, vérifiez que le dossier "uploads" sur le serveur existe et qu'il a les droits d'écriture. Pour ce faire, sous Filezilla par exemple, faites un clic droit sur le dossier et choisissez "Attributs du fichier".
Cela vous permettra d'éditer les droits du dossier (on parle de CHMOD). Mettez les droits à 733, ainsi PHP pourra placer des fichiers uploadés dans ce dossier.


Ce script est un début, mais en pratique il vous faudra sûrement encore l'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.

Soyez toujours très vigilants sur la sécurité, vous devez éviter que quelqu'un puisse envoyer des fichiers PHP sur votre serveur.


Pour aller plus loin, je vous recommande de lire le tutoriel de DHKold sur l'upload de fichiers par formulaire. Il est plus complet que le mien et vous expliquera mieux certains détails.

Bonne lecture ;)

Q.C.M.

Si on ne met pas d'attribut action au formulaire, que va-t-il se passer ?
Quelle variable sera créée avec cette zone de texte Code : Autre
1
<input type="text" name="ville" />
Quelle sera la variable créée, et quelle sera sa valeur, si on ne change pas le texte par défaut de la grosse zone de texte ci-dessous ?Code : Autre
1
2
3
<textarea name="news" rows="8" cols="45">
Tapez la news ici.
</textarea>
Quel est l'attribut à rajouter à une case à cocher pour qu'elle soit cochée par défaut ?
Quelle est la valeur d'une variable correspondant à une case à cocher cochée ?
Que va produire ce code HTML ?Code : Autre
1
<input type="hidden" name="age" value="18" />


Chapitre précédent Sommaire Chapitre suivant
Auteur : M@teo21
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Edité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 574 Zéros connectés | Requêtes SQL 10 requêtes | Temps de génération de la page : Total (SQL) 0.1325s (0.1127s)