[RESOLU] Récupération de variable à la suite d'un upload

Eléphanteau du PHP | 17 Messages

01 févr. 2013, 03:13

Bonjour à tous!

Et bien voila *S'allonge sur le divan* Je bloque depuis 4 bonnes heures sur un formulaire et j'ai besoin d'aide.

En effet, je cherche à upload un fichier et celui-ci de retrouve visiblement pas mon $_FILES... Handicapant n'est-ce pas?

Voyez plutôt mes deux fichiers

Dans un premier temps le HTML: "musique.php"
<!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" lang="fr">
	<head>
		<title>StarBox - Musique</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style/css/style.css" />
	</head>
	<body>
		<?php
		session_start();
		require_once('db.php');
		include("header.php");
		
		if (!isset($_SESSION['login'])) {
			echo '<div class="error"><p>Vous devez vous connecter pour accéder à cette page.</p></div>';
			session_destroy();
			header ("Refresh: 2;URL=index.php");
		}
		else {
			?>
			
			<div class="starbox">
			
			<?php echo "Bonjour " . $_SESSION['login'] . "."; ?>
			
			<form class="starbox" name="addmusic" method="post" action="business_addmusic.php" enctype="multipart/form-data" OnSubmit="return Send()">
			<a href="home.php"><< Accueil</a> <br />
			<h1>Ajouter une musique</h1>
			<table class="addmusic">
				<tr colspan="2">
					<td>Fichier à ajouter:<br />
					<input name="addmusic_path" type="file" />*<br /><br /></td>
				</tr>
				<tr>
					<td>Titre:<br />
					<input type="text" name="addmusic_titre" />*<br /><br /></td>
					<td>Artiste: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_artiste" /><br /><br /></td>
				</tr>
				<tr>
					<td>Numéro de piste: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_number" /><br /><br /></td>
					<td>Nom de l'album: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_album" /><br /><br /></td>
				</tr>
				<tr>
					<td>Année:<i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_annee" /><br /><br /></td>
				</tr>
				<tr>
					<td colspan="2">Genre(s):<br />
								<?php 
								$genresmusic=$database->query('SELECT GENRE_ID, GENRE_NOM FROM genre WHERE GENRE_TYPE = 1 ORDER BY GENRE_NOM');
								while($val = $genresmusic->fetch())
								{
									echo '<input type="radio" name="genre" value="'.$val['GENRE_NOM'].'" id="'.$val['GENRE_ID'].'" /> <label for="'.$val['GENRE_ID'].'">'.$val['GENRE_NOM'].'</label>';
								}
								?>
					<br /><br /></td>
				</tr>
				<tr>
					<td>Confidentialité:<br />
					<input type="checkbox" id="private" name="confidentialite" value="Privé"/><label for="private">Privé</label><br /><br /></td>
				</tr>
			</table>
			<input type="submit" value="Ajouter la musique" />
			</form>
			</div>
			<?php 
		}
		?>
	</body>
</html>



Et dans un second temps le PHP: "business_addmusic.php"
<!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" lang="fr">
	<head>
		<title>Redirection...</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style/css/style.css" />
	</head>
	<body>
		<?php
		session_start();
		require_once('db.php');
		include("header.php");
		
		if (!isset($_SESSION['login'])) {
			echo '<div class="error"><p>Vous devez vous connecter pour accéder à cette page.</p></div>';
			session_destroy();
			header ("Refresh: 2;URL=index.php");
		}
		else {
			
			if ($_FILES['addmusic_path']['name'] != "" and $_POST['addmusic_titre'] != "") {
				
				if ($_POST['addmusic_artiste'] == "") {
					$_POST['addmusic_artiste'] = "Inconnu";
				}
				
				if ($_POST['addmusic_number'] == "") {
					$_POST['addmusic_number'] = "NA";
				}
				
				if ($_POST['addmusic_album'] == "") {
					$_POST['addmusic_album'] = "Inconnu";
				}
				
				if ($_POST['addmusic_annee'] == "") {
					$_POST['addmusic_annee'] = "Inconnue";
				}
				
				if (!isset($_POST['genre'])) {
					$_POST['genre'] = "Divers";
				}
				
				if (isset($_POST['confidentialite'])) {
					$_POST['confidentialite'] = 1;
				}
				else {
					$_POST['confidentialite'] = 0;
				}
				
				$idgenre=$database->prepare('SELECT GENRE_ID FROM genre WHERE GENRE_NOM = "'.$_POST['genre'].'" AND GENRE_TYPE = 1');
				$idgenre->execute();
				$data = $idgenre->fetch();
				
				$_SESSION['idgenre'] = $data['GENRE_ID'];
				
				echo $_SESSION['idgenre'].'<br />';
				echo $_SESSION['user_id'].'<br />';
				echo $_FILES['addmusic_path']['name'].'<br />';
				echo $_POST['addmusic_titre'].'<br />';
				echo $_POST['addmusic_artiste'].'<br />';
				echo $_POST['addmusic_number'].'<br />';
				echo $_POST['addmusic_album'].'<br />';
				echo $_POST['addmusic_annee'].'<br />';
				echo $_POST['genre'].'<br />';
				echo $_POST['confidentialite'].'<br />';
				
 				$addmusic=$database->prepare('INSERT INTO fichier(GENRE_ID, TYPE_ID, FICHIER_NOM, FICHIER_CHEMIN, FICHIER_ANNEE, FICHIER_ARTISTE, FICHIER_ALBUM, FICHIER_PRIVE, FICHIER_PROPRIO, FICHIER_NUMERO) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
 				$addmusic->execute(array($_SESSION['idgenre'], 1, $_POST['addmusic_titre'], $_FILES['addmusic_path']['name'], $_POST['addmusic_annee'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['confidentialite'], $_SESSION['user_id'], $_POST['addmusic_number']));
 				
 				$dossier = 'upload/';
 				$fichier = basename($_FILES['addmusic_path']['name']);
 				$taille = filesize($_FILES['addmusic_path']['tmp_name']);
 				$extensions = array('.mp3', '.ogg', '.wav', '.aac', '.m4a', '.flac', '.wma');
 				$extension = strrchr($_FILES['addmusic_path']['name'], '.');
 				//Début des vérifications de sécurité...
 				if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
 				{
 					$erreur = 'Vous devez envoyer une musique de type mp3, ogg, wav, aac, m4a, flac ou wma.';
 				}

 				if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
 				{
 					//On formate le nom du fichier ici...
 					if(move_uploaded_file($_FILES['addmusic_path']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
 					{
 						echo '<div class="success">Musique ajoutée.</div>';
						unset($_SESSION['idgenre']);
						unset($_FILES['addmusic_path']['name']);
						unset($_POST['addmusic_titre']);
						unset($_POST['addmusic_artiste']);
						unset($_POST['addmusic_number']);
						unset($_POST['addmusic_album']);
						unset($_POST['addmusic_annee']);
						unset($_POST['genre']);
						unset($_POST['confidentialite']);
						header ("Refresh: 2;URL=musique.php");
 					}
 					else //Sinon (la fonction renvoie FALSE).
 					{
 						echo 'Échec de l\'upload !';
 					}
 				}
 				else
 				{
 					echo $erreur;
 				}
				
				
			}
			else {
				echo '<div class="error">Merci de remplir tous les champs obligatoires.</div>';
				unset($_SESSION['idgenre']);
				unset($_FILES['addmusic_path']['name']);
				unset($_POST['addmusic_titre']);
				unset($_POST['addmusic_artiste']);
				unset($_POST['addmusic_number']);
				unset($_POST['addmusic_album']);
				unset($_POST['addmusic_annee']);
				unset($_POST['genre']);
				unset($_POST['confidentialite']);
				header ("Refresh: 2;URL=musique.php");
			}
		}
		?>


L'erreur que j'obtiens est un magnifique "Undefined index: addmusic_path" à chaque fois que j'essaye d'utiliser $_FILES['addmusic_path'] dans mon fichier "business_addmusic.php".

Voila voila... J'ai cherché sur plusieurs forums et tous les problèmes qui ce posent son souvent dus au enctype="multipart/form-data" qui est ici bel et bien présent ou bien alors au php.ini. J'ai modifié le mien car l'appli web va a terme fonctionner uniquement en local.

Infos utiles:
- navigateur Firefox (mais je vous "rassure" ça fonctionne pas non plus sous IE -_-)

php.ini:
- file_uploads = On
- post_max_size = 2050M
- upload_max_filesize = 2048M (c'est très gros car je compte par la suite pouvoir upload des films)


En tout cas je vous remercie par avance des conseils avisés que vous pourrez me donner !!

Bonne journée à vous. (ou plutôt nuit.)


PS: je me doute que ça doit être codé un peu crade :s, je suis dans l'ingénierie réseau, pas en dev' ^^"
Modifié en dernier par Sayko le 01 févr. 2013, 10:54, modifié 1 fois.

ViPHP
ViPHP | 2577 Messages

01 févr. 2013, 09:19

print_r($_FILES); pour voir le contenu de la variable.
Il faudra également tester si une erreur s'est produite $_FILES['addmusic_path']['error'] par la suite.

Eléphanteau du PHP | 17 Messages

01 févr. 2013, 09:49

Voici le contenu de la commande "print_r($_FILES);":
Array ( [addmusic_path] => Array ( 
                        [name] => 1 - Invigorate.mp3 
                        [type] => [tmp_name] => 
                        [error] => 1 
                        [size] => 0 ) 
                        ) 

Quant à la commande "echo $_FILES['addmusic_path']['error'];": 1 (normal quoi).


Je ne vois vraiment pas comment résoudre ce soucis...

ViPHP
ViPHP | 2577 Messages

01 févr. 2013, 12:47

UPLOAD_ERR_OK: 0
UPLOAD_ERR_INI_SIZE: 1
UPLOAD_ERR_FORM_SIZE: 2
UPLOAD_ERR_NO_TMP_DIR: 6
UPLOAD_ERR_CANT_WRITE: 7
UPLOAD_ERR_EXTENSION: 8
UPLOAD_ERR_PARTIAL: 3

A priori 1 signifie qu'il y a une erreur sur la taille du fichier par rapport au fichier php.ini.

Tu peux faire une page <?PHP phpinfo() ?> pour voir la taille autorisée et le nombre de fichiers :
php.ini:
- file_uploads = On <= faute de frappe ?
- post_max_size = 2050M
- upload_max_filesize = 2048M
Edit : rassures moi, tu n'es pas en 32 bit ? Parce que dans ce cas il faut que tu vérifies la valeur max d'un entier... Mais phpinfo() devrait te mettre sur la voie.

Eléphanteau du PHP | 17 Messages

01 févr. 2013, 14:43

Bizarre... j'ai changé manuellement les valeurs dans le php.ini et fixé celles précisées dans mon premier message mais dans le phpinfo() il semble ne pas avoir pris en compte mon changement...

file_uploads On On
post_max_size 8M 8M
upload_max_filesize 2M 2M
upload_tmp_dir c:/wamp/tmp c:/wamp/tmp

Sinon oui je suis en x64.

Mais je ne vois pas pourquoi ce n'est pas appliqué...

Eléphant du PHP | 267 Messages

01 févr. 2013, 14:54

t'as redémarré le serveur ?

ViPHP
ViPHP | 2577 Messages

01 févr. 2013, 15:28

Il y a 2 php.ini : 1 pour apache et 1 en ligne de commandes, peut être que tu n'as pas modifié le bon ?
(la remarque sur le redémarrage d'apache pour la prise en compte reste valable bien sûr)

Eléphanteau du PHP | 17 Messages

01 févr. 2013, 17:54

Je m'en suis rendu compte quelques minutes après mon dernier post en effet mais je n'avais pas redémarré les services comme un c** (c'est la première fois que je modifiais le php.ini).

Cela fonctionne bien à présent! Merci beaucoup de m'avoir mis sur la piste !

Je passe en résolu.

Eléphanteau du PHP | 17 Messages

06 févr. 2013, 17:52

Bonjour !

Je reviens vers vous car je suis passé à l'étape suivante de mon projet; à savoir mettre mon projet sur une VM debian.

Donc, j'accède au localhost et au phpmyadmin sans aucun soucis, mais l'upload ne passe pas...
En faisant un print_r($_FILES); j'ai pu voir que j'avais un tmp_name très bizarre... je sais pas si c'est normal.

Voici le résultat de mon print_r($_FILES);
Array ( 
[addmusic_path] => Array ( 
                                        [name] => 01 - Stabbing The Drama.mp3 
                                        [type] => audio/mpeg 
                                        [tmp_name] => /tmp/phpsRsLoW 
                                        [error] => 0 
                                        [size] => 10989696 )
 ) 

Voici l'endroit ou mon fichier php me fait une déconade, pour le formulaire, c'est le même que dans le premier post:
	$dossier = 'upload/';
 				$fichier = basename($_FILES['addmusic_path']['name']);
 				$taille = filesize($_FILES['addmusic_path']['tmp_name']);
 				$extensions = array('.mp3', '.ogg', '.wav', '.aac', '.m4a', '.flac', '.wma', '.MP3', '.OGG', '.WAV', '.AAC', '.M4A', '.FLAC', '.WMA');
 				$extension = strrchr($_FILES['addmusic_path']['name'], '.');
 				//Début des vérifications de sécurité...
 				if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
 				{
 					$erreur = '<div class="error">Vous devez envoyer une musique de type mp3, ogg, wav, aac, m4a, flac ou wma.</div>';
 				}

 				if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
 				{
 					//On formate le nom du fichier ici...
 					if(move_uploaded_file($_FILES['addmusic_path']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
 					{
 						$addmusic=$database->prepare('INSERT INTO fichier(GENRE_ID, TYPE_ID, FICHIER_NOM, FICHIER_CHEMIN, FICHIER_ANNEE, FICHIER_ARTISTE, FICHIER_ALBUM, FICHIER_PRIVE, FICHIER_PROPRIO, FICHIER_NUMERO) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
 						$addmusic->execute(array($_SESSION['idgenre'], 1, $_POST['addmusic_titre'], $_FILES['addmusic_path']['name'], $_POST['addmusic_annee'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['confidentialite'], $_SESSION['user_id'], $_POST['addmusic_number']));
 						
 						exec(escapeshellcmd('scripts/aj_musique.sh', $_FILES['addmusic_path']['name'], $_POST['addmusic_titre'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['genre'], $_POST['addmusic_annee'], $_POST['addmusic_number']));
 						
 						echo '<div class="success">Musique ajoutée.</div>';
						unset($_SESSION['idgenre']);
						unset($_FILES['addmusic_path']['name']);
						unset($_POST['addmusic_titre']);
						unset($_POST['addmusic_artiste']);
						unset($_POST['addmusic_number']);
						unset($_POST['addmusic_album']);
						unset($_POST['addmusic_annee']);
						unset($_POST['genre']);
						unset($_POST['confidentialite']);
						header ("Refresh: 2;URL=musique.php");
 					}
 					else //Sinon (la fonction renvoie FALSE).
 					{
 						print_r($_FILES);
 						echo '<div class="error">Échec de l\'upload !</div>';
 					}
 				}
 				else
 				{
 					echo $erreur;
 				}

Merci par avance pour votre aide!

Cordialement,

Eléphanteau du PHP | 12 Messages

06 févr. 2013, 22:58

Pour le nom tmp, c'est normal, il est auto généré est n'est pas fait pour être agréable ^^.
Le nom de ton fichier est stocké dans $_FILE['addmusic_path']['name']

Sinon quelle est exactement ton problème à present ? Quelle erreur avec ce code PHP ?

Aussi :
[name] => 01 - Stabbing The Drama.mp3
+
$fichier = basename($_FILES['addmusic_path']['name']);
...
move_uploaded_file($_FILES['addmusic_path']['tmp_name'], $dossier . $fichier)
A mon avis debian/apache aime pas bien les espaces/accents.
Tu devrai traiter le nom du fichier avant d'utiliser move_uploaded_file. (suppression/remplacement des accents/espaces)
Au pire tu peu aller chercher plus de details dans tes logs apache/php si t'est sur ta VM.

Eléphanteau du PHP | 17 Messages

07 févr. 2013, 09:51

Avant tout, bonjour et merci pour ta réponse.

Je suis allé voir dans les logs apache2 et j'ai trouvé ce style de lignes:

Image

Visiblement il y a un soucis de permissions... Je vais essayer de passer le dossier en 755...

Sinon du coup je vais surement ajouter ces lignes pour filtrer un peu le nom:
$fichier = str_replace(' ','',$fichier);
$fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
Je reteste ça et je vous dis

Eléphanteau du PHP | 17 Messages

07 févr. 2013, 11:37

Bon le fait de virer les espaces/accents, des chaines de caractères ne changent rien.

J'ai essayé de mettre le dossier upload en 755 mais ça à rien changé...

EDIT: Bon j'ai tout passé en 777 et ça fonctionne... donc visiblement c'était un soucis de droits.