8791 sujets

Développement web côté serveur, CMS

Bonsoir,
me revoilà avec un sans doute "bête" problème, mais là, je ne vois plus rien.
Voici un formulaire de création d'article, avec possibilité d'uploader 3 phots. Je crée un dossier pour les accueillir...mais je n'obtiens rien. J'explique:
Je voulais 1 dossier pour contenir les 3 photos...je crée 1 dossier par photo.... Smiley lol ...mais c'est le moins embetant
Le soucis essentiel...c'est que les documents ne suivent pas du tout...que ce soit avec 1, 2 ou 3 photos, aucune n'est chargée dans le dossier, ni nul part...et j'ai le message "problème de chargement photos: erreur système"
Si vous aviez le temps de regarder ça, et de me donner votre avis, une piste, une idée...je suis plus que preneur
set_time_limit(120);//modification de la limitation de temps d'exécution du script en seconde
$nom_dossier= $nouvel_id."-".date('d-m-y')."-".time();
$extension = array('jpg', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées
$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier ");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier


// on teste si le formulaire permettant d'uploader un fichier a été soumis
if (isset($_POST['Enregistrer'])) {
    // on se connecte  notre base
    include ('includes/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


                //vérification du type de l'image et son poids
                if ( in_array(substr($fichier, -3), $extension) && $size<=4194304  )
                {

                    // type mime jpeg, jpg, gif ou png poids < à 4194304 octets soit 4Mo
                    //le nouveau nom de l'image est composé du nouvel id, de -, de la date format unix, d'un point et de l'extension.
                    $nom_final= $nouvel_id."-".date('d-m-y')."-".time().".".substr($fichier, -3);
                    //on déplace l'image dans le répertoire final

                    if (move_uploaded_file($tmp, $dos_destinataire . $nom_final)) 
                    {
                        //Message indiquant que tout s'est bien passé
                        //Pour le test on affiche l'image
                        echo '<p>Votre référence a bien été prise en compte<br /></p>';
                    }
           
              }

            $tab_final[$compteur] = $nom_final;
            $compteur++;
          }
    }//fin de l'instruction if  isset($_FILES['fichier'])
	//vérification des erreurs
	if ($_FILES['fichier']['error'] > 0)
	{
	echo '<p>Problème de chargement photo(s):';
	switch($_FILES['fichier']['error']){
	case 1:
	print 'le fichier excede la definition upload_max_filessize du php ini';
	break;
	case 2:
	print 'le fichier excede la quantité de 4mo définie dans le code';
	break;
	case 3:
	print'le fichier n\'est qu\'en partie chargé';
	break;
	case 4:
	print 'pas de fichier à charger';
	break;
	case 6:
	print 'pas trouvé de dossier temporaire';
	break;
	case 7:
	print'incapable d\'écrire sur le disque';
	break;
	case 8:
	print 'arrêt du chargement par utilisateur';
	break;
	default:
	print 'erreur systeme';
	break;
	}//fin switch
	print '</p>';
      }// fin du if pour erreurs    
    // on teste la déclaration de nos variables
    if (!isset($_POST['descriptif']) && ($_POST['titre']) && ($_POST['prix'])) 
    {
        $erreur = 'Les variables nécessaires au script ne sont pas définies.';
    }
    else {
          if (empty($_POST['descriptif']) || empty($_POST['titre']) || empty($_POST['prix'])) 
          {
            $erreur = '<p>Le champ description, titre ou prix est vide.</p>';
          }
        
        // si tout est bon, on peut commencer l'insertion dans la base

la partie du form concernée, avec l'entête:
<form action="creat-art.php" class="gestart" method="POST" enctype="multipart/form-data" >
<input type="hidden" name="MAX_FILE_SIZE" VALUE="4194304" />
<legend>Upload des photos:</legend><br />
<label for="photo">Photo 1:</label><input type="file" name="fichier[]" /><br />
<label for="photo">Photo 2:</label><input type="file" name="fichier[]" /><br />
<label for="photo">Photo 3:</label><input type="file" name="fichier[]" /><br />

D'avance merci à tou-te-s
Modifié par boro64 (03 Jan 2011 - 14:15)
Bonsoir,
bool mkdir ( string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context ]]] ) : renvoie un bool
or tu fais

$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier ");

puis

move_uploaded_file($tmp, $dos_destinataire . $nom_final);
 

donc là $dos_destinataire vaut true ou false donc tu ne peux l'utiliser pour move_uploaded_file

par contre si tu fais :

$nom_dossier= $nouvel_id."-".date('d-m-y')."-".time(); 
$extension = array('jpg', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées 
$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier ");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier 
$path= "../boutik/imag-art/".$nom_dossier."/";
 

puis

 if (move_uploaded_file($tmp, $path . $nom_final))  
 

ça devrais le faire ...
Modifié par Su4p (30 Dec 2010 - 17:52)
Bonjour
et merci Su4p, c'est mieux mais pas encore ça.
Je m'explique:
Cette fois, les "sous-dossiers" sont bien créés, sauf que: pour 3 images, il y a 2 sous-dossiers... Smiley biggol
2eme point: les images ne sont toujours pas chargées; les sous-dossiers sont désespérément vide... Smiley decu
Je ne sais plus que faire....une idée? Smiley lol

Edit: même en ne chargeant qu'une image...2 sous-dossiers sont créés....
Modifié par boro64 (30 Dec 2010 - 17:03)
Bonjour,
qu'entends tu par "sous-dossier" quand tu fait
 mkdir("../boutik/imag-art/$nom_dossier ");
?
Peut-tu me faire un echo de toutes les variables de move_uploaded_file()

echo "$tmp, $dos_destinataire . $nom_final"

Et même re-poster ton code avec les modifs que je t'avais donné.
Modifié par Su4p (30 Dec 2010 - 17:55)
Bonsoir
Alors:
-1- le résultat de l'echo
/tmp/php5bzOLn
../boutik/imag-art/1-30-12-10-1293728305/ 

Soit: absence du nom final de la photo..... Smiley eek

-2- Ce que j'appelle 'sous-dossier' c'est bien le dossier spécifique à l'envoi, nommé ici $nom_dossier.Il se crée maintenant 2 fois, quel que soit le nombre de photos envoyées....

-3- Re voici le code:
D'abord dans l'en-tête avant quoi que ce soit:

session_start();

if (!isset($_SESSION['nom'])){
	header ('Location:ident.php');
	exit();
	}
include ('includes/connect.inc.php');
$requete_id = mysql_query("SELECT id_article FROM stock ORDER BY id_article DESC LIMIT 1");
while ($row = mysql_fetch_array($requete_id, MYSQL_ASSOC))
	{
	$last_id = ($row['0']);
	}
	$nouvel_id = ++$last_id;
$utf = mysql_query("SET NAMES UTF8");
mysql_free_result;

Le code proprement dit de la gestion du form:

set_time_limit(120);//modification de la limitation de temps d'exécution du script en seconde
$nom_dossier= $nouvel_id."-".date('d-m-y')."-".time();
$extension = array('jpg', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées
$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier ");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier
$path = "../boutik/imag-art/".$nom_dossier."/";

// on teste si le formulaire permettant d'uploader un fichier a été soumis
if (isset($_POST['Enregistrer'])) {
    // on se connecte  notre base
    include ('includes/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


                //vérification du type de l'image et son poids
                if ( in_array(substr($fichier, -3), $extension) && $size<=4194304  )
                {

                    // type mime jpeg, jpg, gif ou png poids < à 4194304 octets soit 4Mo
                    //le nouveau nom de l'image est composé du nouvel id, de -, de la date format unix, d'un point et de l'extension.
                    $nom_final= $nouvel_id."-".date('d-m-y')."-".time().".".substr($fichier, -3);
                    //on déplace l'image dans le répertoire final

                    if (move_uploaded_file($tmp, $path . $nom_final)) 
                    {
                        //Message indiquant que tout s'est bien passé
                        //Pour le test on affiche l'image

                        echo '<p>Votre référence a bien été prise en compte<br /></p>';
                    }
           
              }

            $tab_final[$compteur] = $nom_final;
            $compteur++;
          }
    }//fin de l'instruction if  isset($_FILES['fichier'])
	//vérification des erreurs
    // on teste la déclaration de nos variables
    if (!isset($_POST['descriptif']) && ($_POST['titre']) && ($_POST['prix'])) 
    {
        $erreur = 'Les variables nécessaires au script ne sont pas définies.';
    }
    else {
          if (empty($_POST['descriptif']) || empty($_POST['titre']) || empty($_POST['prix'])) 
          {
            $erreur = '<p>Le champ description, titre ou prix est vide.</p>';
          }
        
        // si tout est bon, on peut commencer l'insertion dans la base
        else {
            // lancement de la requête d'insertion
            //définition des variables
$marque = $_POST['marque'];
$modele = $_POST['modele'];
$annee = $_POST['annee'];
$type = $_POST['type'];
$cc = $_POST['cc'];
$genre = $_POST['genre'];
$titre = $_POST['titre'];
$descrip = $_POST['descriptif'];
$devis = $_POST['devis'];
$port = $_POST['port'];
$prix = $_POST['prix'];
$photo = $_FILES['fichier'];
$famille = $_POST['nomfamille'];
$nam_photo = $nom_final;

            $sql = "INSERT INTO stock 
			(id_article, famille, marque, modele, annee, type, cc, prix, devis, titre, descriptif, port, date_insert, nom_dossier, nam_photo) 
			VALUES
			('', '".$famille."', '".$marque."', '".$modele."', '".$annee."', '".$type."', '".$cc."', '".$prix."', '".$devis."', '".$titre."' ,'".$descriptif."', '".$port."', NOW(), '".$nom_dossier."', '".$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();
            
        }
          
        
      }
    }


et pour finir, la partie html concernée:
<input type="hidden" name="MAX_FILE_SIZE" VALUE="4194304" />
<legend>Upload des photos:</legend><br />
<label for="photo">Photo 1:</label><input type="file" name="fichier[]" /><br />
<label for="photo">Photo 2:</label><input type="file" name="fichier[]" /><br />
<label for="photo">Photo 3:</label><input type="file" name="fichier[]" /><br />


Merci encore pour ton aide!
Bonjour
Bon, il y avait un problème dans
$extension = array('jpg', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées

Les photos que j'envoyais ont une extension (allez savoir pourquoi.... Smiley fache ): .JPG (majuscules donc).
J'ai modifié mon tableau en
$extension = array('jpg', 'JPG', 'JPEG', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées
, et maintenant, effectivement si je fais un echo des variables type size tmp fichier et nom_final j'obtiens (par exemple) ceci: image/jpeg/tmp/php2EB9xj669727P1010001.JPG8-31-12-10-1293786298.JPG
MAIS.....(bhé oui c'est pas fini...), j'ai maintenant un warning tel que:
Warning: move_uploaded_file(../boutik/imag-art/8-31-12-10-1293786298/8-31-12-10-1293786298.JPG) [function.move-uploaded-file]: failed to open stream: No such file or directory in /homez.106/heprod/www/dev/tsmoto/admin/creat-art.php on line 109
Smiley biggol
La ligne 109 étant :
                    if (move_uploaded_file($tmp, $path . $nom_final)) 

Et il y a 6 warning (pour 3 photos....)
A part m'arracher les cheveux (que je n'ai plus), là je sèche un peu..... Smiley nut

Toute aide ou conseil me ravira....Merci d'avance
Modifié par boro64 (31 Dec 2010 - 10:27)
Le warning te dit qu'il ne trouve pas le dossier.
Pour la cause du warning : ton dossier boutik est bien là ?
www/dev/tsmoto/boutik/
si il n'y est pas tu devrais avoir compris comment remédier à ce problème de warning.
sinon essaie de faire un test avec $path="../"; juste avant le move_upload pour voir où ton fichier est déposé dans tes dossiers et après tu remonte petit à petit.

Pour ta boucle :
Logiquement si tu as 6 warning tu as un problème dans ta boucle mais a priori comme ça je le vois pas. Donc histoire d'être sûr tu pourrais faire un echo $compteur; pour voir si il s'arrête bien à 2 ou à 5.

Désolé de pas pouvoir plus t'aider mais faut préparer le nouvelle an ! Bonne fête soit dit en passant.
Modifié par Su4p (31 Dec 2010 - 12:38)
Bonjour
Oui, c'est étrange le dossier est bien là, présent; le "sous-dossir" se crée bien depuis
$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier ");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier

Pour la boucle, l'echo me donne: 123
Ahhhhh...oui, là, problème; d'autant que le message affiché est toujours celui par défaut soit "erreur systeme". Et 3 étant: "le fichier n'est qu'en partie chargé".....?????
Donc oui, le problème vient visiblement de l'adressage...je vais donc regarder ça de plus près.
Merci à toi, et bonnes fêtes à toi et aux tiens!
J'en profite aussi pour adresser mes meilleurs vœux à toute la communauté d'Alsacréations
Je viens d'essayer de modifier le chmod....= petite nouveauté: plus de warning! (Haaaaaaaa....), mais toujours pas de photos dans le dossier (hooooooooo.....)...mais une nouveauté (Haaaaaaaaaa.....): la photo est là, dans le dossier admin où se trouve le formulaire d'upload.....(haaaaaa????) Smiley nut
Il y a donc bien un problème d'adressage...reste à trouver où!
Merci à Su4p pour son aide et ses conseils....je ne mets pas encore Résolu....
A plus tard, ou à l'an prochain!
Bonjour
Derniers résultats:
2 dossiers se créent systématiquement lors de l'upload; le premier est vide, le second réceptionne bien les images...ou presque; en effet, si 1 image uploadée, on a 1 image dans le dossier, mais si 2 images, on en a 1, et si 3 images uploadées, il y en a 2! à chaque fois, il manque 1 image donc; et surtout, d'où vient le dossier...et quand je fais echo $path, le chemin et le nom correspondent bien à ce qui est créé et reçoit l'image.
Donc:
-1- d'où vient le 1er dossier créé (vide)
-2- où passent la photo manquante, et pourquoi est elle manquante....? Smiley biggol

Si quelqu'un à une piste, je suis toujours preneur.... Smiley lol
Résolu !!!!
J'ai fini par comprendre!! Smiley lol
Ma variable
$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier
créait bien un dossier...mais avant l'upload (le fameux dossier vide), puis le dossier avec les photos était à nouveau créé lors de
                    if (move_uploaded_file($tmp, $path.$nom_final)) 
....
Il suffisait donc de placer la $dos_destinataire ainsi:
 
set_time_limit(120);//modification de la limitation de temps d'exécution du script en seconde
$nom_dossier= $nouvel_id."-".date('d-m-y')."-".time();
$extension = array('jpg', 'JPG', 'JPEG', 'gif', 'jpeg', 'png');//définition de la variable extension gérant les ext. autorisées
$path = "../boutik/imag-art/".$nom_dossier."/";

// on teste si le formulaire permettant d'uploader un fichier a été soumis
if (isset($_POST['Enregistrer'])) {
    // on se connecte  notre base
    include ('includes/connect.inc.php');
    //déclaration chargement photo
    if(isset($_FILES['fichier']))
    {
        //$_FILES existe

        $compteur=0;
$dos_destinataire = mkdir("../boutik/imag-art/$nom_dossier");//définition de l'adresse du dossier destinataire et création(mkdir) du dossier

        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


                //vérification du type de l'image et son poids
                if ( in_array(substr($fichier, -3), $extension) && $size<=4194304  )
                {
                    // type mime jpeg, jpg, gif ou png poids < à 4194304 octets soit 4Mo
                    //le nouveau nom de l'image est composé du nouvel id, de -, de la date format unix, d'un point et de l'extension.
                    $nom_final= $nouvel_id."-".date('d-m-y')."-".time().".".substr($fichier, -3);
  echo $path;                  //on déplace l'image dans le répertoire final
                    if (move_uploaded_file($tmp, $path.$nom_final)) 
                    {
                        //Message indiquant que tout s'est bien passé
et là.....Yes ! ça fonctionne nickel!
Merci à Su4p de m'avoir mis sur la voie!