form complet avec multi-upload: tout est enregistré sauf les photos??

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : form complet avec multi-upload: tout est enregistré sauf les photos??

par Boro64 » 16 oct. 2008, 23:08

Bonsoir AB (et les autres!)
C'est exactement ce que je suis en train de faire, j'avais suivi tes (bons) conseils, et....L'upload (quelques soit le nombre de fichier) se passe très très bien !
Bon, sauf que maintenant, à force de tout reprendre...ben c'est le reste du form qui n'est plus enregistré! :lol:
Bon, je vais bien finir par y arriver..mais parfois le tricot n'est pas loin, je l'avoue! :wink:
Allez, une pose café/cigarette, et j'y retourne!
Merci vraiment pour tes conseils!
EDIT du 23/10, 11h20... :lol:
Merci à toutes et ceux qui m'ont conseillés et guidés, et pour cette fois en particulier à AB :agenouille: dont le conseil:
Encore une fois essaye de séparer les pb. Testes des bouts de codes séparément. A ta place j'essaierai de faire fonctionner le tuto et ensuite de faire ce que tu souhaites à partir du code fonctionnel.
J'avais une erreur ici:

Code : Tout sélectionner

else { if (empty($_POST['description']) || ($_POST['titre']) || ($_POST['prix'])) { echo ("Le champs description, titre ou prix est vide."); }
...et donc le message d'erreur s'affichait systématiquement alors que tous les champs étaient renseignés... :twisted:
Cette ligne devient donc:
    else {
          if (empty($_POST['description']) || empty($_POST['titre']) || empty($_POST['prix'])) 
          {
            echo ("Le champs description, titre ou prix est vide.");
          }
Voili, voilou, voilà...c'est (très) certainement améliorable, mais ça fonctionne très bien.!
Merci encore!

par AB » 16 oct. 2008, 22:46

Encore une fois essaye de séparer les pb. Testes des bouts de codes séparément. A ta place j'essaierai de faire fonctionner le tuto et ensuite de faire ce que tu souhaites à partir du code fonctionnel.

par Boro64 » 16 oct. 2008, 14:13

Bonjour
Bon c'est bon signe si tu arrives à en uploader une...
Hé bien c'était vrai (1 seule fois en fait....) et depuis plus rien, ou presque, ne va...
Mais je pense avoir trouvé la source de l'absence d'upload..
J'explique:
Puisque le nom de la photo "nouvelle mouture" est bien enregistré dans la bdd, j'ai d'abord pensé à un probléme "physique"; j'ai donc incorporé ceci pour essayer de "voir" le problème (merci à Flood et son tuto !):
                 switch ($_FILES['fichier']['error']){
           case UPLOAD_ERR_INI_SIZE:
              echo 'Le fichier uploadé dépasse la valeur spécifiée 
                       pour upload_max_filesize dans php.ini.';
              break;
           case UPLOAD_ERR_FORM_SIZE:
              echo 'Le fichier uploadé dépasse la valeur spécifiée
                       pour MAX_FILE_SIZE dans le formulaire d\'upload.';
              break;
           case UPLOAD_ERR_PARTIAL:
              echo 'Le fichier n\'a été que partiellement uploadé.';
              break;                            
           default:
              echo 'Aucun fichier n\'a été uploadé.';
         } // switch 
Résultat: Aucune erreur! ...bon on avance! :P
Puis, j'ai fait divers echo, pour finalement tester:
                    $nom_final=time()."_".preg_replace("#([^a-zA-Z0-9]+)#", "", $fichier).".".substr($fichier, -3);
                    //on déplace l'image dans le répertoire final
                echo $nom_final;
et là....SURPRISE! :twisted:
J'affiche un nom de photo différent de celui enregistré dans la base......... :shock:
Exemple: Nom de la photo dans la base ($nom_final) = 1224157085_IMG1668jpg.jpg
Nom affiché avec le echo $nom_final dans le script: 1224157857_IMG1668jpg.jpg
.....??????......
J'ai aussi supprimé la redirection de fin de traitement; il y a une
session_start();
au début de ma page qui, apparemment, générait un conflit avec ma re-direction sur la même page...
Voilà; toujours pas d'upload donc, encore une fois...
Une fois de plus, si vous avez une idée, une piste....bhé, encore merci!
P.S: petite précision, mes test d'upload sont réalisés avec des fichiers .jpg de 45Ko à 1,8Mo...

par AB » 15 oct. 2008, 04:15

Bon c'est bon signe si tu arrives à en uploader une...

Quand tu fais des essais prends des images légères, tout au moins qui ne dépassent pas 2mo par fichier et 8mo pour l'ensemble des fichiers (réglages par défaut de la plupart des serveurs).

Ensuite pour être complet, si tu as encore du temps et du courage il te restera la gestion des erreurs d'upload... c'est facultatif car ça fait encore pas mal de boulot si tu ne connais pas (et ce n'est pas parfait puisque ça ne retourne les erreurs qu'une fois les fichiers uploadés, ce qui fait que le visiteur peut attendre un moment avant de voir s'afficher le message d'erreur... m'enfin il est averti au final du type d'erreur rencontré).

PS Sépare tes modules pour faire des tests. Par exemple commences par tester ton multi upload isolément sans l'enregistrement des noms en bdd.

par Boro64 » 15 oct. 2008, 01:14

Bonsoir
merci à vous, mais rien n'y fait....ou presque; j'explique:
Plus de message d'erreur (merci AB !)...mais plus d'enregistrement du nom...et toujours pas de photo enregistrée dans le fichier-cible.... je ne sais même plus ce que je dois faire: :cry: ou :lol:
Ah si tout de même:
Warning: Cannot modify header information - headers already sent by (output started at
...............
Je crois que je vais faire plus simple...passer au tricot! :langue:

Edit: le même 15mn après..
Scrogneugneu...j'ai modifié/simplifié le code (merci beaucoup AB), et...la photo est bien enregistrée dans le fichier-cible et son nom_final dans la bdd ....mais (ah bin oui tout de même! :lol: ) j'ai 6 messages d'erreur: le 1er(uploadé une seule photo) pour me dire que l'image n'a pu être déplacée :shock: alors qu'elle l'a bien été...et les 5 autres (pas d'upload...) pour me dire que le fichier n'est pas conforme... :?
Mais je suis sur la bonne voie...merci encore
Note aux modos: je mettrai [Résolu] avec le bon code, ok?

par sadeq » 13 oct. 2008, 22:35

Heu, désolé je n'ai pas bien vu [$key]

oubliez mon post. :oops:

par AB » 13 oct. 2008, 20:57

Bon, c'est la partie essentielle de ton script qui est fausse et qui est la boucle foreach qui parcourt la liste des objets $_FILES unploadés.

Voici la correction:
foreach ($_FILES['fichier'] as $fichier) { // $_FILES['fichier'] est un tableau d'input de type file
      // Traiter chaque occurence $fichier trouvée dans le tableau $_FILES['fichier']
     $size  = $fichier['size'];            // poids de l'image en octets  
     $tmp  = $fichier['tmp_name'];  // nom temporaire de l'upload
     $type = $fichier['type'];           // type de l'image

... la suite ...
En effet, $_FILES['fichier'] est le nom du tableau récupéré après le postage des champs de type file décrits dans ton HTML:
<label for="photo">Photo 1:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_2">Photo 2:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_3">Photo 3:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_4">Photo 4:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_5">Photo 5:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_6">Photo 6:</label><input type="file" name="fichier[]" />
Euh, tu es certain que c'est une correction ? :lol:

Moi je vois plutôt un problème dans cette correction (bug du genre Undefined index) alors que son code initial renvoyait les bonnes valeurs :
foreach ($_FILES['fichier']['name'] as $key => $value) {
$fichier=$value;//nom reel de l'image
$size=$_FILES['fichier']['size'][$key]; //poids de l'image en octets  
$tmp=$_FILES['fichier']['tmp_name'][$key];//nom temporaire de l'image (sur le serveur)  
$type=$_FILES['fichier']['type'][$key];//type de l'image



J'ai pas regardé tout le code en détail, mais il y a au moins une faute dans l'utilisation de la fonction move_uploaded_file() - il faut mettre le fichier temporaire comme paramètre (cf le tuto)

par sadeq » 13 oct. 2008, 18:23

Bon, c'est la partie essentielle de ton script qui est fausse et qui est la boucle foreach qui parcourt la liste des objets $_FILES unploadés.

Voici la correction:
foreach ($_FILES['fichier'] as $fichier) { // $_FILES['fichier'] est un tableau d'input de type file
      // Traiter chaque occurence $fichier trouvée dans le tableau $_FILES['fichier']
     $size  = $fichier['size'];            // poids de l'image en octets  
     $tmp  = $fichier['tmp_name'];  // nom temporaire de l'upload
     $type = $fichier['type'];           // type de l'image

... la suite ...
En effet, $_FILES['fichier'] est le nom du tableau récupéré après le postage des champs de type file décrits dans ton HTML:
<label for="photo">Photo 1:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_2">Photo 2:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_3">Photo 3:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_4">Photo 4:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_5">Photo 5:</label><input type="file" name="fichier[]" />
<br />
<label for="photo_6">Photo 6:</label><input type="file" name="fichier[]" />

par Boro64 » 13 oct. 2008, 18:01

Bonsoir AB
et merci...je connaissais le tuto de Damien (que je remercie au passage ainsi que tous pour vos aides); j'ai souhaité l'adapter pour plusieurs champs "file", et c'est là je crois que je me suis emmêlé le clavier :oops:
Quant aux paramètres acceptés par move_upload_file, j'avais cru comprendre qu'il n'était que 2:

Liste de paramètres

filename

Le nom du fichier téléchargé.
destination

La destination du fichier déplacé.
Bon, je suis donc passé à côté... :mrgreen:
Me reste plus qu'à tout reprendre depuis le début, quoi..... :cry:

Merci tout de même

par AB » 13 oct. 2008, 17:11

Cela ne risque pas de fonctionner, t'as un souçi avec move_uploaded_file()

Regarde ce tuto pour mieux comprendre sont utilisation
http://www.phpfrance.com/tutoriaux/inde ... e-fichiers

EDIT et puis si tu utilises if(move_uploaded_file()) tu n'as pas besoin d'utiliser au préalable if(is_uploaded_file())

par Boro64 » 13 oct. 2008, 15:00

Salut
Alors:
Testé avec upload de 2 photos = aucune photos uploader dans le dossier-cible, aucun nom de photo enregistré...mais aucun message d'erreur! :shock:
Testé avec upload d'une photo = photo non uploader dans le dossier cible, le nom enregistré dans la bdd sous le nom suivant: 1223902355_IMG1693jpg.jpg, ET le message d'erreur:
L'image n'a pu être déplacée !

Warning: Cannot modify header information - headers already sent by (output started at /homez.9/lesite/www/boutik/gestion_boutik/insert_article.php:47) in /homez.9/lesite/www/boutik/gestion_boutik/insert_article.php on line 96
|*()
....comprends plus rien moi....
Merci pour ton aide...

par katagoto » 13 oct. 2008, 14:36

Pas le temps de parler :
<?php 
$extension = array('jpg', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées
$dos_destinataire = '../photos/';//définition de l'adresse du dossier destinataire
// on teste si le formulaire permettant d'uploader un fichier a été soumis
if (isset($_POST['enregistrer'])) {
	// on se connecte  notre base
	include ('../code_boutik/connect.inc.php');
	//déclaration chargement photo
	if(isset($_FILES['fichier']))
	{
		//$_FILES existe

		$compteur=0;

		foreach ($_FILES['fichier']['name'] as $key => $value) {
			$fichier=$value;//nom reel de l'image
			$size=$_FILES['fichier']['size'][$key]; //poids de l'image en octets
			$tmp=$_FILES['fichier']['tmp_name'][$key];//nom temporaire de l'image (sur le serveur)
			$type=$_FILES['fichier']['type'][$key];//type de l'image

			if (is_uploaded_file($tmp)) //permet de vérifier si le fichier a été uplodé via http
			{

				//vérification du type de l'image et son poids
				if ( in_array(substr($fichier, -3), $extension) && $size<=2097152  )
				{
					// type mime jpeg, jpg, gif ou png poids < à 2097152 octets soit 2Mo
					//Pour supprimer les espaces dans les noms de fichiers
					$nom_final=time()."_".preg_replace("#([^a-zA-Z0-9]+)#", "", $fichier).".".substr($fichier, -3);
					//on déplace l'image dans le répertoire final

					if (move_uploaded_file($nom_final, $dos_destinataire)) {
						//Message indiquant que tout s'est bien passé
						//Pour le test on affiche l'image
						echo 'Votre référence a bien été prise en compte<br /><br /><br />';
					}
					else {
						//l'image ne peut être déplacée, on supprime le fichier temporaire
						@ unlink ($tmp);
						echo 'L\'image n\'a pu être déplacée !<br /><br /><br />';
					}

				}
				else {
					//Le type mime, ou la taille ou le poids est incorrect
					echo 'Votre image a été rejetée (poids, taille ou type incorrect)<br /><br /><br />';
				}
			}

			$tab_final[$compteur] = $nom_final;
			$compteur++;
		}
	}
	// on teste la déclaration de nos variables
	if (!isset($_POST['description']) && ($_POST['titre']) && ($_POST['prix'])) {
		$erreur = 'Les variables nécessaires au script ne sont pas définies.';
	}
	else {
		if (empty($_POST['description'])&& ($_POST['titre']) && ($_POST['prix'])) {
			$erreur = 'Le champs description, titre ou prix est vide.';
		}

		// si tout est bon, on peut commencer l'insertion dans la base
		else {
			// lancement de la requête d'insertion
			//définition de quelques variables


			$sql = "INSERT INTO stock (id_article, date, marque, modele, type, annee, cc, titre, descrip, prix, famille, ss_famille, nam_photo) VALUES('', NOW(), '".$marque."', '".$modele."', '".$type."', '".$annee."', '".$cc."', '".$titre."', '".$descrip."', '".$prix."', '".$famille."', '".$ssfamille."', '".$nam_photo."')";
			// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
			mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

			// on ferme la connexion à la base de données
			mysql_close();

			// on redirige vers la page d'accueil de l'admin
			header('Location: insert_article.php');
		}
	}
}

?> 
teste ça :lol:

par Boro64 » 13 oct. 2008, 13:10

Bonjour
Et pardon pour le retard de ma réponse, ma fille et le week end sont passés par là... :lol:
Voici donc le code demandé par Katagoto:
<?php
$extension = array('jpg', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées
$dos_destinataire = '../photos/';//définition de l'adresse du dossier destinataire
 // on teste si le formulaire permettant d'uploader un fichier a été soumis  
 if (isset($_POST['enregistrer'])) { 
     // on se connecte  notre base 
   include ('../code_boutik/connect.inc.php'); 
  //déclaration chargement photo
  if(isset($_FILES['fichier']))
  {
//$_FILES existe  

$compteur=0;

    foreach ($_FILES['fichier']['name'] as $key => $value) {
$fichier=$value;//nom reel de l'image
$size=$_FILES['fichier']['size'][$key]; //poids de l'image en octets  
$tmp=$_FILES['fichier']['tmp_name'][$key];//nom temporaire de l'image (sur le serveur)  
$type=$_FILES['fichier']['type'][$key];//type de l'image  
//On récupère la taille de l'image  
list($width,$height)=getimagesize($tmp);  
if (is_uploaded_file($tmp)) //permet de vérifier si le fichier a été uplodé via http  
{  
  
//vérification du type de l'image et son poids 
if ( in_array(substr($fichier, -3), $extension) && $size<=2097152  )  
{  
// type mime jpeg, jpg, gif ou png poids < à 2097152 octets soit 2Mo
//Pour supprimer les espaces dans les noms de fichiers 
$fichier = preg_replace ("` `i","",$fichier);//ligne facultative :)  
//On vérifie s'il existe une image qui a le même nom dans le répertoire  
if (file_exists('../photos/'.$fichier))  
{  
/*Le fichier existe on rajoute dans son nom le timestamp du moment pour le 
différencier de la première 
*/ 
$nom_final= preg_replace("`.`is",date("U").".",$fichier);  
}  
else {  
$nom_final=$fichier; //l'image n'existe pas on garde le même nom  
}  
//on déplace l'image dans le répertoire final 
 
if (move_uploaded_file($nom_final, $dos_destinataire)) {  
//Message indiquant que tout s'est bien passé  
//Pour le test on affiche l'image 
echo 'Votre référence a bien été prise en compte<br /><br /><br />';  
} 
else { 
//l'image ne peut être déplacée, on supprime le fichier temporaire 
@ unlink ($tmp); 
echo 'L\'image n\'a pu être déplacée !<br /><br /><br />';  
} 
  
}  
              else {  
//Le type mime, ou la taille ou le poids est incorrect  
              echo 'Votre image a été rejetée (poids, taille ou type incorrect)<br /><br /><br />';  
                    }  
}  

$tab_final[$compteur] = $nom_final;
$compteur++;
                          }
  } 
    // on teste la déclaration de nos variables 
    if (!isset($_POST['description']) && ($_POST['titre']) && ($_POST['prix'])) { 
       $erreur = 'Les variables nécessaires au script ne sont pas définies.'; 
    } 
    else { 
       if (empty($_POST['description'])&& ($_POST['titre']) && ($_POST['prix'])) { 
          $erreur = 'Le champs description, titre ou prix est vide.'; 
       } 
  
          // si tout est bon, on peut commencer l'insertion dans la base 
       else { 
          // lancement de la requête d'insertion 
		  //définition de quelques variables


$sql = "INSERT INTO stock (id_article, date, marque, modele, type, annee, cc, titre, descrip, prix, famille, ss_famille, nam_photo) VALUES('', NOW(), '".$marque."', '".$modele."', '".$type."', '".$annee."', '".$cc."', '".$titre."', '".$descrip."', '".$prix."', '".$famille."', '".$ssfamille."', '".$nam_photo."')";  
     // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die) 
          mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); 
  
          // on ferme la connexion à la base de données 
          mysql_close(); 
  
          // on redirige vers la page d'accueil de l'admin 
          header('Location: insert_article.php'); 
          // on termine le script courant 
          exit(); 
       } 
    }  
  }
   
?>
Pour le(s) message(s) d'erreur(s), c'est un peu...aléatoire; parfois aucun message mais aucune image enregistrée dans le dossier cible et aucun nom d'image récupéré dans la bdd, parfois (je viens d'en faire le test) le nom est récupéré dans la bdd mais l'image n'est pas récupérée dans le dossier cible; le test que je viens de faire comportait l'upload de 2 images; je récupère le nom d'une image, aucune image dans le dossier-cible et le message d'erreur suivant:
L'image n'a pu être déplacée !

Warning: Cannot modify header information - headers already sent by (output started at /homez.9/lesite/www/boutik/gestion_boutik/insert_article.php:59) in /homez.9/lesite/www/boutik/gestion_boutik/insert_article.php on line 119
Merci de toute aide, avis, conseil, etc. qui me permette de sortir de là... :?

par katagoto » 11 oct. 2008, 19:11

bah, je pense que $nom_photo y est pour quelque chose...
MySQL ne stock pas les tableaux comme ça...
de plus, pourrait-tu nous re-transmettre ton code actuel, indenté et privé des $x = $_POST["x"]
On y verra plus claire, y a t'il un message d'erreur sur ta page quand l'injection à foiré ?

par Boro64 » 11 oct. 2008, 16:42

Oui Katagoto
chmod = 744
Une fois l'enregistrement de l'article se fait bien une fois non, mais toujours JAMAIS les phots...je n vois plus...
Heuuu, franchement je laisse le c++