pb upload (changement : caractère spéciaux et UTF-8)

ViPHP
AB
ViPHP | 5818 Messages

07 oct. 2011, 05:20

Oui ça c'était une erreur de ma part. Essaies ça :
<?php
// Chargement de la classe
require('Classe_upload.php');


// On déclare un tableau pour enregistrer les messages d'erreur du formulaire
$_SESSION['erreur_form'] = isset($_SESSION['erreur_form']) ?  $_SESSION['erreur_form'] : array();

if (isset($_POST['form1']))
	 {                      
									 
		 //on regarde si la description est remplie
		 $description = !empty($_POST['description']) ? $_POST['description'] : '';
				 
				 
		  if (!empty($_POST['style']))
				  {
						 $style = $_POST['style'];
				  }
				  else
				  {
						 $_SESSION['erreur_form'][] = "Veuillez sélectionner un style musical.";
				  }
				 
				 
		 if (!empty($_POST['titre']))
				 {
						 $titre = $_POST['titre'];
						 
						 if (!preg_match("#^[a-zA-Z0-9]+$#", $titre))
								 {
										 $_SESSION['erreur_form'][] = "Veuillez n'utiliser que des caractères alphanumériques dans le titre.";
								 }
				 }
				 else
				 {
						 $_SESSION['erreur_form'][] = "Veuillez indiquer le titre de la chanson.";
				 }
				 
				 
		 if (count($_SESSION['erreur_form']) > 0)
		 {
				 $_SESSION['erreur_form'][] = 'Aucun fichier n\'a été téléchargé';
				 
				 //reload de la page
				 header('Location: '.$_SERVER['PHP_SELF']);
				 exit;
		 }
	}




if (count($_SESSION['erreur_form']) == 0)
	 {
		 $repertoire_destination = 'Code/musiques';
		 
		 //Déclaration de la classe
		 $up = new Telechargement($repertoire_destination,'form1','song','controle_form');
		 
		 //Extensions autorisées (sans les .)
		 $extensions = array("mp3");
		 $up->Set_Extensions_accepte ($extensions);
		 
		 // Rennommage des fichiers (en mode incrémentiel) si déjà présents sur le serveur.
		 $up->Set_Renomme_fichier('incr');
		 
		 // Téléchargement
		 $up->Upload();
		 
		 
		 // Enregistrement en bdd des valeurs récupérées par le post
		 if (isset($_POST['form1']))
				 {
			 
					 // Récupération des valeurs du transfert de fichiers
					 $transfert = $up->Get_Tab_upload();//tableau à plusieurs dimensions (c.f. Doc de la class pour plus de détails)
											 
					 // définition des valeurs par défaut
					 $fichier = array();
					 $dossier = array();
					 
					 if (isset($transfert['resultat']))
							 {
									 foreach ($transfert['resultat'] as $num => $rep)
											 {
													 foreach ($rep as $key => $value)
															 {
																	 if(!empty($value['nom'])) $fichier[] =  $value['nom'];// Nom du fichier transféré
																	 $dossier[] =  $key; // Nom du dossier
															 }                    
											 }    
							 }
			 
						   
					if(count($fichier) > 0)
					{
								
							 // là on est certain que le code qui suit ne s'exécutera que si un fichier à été téléchargé
							 
							 // Puisqu'il n'y a qu'un champ de fichier il sera dans $fichier[0], et puisqu'il n'y a pas de redimensionnement multiple il n'y a qu'un dossier de destination donc il sera dans $dossier[0]
							 
																	 
							 // la récupération des autres variables du post a été faite dans la première condition (haut de page) if (isset($_POST['form1']))

					 
					 
							 // Connexion à ta bdd
							 // connexion BDD par PDO
	 
							  $PARAM_hote='localhost';      // le chemin vers le serveur
							  $PARAM_port='3306';
							  $PARAM_nom_bd='monsite';          // le nom de votre base de données
							  $PARAM_utilisateur='root';    // nom d'utilisateur pour se connecter
							  $PARAM_mot_passe='';          // mot de passe de l'utilisateur pour se connecter
			 
			 
							  try{
											  $connexion = new PDO(
											  'mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd,
											  $PARAM_utilisateur,
											  $PARAM_mot_passe,
											  array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
											  );

											  $connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
											 
									 }
							  catch(Exception $e){
											 
											  echo 'Une erreur est survenue !';
											  echo 'Erreur : '.$e->getMessage().'<br />';
											  echo 'N° : '.$e->getCode();
											  die();
									 }
							  //   /fin de la connexion BDD par PDO-->
							 
							   $artiste = $_SESSION['pseudo'];
							   $id_artiste = $_SESSION['id'];
							   $adresse_chanson = $dossier[0].'/'.$fichier[0];
							   $vues = 0;
							   $note = 0;
							  $insert = $connexion->prepare('INSERT INTO chansons(titre, artiste, id_artiste, date_envoi, vues, note, description, adresse_chanson, style) VALUES(:titre, :artiste, :id_artiste, NOW(), :vues, :note, :description, :adresse_chanson, :style)');
							 
							 try
									 {
									 $insert->execute(array(
											 'titre' => $titre,
											 'artiste' => $artiste,
											 'id_artiste' => $id_artiste,
											 'vues' => $vues,
											 'note' => $note,
											 'description' => $description,
											 'adresse_chanson' => $adresse_chanson,
											 'style' => $style
											 ));
									 }
							 catch(Exception $e)
									 {
											 
											  echo 'Une erreur est survenue !';
											  echo 'Erreur : '.$e->getMessage().'<br />';
											  echo 'N° : '.$e->getCode();
											  die();
									 }
									 
							 //$insert->closeCursor(); // Termine le traitement de la requête
							 
							 
					 
			 
					 
																														 
	 
				   
					//la chanson est enregistréz dans la BDD chansons, on va maintenant récupérer son id créer automatiquement par MySQL
					$id = $_SESSION['id'];
					$sql  = 'SELECT id '.
									'FROM chansons '.
									'WHERE id_artiste='.$connexion->quote($id).' '.
									'and date_envoi= NOW()';
					$req = $connexion->query($sql);
					$req->setFetchMode(PDO::FETCH_OBJ); // on dit qu'on veut que le résultat soit récupérable sous forme d'objet
					$data = $req->fetch();
					$id_chanson = $data->id;
					$req->closeCursor(); // Termine le traitement de la requête
				   
					//on a récupérer l'id de la chanson, on va l'enregistrer dans la BDD musplay avec les infos correspondantes au compositeur
					$id_playlist = $_SESSION['id_playlist'];
					$id_crea = $_SESSION['id'];
					$type = 1;
					$insert2 = $connexion->prepare('INSERT INTO musplay(id_chanson, id_playlist, type, id_crea) VALUES(:id_chanson, :id_playlist, :type, :id_crea)');
					try
					{
					$insert2->execute(array(
											'id_chanson' => $id_chanson,
											'id_playlist' => $id_playlist,
											'type' => $type,
											'id_crea' => $id_crea
											));
					}
					catch(Exception $e)
					{
						 /* erreur insertion */
						 echo 'Une erreur est survenue !';
						 echo 'Erreur : '.$e->getMessage().'<br />';
						 echo 'NÐ : '.$e->getCode();
						 die();
					}
					//$insert2->closeCursor(); // Termine le traitement de la requête
				   
					//on incrémente de 1 le nombre de chansons du compositeur
					$nb_chanson = $_SESSION['nb_chanson'];
					$nb_chanson = $nb_chanson + 1;
					$id = $_SESSION['id'];
					$update = $connexion->prepare('UPDATE user SET nb_chanson = :nb_chanson WHERE id = :id');
					try
					{
					$update->execute(array(
											'nb_chanson' => $nb_chanson,
											'id' => $id
											));
					}
					catch(Exception $e)
					{
						 /* erreur insertion */
						 echo 'Une erreur est survenue !';
						 echo 'Erreur : '.$e->getMessage().'<br />';
						 echo 'NÐ : '.$e->getCode();
						 die();
					}
					$update->closeCursor(); // Termine le traitement de la requête
				   
					//on incrémente de 1 le nombre de chansons de la playlist de type 1 (compositeur) du compositeur dans playlist_compo
					$nb_chanson_playlist = $_SESSION['nb_chanson'];
					$nb_chanson_playlist = $nb_chanson_playlist + 1;
					$update2 = $connexion->prepare('UPDATE playlist_compo SET nb_chanson = :nb_chanson WHERE id = :id');
					try
					{
					$update2->execute(array(
											'nb_chanson' => $nb_chanson_playlist,
											'id' => $id
											));
					}
					catch(Exception $e)
					{
						 /* erreur insertion */
						 echo 'Une erreur est survenue !';
						 echo 'Erreur : '.$e->getMessage().'<br />';
						 echo 'NÐ : '.$e->getCode();
						 die();
					}
					
					
				  }
				  
				  $up->Get_Reload_page();	
				}
				
			
			// Récupération des messages d'information de téléchargement
			 $resultat = $up->Get_Tab_message();
							 
			   
		}
                   
               
?>
 <form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?controle_form=1' ?>" method = "post">
     
       <input type="hidden" name="MAX_FILE_SIZE" value="5242880" />

       <input type="file" name="song[]" /><br  />
         
                <label for="titre">Titre de la chanson : (seuls les caractères alphanumériques sont autorisés)</label><input type="text" name="titre" id="titre"/><br />
                 <label for="style"> Style musical de la chanson : </label>
                 <select name="style" id="style" >
                                 <option value="blues" > Blues </option>
                                 <option value="chanson_francaise" > Chanson Française </option>
                                 <option value="classique" id="classique" > Classique </option>
                                 <option value="club" > Club </option>
                                                                 <option value="country" > Country </option>
                                                                <option value="dance" > Dance </option>
                                                                <option value="disco" > Disco</option>
                                                                <option value="electro" > Electro</option>
                                                                <option value="electro_rock" >Electro-Rock </option>
                                                                <option value="electro_pop" > Electro-Pop</option>
                                                                <option value="folk" > Folk</option>
                                                                <option value="funk" > Funk</option>
                                                                <option value="garage_rock" > Garage Rock</option>
                                                                <option value="gospel" > Gospel</option>
                                                                <option value="grunge" > Grunge</option>
                                                                <option value="hard_rock" > Hard Rock </option>
                                                                <option value="heavy_metal" > Heavy Metal</option>
                                                                <option value="hip_hop" > Hip Hop</option>
                                                                <option value="house" > House</option>
                                                                <option value="indie_rock" > Indie Rock</option>
                                                                <option value="instrumental" > Instrumental</option>
                                                                <option value="jazz" > Jazz</option>
                                                                <option value="lounge" > Lounge<option>
                                                                <option value="mambo" > Mambo</option>
                                                                <option value="opera" > Opera</option>
                                                                <option value="pop" > Pop</option>
                                                                <option value="pop_rock" > Pop Rock</option>
                                                                <option value="punk" > Punk</option>
                                                                <option value="punk_rock" > Punk Rock</option>
                                                                <option value="rnb" > R'n'B</option>
                                                                <option value="rap" > Rap</option>
                                                                <option value="reggae" > Reggae</option>
                                                                <option value="rock" > Rock</option>
                                                                <option value="salsa" > Salsa</option>
                                                                <option value="slam" > Slam</option>
                                                                <option value="soul" > Soul</option>
                                                                <option value="tango" > Tango</option>
                                                                <option value="techno" > Techno</option>
                                                                <option value="trance" > Trance</option>
                                                </select><br />
                                 <textarea name="description" id="description" /></textarea><label for="description" > Breve description de la chanson (facultatif) : </label>
                 <input type="submit" name = "form1" value="Envoyer le fichier">
 </form>

<?php //affichage des résultats
if (!empty($resultat))
         {
                 echo '<p>';
                         foreach ($resultat as $num)
                                 {
                                         foreach ($num as $value)
                                         echo htmlspecialchars($value).'<br />';
                                 }
                 echo '</p>';
         }
                 
// affichage des erreurs du formulaire
if(count($_SESSION['erreur_form']) > 0)
         {
                  echo '<p>';
                 
                  foreach ($_SESSION['erreur_form'] as $value)
                          {
                                  echo htmlspecialchars($value).'<br />';
                          }
                                         
                  echo '</p>';
                 
                 unset($_SESSION['erreur_form']);
         }
?>
Pour personnaliser le renvoi des messages c'est indiqué dans le mode d'emploi de la classe.

Le plus rapide est de modifier le tableau interne "private $tab_mes" de la classe d'upload. Je te cite un extrait du mode d'emploi :

...le deuxième élément (index 1) du tableau "private $tab_mes", contenant le libellé : "téléchargé dans le dossier", est indispensable pour avoir un renseignement complet sur le résultat du téléchargement en cas de succès, à savoir : nom du fichier original + éventuellement nouveau nom en cas de renommage + éventuellement nouvelles dimensions de l'image en cas de redimensionnement + dossier de destination. Ces informations détaillées sont utiles pour un téléchargement de fichiers dans un espace administrateur. Cependant pour permettre un renseignement plus sommaire destiné aux visiteurs vous pouvez remplacer ce deuxième élément du tableau ("téléchargé dans le dossier") par une chaine vide ( '' ) auquel cas c'est le dernier élément du tableau "téléchargement OK" qui sera renvoyé à la place des informations détaillées.

Une autre possibilité est de faire un tableau de message personnalisé et de le passer en cinquième paramètre dans l'initialisation de la classe.

Eléphant du PHP | 188 Messages

07 oct. 2011, 20:22

ça fonctionne ! Ah je pensais que je n'arriverais jamais au bout de cet upload !

Merci AB et Moogli, sans vous j'aurais pu dire adieu a mon site ! Merci :D

ViPHP
AB
ViPHP | 5818 Messages

07 oct. 2011, 21:06

Ouf ! :wink:

Maintenant te reste plus qu'à comprendre le code (je parle pas de celui de la classe d'upload).

Au cas où tu rajouterais du code, faits attention à bien garder cette structure de code si tu veux que la classe d'upload puisse gérer un maximum d'erreurs. Pour mémoire, l'explication du pourquoi de cette façon de faire est indiquée quelques messages plus haut :
cette construction sert à éviter de mettre l'initialisation de la classe de téléchargement à l'intérieur de la condition (if (isset($_POS['form1'])) {//initialisation de la classe... }) car la classe ne pourrait pas envoyer de message d'erreur en cas du dépassement du post_max_size puisque dans ce cas aucun post ne serait renvoyé et donc la classe ne serait pas instanciée. Ou alors il faudrait gérer le dépassement du post_max_size avec un supplément de code.
Modifié en dernier par AB le 07 oct. 2011, 21:51, modifié 1 fois.

Eléphant du PHP | 188 Messages

07 oct. 2011, 21:35

Je vais lire attentivement le mode d'emploi de la classe et je ferais gaffe ^^
Et oui je comprends a peu près le code, mais je vais continuer a bosser dessus pour le maitriser ^^
Merci :D

Eléphant du PHP | 188 Messages

13 déc. 2011, 23:27

Désolé de déttéré un sujet qui date et qui fache, mais j'ai voulu modifier le script d'upload, pour remplacer les "-" et " " par des "_" avant l'upload et l'enregistrement BDD, hors ça ne change rien. J'ai rajouté :
preg_replace('-','_',$titre);
preg_replace(' ','_',$titre);
dans le premier "if (isset($_POST['form1']))" lors du traitement de mon titre.

Merci et désolé pour le troll :?

ViPHP
ViPHP | 2287 Messages

13 déc. 2011, 23:31

Désolé de déttéré un sujet qui date et qui fache, mais j'ai voulu modifier le script d'upload, pour remplacer les "-" et " " par des "_" avant l'upload et l'enregistrement BDD, hors ça ne change rien. J'ai rajouté :
preg_replace('-','_',$titre);
preg_replace(' ','_',$titre);
Essaye str_replace plutôt que preg_replace.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

14 déc. 2011, 02:09

Désolé de déttéré un sujet qui date et qui fache, mais j'ai voulu modifier le script d'upload, pour remplacer les "-" et " " par des "_" avant l'upload et l'enregistrement BDD, hors ça ne change rien. J'ai rajouté :
preg_replace('-','_',$titre);
preg_replace(' ','_',$titre);
Essaye str_replace plutôt que preg_replace.
preg_replace ou str_replace il faut réaffecter la modif dans $titre.

Correction:
$titre= preg_replace('#\-|\s#','_',$titre);  # remplacement par REGEXP 
Ou bien:
$titre= str_replace('-', '_', str_replace(' ', '_', $titre);  # remplacement en cascade
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
AB
ViPHP | 5818 Messages

14 déc. 2011, 04:01

Oui sinon si tu veux modifier directement le code de la classe, la fonction de la classe se nomme "Nettoie_nom_fichier" et dans cette fonction c'est à la ligne
$nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
que tu peux intervenir.

Eléphant du PHP | 188 Messages

17 déc. 2011, 12:45

Merci, la solution d'AB fonctionne :D