Conservation d'une variable [Résolu]

Signaler
Messages postés
64
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
9 juin 2020
-
Messages postés
64
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
9 juin 2020
-
Bonjour,

J'utilise sur une page le code ci-dessous pour permettre le téléchargement de fichiers.
Pour une question pratique à l'exploitation ensuite, je souhaite mettre une épithète au nom du fichier. Celle-ci est en fait la récupération d'une variable précédente $Num qui arrive sur cette page avec la fonction _GET. la transmission de la variable fonctionne et sa présence à l'arrivée est vérifiée.

Mais même si la variable arrive bien, j'ai 2 problèmes { rien que pour ici ;-) }.

1°) Lorsqu'un fichier est envoyé, la variable disparait. Pour la conserver, si je ne dis pas de bêtises, il faut utiliser les sessions. Malheureusement, j'ai l'impression que ma super-variable s'efface quand même puisqu'au rafraichissement de la page elle ne s'affiche pas (ligne 36 ou ligne 20).


2°) La variable ne se concatène pas avec le nom du fichier (ligne 34).
la variable $nom qui s'affiche après l'envoi est juste le nom du fichier sans la variable.
J'ai fait également l'essai au niveau du $fichier_temporaire (ligne 46) mais ça ne fonctionne pas non plus (ce qui ne me surprend qu'à moitié puisque ça serait l'emplacement... et donc pas le nom !).
Ma question est : où placer cette concaténation ?

J'adresse toute ma gratitude et mes remerciements à celui ou celle qui pourra m'aider.

Daniel


<?php 
/**

  The Initial Developer of the Original Code is
  Matthieu  - http://www.programmation-facile.com/
  Portions created by the Initial Developer are Copyright (C) 2013
  the Initial Developer. All Rights Reserved.

  Contributor(s) :

 */
 // pour garder la variable $Num après envoi d'un fichier
session_start();

//On vérifie que $Num est bien là
    $Num = $_GET['Num'];
    echo $Num;

$_SESSION['Num'] = $Num;
echo $_SESSION["Num"];



// Initialisation de la variable de message. 
$msg = ""; 

// Traitement du formulaire si il y a un fichier envoyé sur le serveur. 
if (isset($_POST["valid"]))
{ 
	// Récupére les informations sur le fichier. 
	$oFileInfos = $_FILES["fichier"]; 
 
	// nom du fichier. 
	$nom = $_SESSION['Num'].$oFileInfos["name"];
	echo $nom;
	echo $_SESSION['Num'];

	// le type MIME.  
	$type_mime = $oFileInfos["type"]; 

	// la taille. 
	$taille = $oFileInfos["size"]; 

	
	// emplacement du fichier temporaire. 
	$fichier_temporaire = $oFileInfos["tmp_name"]; 

	// le code d’erreur. 
	$code_erreur = $oFileInfos["error"]; 

	switch ($code_erreur)
	{ 
		case UPLOAD_ERR_OK : 
			// Fichier bien reçu. 
			// Détermine sa destination finale. 
			$destination = "uploads/$nom"; 

			// Copie le fichier temporaire 
			if (copy($fichier_temporaire,$destination))
			{ 
				// Copie OK
				$msg  = "<br> Transfert termine - Fichier = $nom - "; 
				$msg .= "Taille = $taille octets - "; 
				$msg .= "Type MIME = $type_mime."; 
			}
			else
			{ 
				// Problème de copie => message d’erreur. 
				$msg = "Probleme de copie sur le serveur."; 
			} 
			break; 

		case UPLOAD_ERR_NO_FILE : 
			// Pas de fichier saisi. 
			$msg = "Pas de fichier saisi."; 
			break; 

		case UPLOAD_ERR_INI_SIZE : 
			// Taille fichier > upload_max_filesize. 
			$msg  = "Fichier ".$nom." non transfere "; 
			$msg .= " (taille > upload_max_filesize)"; 
			break; 

		case UPLOAD_ERR_FORM_SIZE : 
			// Taille fichier > MAX_FILE_SIZE. 
			$msg  = "Fichier ".$nom." non transfere "; 
			$msg .= "(taille > MAX_FILE_SIZE)";
			$msg .= "<br><font color=red>Votre fichier dépasse la taille autorisée !</font>";
			break; 

		case UPLOAD_ERR_PARTIAL : 
			// Fichier partiellement transféré. 
			$msg  = "Fichier ".$nom." non transfere "; 
			$msg .= "(problème lors du tranfert)"; 
			break; 

		case UPLOAD_ERR_NO_TMP_DIR : 
			// Pas de répertoire temporaire. 
			$msg  = "Fichier ".$nom." non transfere "; 
			$msg .= "(pas de répertoire temporaire)"; 
			break; 

		case UPLOAD_ERR_CANT_WRITE : 
			// Erreur lors de l’écriture du fichier sur disque. 
			$msg  = "Fichier ".$nom." non transfere "; 
			$msg .= "(erreur lors de l'écriture du fichier sur le serveur)"; 
			break; 

		case UPLOAD_ERR_EXTENSION : 
			// Transfert stoppé par l’extension. 
			$msg  = "Fichier ".$nom." non transfere "; 
			$msg .= "(transfert stoppé par l'extension)"; 
			break; 

		default : 
			// Erreur non prévue ! 
			$msg  = "Fichier non transfere "; 
			$msg .= "(erreur inconnue : ".$code_erreur.")"; 
	}

} // fin du isset POST


?>



<!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"> 
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Upload</title></head> 
	<body> 		
<p> </p>

<p>     Vous allez pouvoir mettre vos fichiers à télécharger à partir de cette page.</p>
<p>     Vous enverrez vos fichiers 1 par 1. La taille doit être < à 2Mo. Les formats préférentiels 
sont le pdf et éventuellement le jpg.</p>

<form action="EnvoiPJ.php" method="post" enctype="multipart/form-data"> 
			<div> 
				Fichier :  
				<input type="hidden" name="MAX_FILE_SIZE" value="2048000" />
				<input size="100" type="file" name="fichier" value="" /> 
				<input type="submit" name="valid" value="Envoyer le fichier" /><br /> 
				<br><?php echo $msg; ?> 
			</div> 
		</form> 
<p> </p>
<br>
</body> 
</html>



Configuration: Windows / Firefox 75.0 / PHP 7.2.24


--

1 réponse

Messages postés
29878
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 octobre 2020
2 884
Bonjour,

Pour ne pas remettre ta variable à vide.. tu dois d'abord t'assurer qu'elle existe en GET avant de la mettre en session.
Un truc du genre
//On vérifie que $Num est bien là
$Num = !empty($_GET['Num']) ? $_GET['Num'] : NULL;
echo $Num;
if($Num)[
  $_SESSION['Num'] = $Num;
}

Comme tu le vois, je récupère PROPREMENT la variable AVANT de l'utiliser...
(je t'invite à lire et à appliquer les conseils donnés ici : https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code )

Et donc, pour le nom de ton fichier, on peut appliquer le même genre de code :
// Récup du Num
$Num = !empty($_SESSION['Num']) ? $_SESSION['Num'] : NULL; 

// Récupére les informations sur le fichier. 
$oFileInfos = !empty($_FILES["fichier"]) ? $_FILES["fichier"] : NULL;

$FileName = !empty($oFileInfos["name"]) ? $oFileInfos["name"] : NULL;

// nom du fichier. 
if($Num && $FileName){
  $nom = $Num.$FileName;
}else{
  echo "Erreur..."; 
}

Messages postés
29878
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 octobre 2020
2 884
Au passage, le lien vers les conseils à suivre t'avait déjà été donné :
https://forums.commentcamarche.net/forum/affich-36561356-if-else-recalcitrant#2

C'est dommage de devoir se répéter. :-(
Messages postés
64
Date d'inscription
samedi 18 février 2006
Statut
Membre
Dernière intervention
9 juin 2020
1
Bonjour Jordane,
Merci pour l'aide. je vais regarder ça.
Sinon, pour ma variable en GET, j'ai bien vérifié que ça fonctionnait en l'affichant mais c'est vrai que c'est moins rigoureux que de mettre une vérification systématique dans le code comme tu le montres.
Merci encore.
peut-être que mes déboires serviront à d'autres aussi.