[PHP] Enregistrement d'un champ type 'file'

Bonjour,

Voici mon code avec commentaires :

fichier d'interface (formulaire où je charge mon fichier type 'file')

<?php // accès direct interdit
  defined('RACINE') or die('accès direct interdit');
?>


<form action="traitements/inserer.php" method="post" enctype='multipart/form-data'>

	<table>

		<tr>
			<th>Description</th>
				<td><input type='text' name='description'/></td>
		</tr>

		<tr>
			<th>Photo 1</th>
				<td><input type='file' name='photo'/></td>
		</tr>

		<!--<tr>
			<td>Photo 2</td>
				<td><input type='file' name='photo2'/></td>
		</tr>-->

	</table>

		<tr>
			<td>Pour enregister :</td>
			<td><INPUT type="submit" value="Click click !"></td>
		</tr>

</form>


fichier de traitement (où je reçois les données du formulaire)

<?php

//on definit la constante 'RACINE' :
define('RACINE', '../../../');

require(RACINE.'modules/admin/parametres/autorisation_admin.php');
//require(RACINE.'modules/admin/parametres/fonctions.php');

// on récupère les variables crée dans le formulaire
	if (isset($_FILES["photo"])) $photo=$_FILES["photo"]; else $photo='';
	//if (isset($_FILES["photo2"])) $photo2=$_FILES["photo2"]; else $photo2='';
	if (isset($_POST ["description"])) $description=$_POST["description"]; else $description='';
	
	//on enregistre la photo sur le serveur si elle existe:
	if(isset($photo) && is_uploaded_file($photo['tmp_name']))
		{
			//on crée le nom du fichier
			$photo_name=$photo['name'];

			//on écrit le fichier sur le serveur
			$origine=$photo['tmp_name'];
			$destination=dirname($_SERVER['SCRIPT_FILENAME']).'/../images/'.$photo_name;
			move_uploaded_file($origine,$destination);
		}
	else 
		{
			$photo_name='visiteur.jpg';
		}
		

//on se connecte à la base de données en appelant la connexion:
require(RACINE.'parametres/connexion.php');

//on indique la requête SQL désirée:
$sql="INSERT INTO colliers(photo,description) VALUES ('$photo_name','$description')";

// ça donne un resultat :
mysql_query($sql);

//fermeture de la connexion
mysql_close($liendb);

//on retourne versla page afficher:
header("Location:".RACINE."composants/colliers/afficher.php");
echo $sql;
?>



Le problème : on dirait que mon fichier de traitement ne récupère pas la donnée type 'file' et donc on ne rentre pas dans le 'if' qui permet d'enregistrer le fichier.
--

Pouvez vous me dire d'où cela provient?
Merci de votre aide, espérant avoir été claire et pas trop vague. Je suis very novice!

--
Je galère !
Configuration: Windows Vista, Google Chrome + Firefox
Wamp pour le PHP

11 réponses

  1. Faut pas travailler sur le $_FILES["photo"] mais sur le $_FILES["photo"]["name"] il me semble ;)

    0
    1. oui ce se que je pense si non tu crée un variable $photo=$_FILES["photo"]["name"] et ensuite tu peut just utiliser $photo["name"] ou $photo["tmp_name"], $photo["size"]..
      0
      1. j'ai essayé de mettre $_FILES['photo']['name'] à la place de $_FILES['photo'] mais ça ne marche pas non plus. je ne comprends pas pourquoi le traitement arrive à récupérer le $_POST['description'] et pas le $_FILES['photo'] !

        :-(
        0
        1. Merci scriptiz.

          Je suis le tutoriel, comment puis je : "Première chose à faire, vérifier que l'opération s'est bien passée en vérifiant la présence du fichier dans le dossier temporaire; pour cela, nous avons à notre disposition la fonction is_uploaded_file(). " ? Je ne sais pas comment utiliser la fonction pr vérifier?
          0
          1. Lis le tuto en entier il y a un exemple de code où il montre comment utiliser le is_uploaded_file() plus bas.

            En gros lit tout 2-3 fois avant de poser des questions ^^

            0
            1. vérifiant la présence du fichier dans le dossier temporaire

              tu faire echo $_FILE['photo']['tmp_name']
              si le nom s'affiche (.tmp) c'est a dire que le chargement a été bel et bien effectué, si non..
              0
              1. J'ai vérifié, l'upload ne se fait pas. Je ne comprends vraiment pas pourquoi alors que le $_POST passe sans souci!
                0
                1. qqs commentaires et rectifssur une partie de ton code:

                  // on récupère les variables crée dans le formulaire
                  	if (isset($_FILES["photo"])) $photo=$_FILES["photo"]; else $photo='';
                  	//if (isset($_FILES["photo2"])) $photo2=$_FILES["photo2"]; else $photo2='';
                  	if (isset($_POST ["description"])) $description=$_POST["description"]; else $description='';
                  	
                  	//on enregistre la photo sur le serveur si elle existe:
                  	///////if(isset($photo) && is_uploaded_file($photo['tmp_name']))
                  	//la tu testes si la variable $photo existe hors elle existe dans tous les cas puisque 3 lignes plus haut tu lui donnes une valeur par defaut même si $_FILES n'existe pas
                  		//donc mets plutot:
                  		if($photo!='' && is_uploaded_file($photo['tmp_name']))
                  		{
                  			//on crée le nom du fichier
                  			$photo_name=$photo['name'];
                  
                  			//on écrit le fichier sur le serveur
                  			$origine=$photo['tmp_name'];
                  			$destination=dirname($_SERVER['SCRIPT_FILENAME']).'/../images/'.$photo_name;
                  			////// move_uploaded_file($origine,$destination); //la d'ou vient $destination ?
                  			move_uploaded_file($origine,$photo_name);
                  			
                  		}
                  	else 
                  		{
                  			$photo_name='visiteur.jpg'; //la je ne vois pas ce que tu en fait après
                  		}
                  0
                  1. alain_42, merci de prendre le temps de me lire !

                    donc le $destination est défini ici :
                    $destination=dirname($_SERVER['SCRIPT_FILENAME']).'/../images/'.$photo_name;


                    et après je dis que si le $photo existe pas et qu'il est pas uploadé dans le 'tmp_name' alors je l'appelle visiteur.jpg.

                    je sais pas si c'est très clair, je ne fais que recopier ce qu'on m'apprend en cours.
                    0
                    1. houps excuses j'avais pas vu $destination deux lignes au dessus

                      mais la variable $phot_name chargée par défaut plus bas ne sera pas prises en compte dans $destination
                      0