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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 sept. 2011, 16:28

j'ajouterais simplement que le message est assez claire
Insert value list does not match column list: 1136 Column count doesn't match value count at row 1 in C:\wamp\www\Code\pages\test.php on line 53
il y a moins de valeurs (7) que de champs indiquer dans la requete (8)

INSERT INTO chansons(titre, artiste, id_artiste, date_envoi, vues, note, description, adresse_chanson) <= 8 champ
VALUES(".$connexion->quote($fichier).", 1
".$connexion->quote($artiste).",2
".$connexion->quote($id_artiste,PDO::PARAM_INT).", 3
NOW(), 4
0, 5
0, 6
".$connexion->quote($adresse_chanson).")"; 7

rajoute la partie manquante et ça ira mieux ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 188 Messages

15 sept. 2011, 20:43

Merci Moogli je n'avais pas vu que ma table dans PhpMyAdmin n'était pas complète --' maitenant c'est bon, j'ai écrit cette requette prép :
$titre = 'title';
		 $artiste = 'chanteur';
		 $id_artiste = 111;
		 $vues = 0;
		 $note = 0;
		 $description = 'petite description';
		 $adresse_chanson = 'musiques/title';
		 $style = 'rock';
         $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)
			{
                 /* erreur insertion */
                 echo 'Une erreur est survenue !';
                 echo 'Erreur : '.$e->getMessage().'<br />';
                 echo 'N° : '.$e->getCode();
                 die();
			}
Avec des variables bidons, je l'ai mise dans une page a part et elle fonctionne parfaitement !

Alors je l'ai readapaté pour la mettre dans la page d'upload, ce qui donne (la requette) :
if(isset($fichier))
            {
                   // là on est certain que le code entre ces accolades ne s'exécutera que si un fichier à été téléchargé
                                 
                   // suite du code récupération des autres variables et enregistrement en bdd
                     
                  // Récupération de tes autres valeurs
                 //on regarde si la description est remplie
         if ((isset($_POST['description'])) AND (!empty($_POST['description'])))
                         {
                         $description = $_POST['description'];
                         }
         else
                         {
                         $description = '';
                         }
         if ((isset($_POST['style'])) AND (!empty($_POST['style'])))
                         {
                         $style = $_POST['style'];
                         }
         else
                         {
                         $style = '';
                         $_SESSION['info_style'] = 0;
						 echo "Veuillez sélectionner un style musical.";
						 $up->Get_Reload_page();
                         }
                  
                  // 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);
                         $connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
                         /* BDD connectee */
         }
         catch(Exception $e){
                 /* erreur connection */
                 echo 'Une erreur est survenue !';
                 echo 'Erreur : '.$e->getMessage().'<br />';
                 echo 'N° : '.$e->getCode();
                 die();
         }
         //   /fin de la connexion BDD par PDO-->
         //exemple de requête avec mysql (protéger les valerurs par mysql_real_escape_string) ou utiliser PDO --> j'utilise PDO::quote
          $artiste = $_SESSION['pseudo'];
          $id_artiste = $_SESSION['id'];
          $adresse_chanson = $dossier.'/'.$fichier;
         $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)
			{
                 /* erreur insertion */
                 echo 'Une erreur est survenue !';
                 echo 'Erreur : '.$e->getMessage().'<br />';
                 echo 'N° : '.$e->getCode();
                 die();
			}
		   $up->Get_Reload_page();
            }
Et là toujours aucun message d'erreur, un upload réussi mais rien dans la table ...

Merci :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 sept. 2011, 22:25

que retourne $insert->execute() ?

c'est quoi ton formulaire maintenant ?

quel est ton niveau de rapport d'erreur ?

Perso j'ai testé avec ton ancien formulaire mais il manque beaucoup de chose dedans, je ne peux aller plus loin.

en dehors de ça tous va jusqu'a l'insertion !

met en commentaire le rechargement de la page histoire d'éviter les problèmes.


@+
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

15 sept. 2011, 22:33

Je vois pas de variable $titre définie dans ton dernier code.

Par ailleurs la dernière ligne "$up->Get_Reload_page();", fait comme son nom le suggère, un rechargement de la page, c'est donc normal que tu ne vois pas les erreurs. Il faut commenter cette ligne pour la désactiver - mettre "//" devant cette ligne - pendant la phase de développement, et enlever les "//" pour réactiver cette ligne quand tout est ok pour un fonctionnement normal.

EDIT En gros, mêmes remarques que moogli :)

Eléphant du PHP | 188 Messages

15 sept. 2011, 22:43

OH miracle ! en commantant le dernier $up->Get_Reload_page(); tout se met dans la BDD parfaitement !

Bon par contre, si je réactualise la page, l'upload recommence et l'enregistrement BDD aussi, alors que ça c'étais sécurisé avec ce dernier get_reload_page ... mais si je réactive cette ligne pas d'enregistrement BDD ...

Ah oui justement j'étais entrain de le chercher sur $titre et pu moyen de le retrouver où est ce que je le peut le récupérer ?

Bon et sinon je ne sais pas si ça a encore de l'importance vu que le problème vient (je pense) de ce dernier get_reload_page,

var_dump(insert->execute()); renvoie "bollean true"

Je n'ai aucun message d'erreur de php,

et mon formulaire final est :
<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="style"> Style musical de la chanson : </label>
                 <select name="style" id="style" >
                                 <option value="blues" > Blues </option>
                                 <option value="chanson_francaise" > Chanson Fran&ccedil;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>

A dernière question, AB dans ta classe, les messages de résultat de l'upload contienne des accents, et donc a l'affichage j'ai de joli carré, alors jai modifier dans ta classe les messages en mettant des &eacute; par ex pour les é mais maintenant il m'affiche le &eacute; ... qu'est ce que tu me conseille ?

Merci ! :D

ViPHP
AB
ViPHP | 5818 Messages

15 sept. 2011, 22:57

OH miracle ! en commantant le dernier $up->Get_Reload_page(); tout se met dans la BDD parfaitement !

Bon par contre, si je réactualise la page, l'upload recommence et l'enregistrement BDD aussi, alors que ça c'étais sécurisé avec ce dernier get_reload_page ... mais si je réactive cette ligne pas d'enregistrement BDD ...

Ah oui justement j'étais entrain de le chercher sur $titre et pu moyen de le retrouver où est ce que je le peut le récupérer ?

Bon et sinon je ne sais pas si ça a encore de l'importance vu que le problème vient (je pense) de ce dernier get_reload_page,
ça m'étonnerai fort puisque ce code ($up->Get_Reload_page()) est situé après l'enregistrement en bdd !!! Es-ce que tu vérifies bien le résultat dans phpmyadmin ?

Pour les accents, remets les caractères normaux dans la classe (je t'avais dit qu'on avait pas à intervenir dans le code :) et travailles en utf-8 en mettant simplement
header('Content-type: text/html; charset=UTF-8');
en première de ton code php.

ViPHP
AB
ViPHP | 5818 Messages

15 sept. 2011, 23:03

Autre chose, je vois pas d 'input "titre" dans ton formulaire. Comment vas-tu récupérer le titre alors ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 sept. 2011, 00:02

Notice: Undefined variable: titre in H:\web\docRoot\test\arthur77.php on line 115
Notice: Undefined variable: vues in H:\web\docRoot\test\arthur77.php on line 118
Notice: Undefined variable: note in H:\web\docRoot\test\arthur77.php on line 119
dans l'execute, ces variables n'existe pas !

je vois pas comment tu peux insérer quelque chose avec ce code, a moins qu'il manque quelque chose dans ce que j'ai récupéré ici !

C'est toujours le même problème il faut que tu reprenne ton code calmement en te demandant ce que tu veux et ce qui te manque.

Si tu n'a pas de message d'erreur c'est qu'il y a un problème, qu'elle est le niveau d'erreur que tu utilise (j'ai l'impression que je gatouille ?)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 188 Messages

16 sept. 2011, 22:34

ça m'étonnerai fort puisque ce code ($up->Get_Reload_page()) est situé après l'enregistrement en bdd !!! Es-ce que tu vérifies bien le résultat dans phpmyadmin ?
C'est ce qui m'avais étonné aussi, et pourtant quand il est commenté la BDD se rempli correctement ...
Oui oui je vérifie mon phpmyadmin après chaque tentative d'upload/enregistrement BDD, et donc comme je dit avec cette ligne : BDD vide; sans cette ligne : ça se remplit ...

Pour les accents, remets les caractères normaux dans la classe (je t'avais dit qu'on avait pas à intervenir dans le code :) et travailles en utf-8 en mettant simplement
header('Content-type: text/html; charset=UTF-8');
en première de ton code php.
Désolé mon esprit de curiosité ma quand même poussé à modifier :oops: ... je vais faire ça :)
Autre chose, je vois pas d 'input "titre" dans ton formulaire. Comment vas-tu récupérer le titre alors ?
Oui je n'y avais pas pensé à ce titre mais c'est une bonne idée, j'ai modifié le formulaire et la requette et le traitement des données POST.
Notice: Undefined variable: titre in H:\web\docRoot\test\arthur77.php on line 115
Notice: Undefined variable: vues in H:\web\docRoot\test\arthur77.php on line 118
Notice: Undefined variable: note in H:\web\docRoot\test\arthur77.php on line 119

dans l'execute, ces variables n'existe pas !

je vois pas comment tu peux insérer quelque chose avec ce code, a moins qu'il manque quelque chose dans ce que j'ai récupéré ici !
Erreur entre requette de test/requette après upload, mais je croyais avoir mit la dernière version dans ma dernière réponse #-o bref en tout cas ce problème était réglé avant mes derniers tests.
qu'elle est le niveau d'erreur que tu utilise ?
Ou est-ce que je peux trouver ça ?


EDIT : AB, j'ai remit ta classe comme neuve, et j'ai donc comme 4 premières lignes de ma page upload (avant mon DOCTYPE) :
<?php
	session_start();
	header('Content-type: text/html; charset=UTF-8');
?>
puis j'ai essayé :
<?php
	header('Content-type: text/html; charset=UTF-8');
	session_start();
?>
Et pourtant de joli carrés blancs ...

Merci ! :)

ViPHP
AB
ViPHP | 5818 Messages

18 sept. 2011, 16:19

Il faut en plus que ta page soit enregistrée au format utf-8. Voir ce tuto (cela dit cela n'a rien à voir avec l'utilisation de la classe elle-même)

Eléphant du PHP | 188 Messages

18 sept. 2011, 23:00

J'ai fait ce qui est noté dans le tuto j'ai bien choisi l'encodage UTF-8 et pourtant toujours des carrés blancs ...

Au passage, l'upload et les enregistrements BDD (j'ai amélioré avec des enregistrements playlist) tout fonctionne très bien, reste plus que ces accents !

Merci :D

ViPHP
AB
ViPHP | 5818 Messages

19 sept. 2011, 02:39

J'ai fait ce qui est noté dans le tuto j'ai bien choisi l'encodage UTF-8 et pourtant toujours des carrés blancs ...

Au passage, l'upload et les enregistrements BDD (j'ai amélioré avec des enregistrements playlist) tout fonctionne très bien, reste plus que ces accents !

Merci :D
La classe aussi doit être dans un fichier enregistré au format utf-8 (en fait tous les fichiers que tu inclus dans ta page utf-8).

Si cela ne fonctionne toujours pas, crée des pages vierges enregistrées au format utf-8 puis copie le code de tes anciennes pages dans ces nouvelles pages et essaies de nouveau. Prends soin de sauvegarder préalablement tes anciennes pages en lieu sûr.

Eléphant du PHP | 188 Messages

19 sept. 2011, 17:14

J'ai copié le contenu de upload.php et de Classe_upload.php dans deux nouveaux fichiers, qui ont prit leur place, qui eux sont encodé UTF-8 dés le départ, et maintenant j'ai des caractères chinois ...

Merci :)

ViPHP
AB
ViPHP | 5818 Messages

19 sept. 2011, 19:59

Quel logiciel utilises-tu pour faire ton code ?

Par ailleurs même chose que pour la requête... pour résoudre un problème il faut l'isoler et le traiter séparément. Donc inutile de tester tout l'ensemble de ton code à chaque fois.
Ton problème se résume à ne pas pouvoir faire afficher des caractères accentués écris en dur dans une page php. Donc dans une page séparée tu écris des caractères accentués (et spéciaux) et tu teste les méthodes pour pouvoir les faire afficher correctement.

Eléphant du PHP | 188 Messages

20 sept. 2011, 20:25

Quel logiciel utilises-tu pour faire ton code ?
J'utilise NotePad ++
Donc dans une page séparée tu écris des caractères accentués (et spéciaux) et tu teste les méthodes pour pouvoir les faire afficher correctement.
J'ai créer une nouvel page de test, je l'ai encodé à la création en UTF-8 et j'y ai mit ce code :

<!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" >
   <head>
       <title>Player</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   </head>
   <body>
	<?php
	echo "test"; echo "<br />";
	echo "cette page est encodée <strong>à la création</strong> en UTF-8"; echo "<br />";
	echo "test de caractères spéciaux :"; echo "<br /><br />";
	echo "é  à  è  ù  î  ô  û  ö  ï  ü  ê  ë  ä  â  ÿ  ñ";
	?>
	</body>
</html>
et la page s'affiche correctement avec les bons caractères.

alors j'ai créer deux nouvelles pages, upload.php et Classe_upload.php de la meme manière, en encodant en UTF-8 à la création, j'y ai collé le contenu de mes anciennes pages upload et classe_upload, et lors de la copie tous les accents et autres caractères spéciaux se sont transformés en caractères chinois (dans le logiciel notepad) et certaines quote ' supprimées, rendant donc la syntaxe erronée, et quand je charge la page il m'indique bien une ERROR SYNTAX au niveau des quote, mais il y a au moins une cinquantaine de quote à remettre donc avant de le faire je voulais savoir ce que tu en penses ...

Merci :D