[Résolu] upload images aux résultats aléatoires

Eléphant du PHP | 250 Messages

03 janv. 2011, 11:45

Bonjour, et bonne année :fete:
Voilà mon problème:
J'ai un formulaire d'où le propriétaire peut charger 3 photos. Lors du chargement, je crée un dossier (normalement) spécifique à cet envoi. Or, non seulement 2 dossiers sont créés, mais sur 3 photos, seules 2 sont enregistrées, et je ne sais pas où est la 3eme. Même chose quand il y 2 photos, 2 dossiers sont créés et une seule image est chargée. Petite précision, je vois cela avec Filezilla sur l'hébergement.
Pour commencer, voici le code dans l'entête:
session_start();

if (!isset($_SESSION['nom'])){
	header ('Location:ident.php');
	exit();
	}
include ('includes/connect.inc.php');
$requete_id = mysql_query("SELECT * FROM stock ORDER BY id_article DESC LIMIT 1");

while ($row = mysql_fetch_array($requete_id, MYSQL_BOTH))
	{
	$last_id = ($row[0]);
	}
	$nouvel_id = ++$last_id ;
$utf = mysql_query("SET NAMES UTF8");
mysql_free_result;
celui traitant les données 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', 'JPG', 'JPEG', '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);
  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é

                        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'])

    // 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());


            
        }
          
        
      }
    }


et la partie html du form (avec son entête) concernée
<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 />
Quand j'utilise la boucle ci dessous, j'ai systématiquement un message "erreur systeme", mais si je fais un echo sur la boucle, il affiche "123".
	//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
D'autre part, après l'upload, j'ai autant de message "Votre référence a bien été prise en compte" qu'il y a d'image, et l'echo de la $path m'affiche bien le bon chemin, aec un seul dossier pour les 3 images.... |*()
D'avance merci pour vos avis, remarques et conseils
Modifié en dernier par Boro64 le 10 janv. 2011, 14:50, modifié 1 fois.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Eléphant du PHP | 250 Messages

03 janv. 2011, 15:21

Ooooooupsssssssss....Pratiquement Résolu avec un peu de réflexion.... :oops:
La 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 un dossier avant l'upload...et donc vide; puis l'upload s'effectue bien avec
                    if (move_uploaded_file($tmp, $path.$nom_final)) 
...d'où un problème d'adressage certainement pour les images; en plaçant la variable créatrice de dossier de cette façon, le problème des 2 dossiers est résolu....
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é
Reste le problème que lorsque on veut uploader 3 images, seules 2 le sont.... :shock:
Si vous avez une idée, je suis preneur....
[Edit]= Correctif: si je veux uploader 3 photos, ce peut être seulement 1 image qui l'est réellement, pas forcément 2. J'ai aussi le l'impression que le script s'arrête très vite (environ 20 secondes); j'ai vérifié le php.ini :
max_file_uploads = 20
max_execution_time = 30
Pour ce dernier, je fais
set_time_limit(200);
Bref....HELP !!! :cry:
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

Eléphant du PHP | 250 Messages

10 janv. 2011, 14:49

YES ! :lol: Résoluuuuuuuuuuuu !!!!!
Bien, pour ceux qui auraient ce problème, la (une?) solution:
Bien qu'utilisant les fonctions date() et time(), les fichiers uploadés s'écrasaient car avaient le même nom...parfois.....
La solution (pour moi) fut d'utiliser la fonction uniqid....MAIS, attention avec php5, le paramètre "facultatif" more_entropy...ne l'est pas
Donc (valable surtout pour des uploads qui ne nécessitent pas forcément un identifiant de 23 caractères supplémentaires), l'appel se fait alors ainsi:
uniqid ('', false)
....et ça marche nickel!!!!!!

Merci.
"L'histoire, à l'image de toutes choses dans l'univers, semble avoir comme unique règle le côté ondulatoire."

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

12 janv. 2011, 02:00

heu quel est l'intéret de uniqid ('', false) ? pourquoi pas simplement uniqid() ?

je viens de tester :
<?php
echo 'test uniqid()<br />';
$i = 0;
while($i<50){
$a = uniqid();
$b = uniqid ('');
echo $a,'|',$b,'<br />';
$i++;
}
?>
qui fonctionne parfaitement et ne retourne aucune erreur
idem avec
<?php
echo 'test uniqid()<br />';
$i = 0;
while($i<50){
$b = uniqid ('moogli');
echo $b,'<br />';
$i++;
}
?>
le tout en php 5.3.4 ...

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