Page 1 sur 1

Peut etre que si je double sa marche ?!

Posté : 10 janv. 2010, 04:08
par thekingkong
Bonjour, alors voila j'ai un petit script de petites annonces, mais voila je ne veut pas savoir que certaine fonction sont périmé mais juste comment faire pour que mon annonce affiche plusieurs photos :mrgreen: . Halala qu'est ce que vous êtes coriace sur certaines choses alors :mrgreen:

Donc s'il vous plait, je vous en surlie aide moi :priere: , aider moi et arrête de vous faire la guerre parce qu'une fonction ne couvre pas la totalité des caractère spéciaux. :cry:

Après, je vous laisse tranquille :^o .

Voila dite moi juste si est ce que je double ce code :
Donc dans la page du formulaire d'ajout de petite annonce, je double :
la cible est : new-sujet-poster.php

<input type="file" name="fichier" size="23">
<input type="file" name="[b]double du champ pour uploader l'image[/b] (fichier2)" size="23">
et donc dans new-sujet-poster.php je double :


//---------------------------------------------
//  DEFINITION DES VARIABLES LIEES AU FICHIER pour l uplode
//---------------------------------------------

$nom_file   = $_FILES['fichier']['name'];
$taille     = $_FILES['fichier']['size'];
$tmp        = $_FILES['fichier']['tmp_name'];

$nom_file = strtr($nom_file,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$nom_file = preg_replace('/([^.a-z0-9]+)/i', '-', $nom_file);

if(!empty($_POST['posted'])) {
    // On vérifie si le champ est rempli
    if(!empty($_FILES['fichier']['name'])) {
        // On vérifie l'extension du fichier
        if((substr($nom_file, -3) == $extension) || (substr($nom_file, -3) == $extension1) || (substr($nom_file, -3) == $extension2)) {
            // On récupère les dimensions du fichier
            $infos_img = getimagesize($_FILES['fichier']['tmp_name']);

            // On vérifie les dimensions et taille de l'image
            if(($infos_img[0] <= $width_max) && ($infos_img[1] <= $height_max) && ($_FILES['fichier']['size'] <= $max_size)) {
                // Si c'est OK, on teste l'upload
                if(move_uploaded_file($tmp,$target.$time6.$nom_file)) {
S'il vous plait on s'en fiche de strstr :oops: .


Merci a tous, bonne nuit ElePHPant

Re: Peut etre que si je double sa marche ?!

Posté : 10 janv. 2010, 06:12
par niuxe
Hello kingkong,

Oui mais... Tu doubles ou triples ou quadruples ou etc., mais surtout tu changes le nom de l'élément input :
<input type="file" name="fichier1" size="23">
<input type="file" name="fichier2" size="23">
<input type="file" name="fichier3" size="23">
<!-- etc. -->


Et en ce qui concerne le code après, je te conseille de le factoriser. Pour ce faire, tu vas créer une fonction qui permet de faire les contrôles adéquates. Le contrôle est apparemment fait et tu n'as plus qu'à mettre en fonction :
$nom_file   = $_FILES['fichier']['name'];
$taille     = $_FILES['fichier']['size'];
$tmp        = $_FILES['fichier']['tmp_name'];

$nom_file = strtr($nom_file,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$nom_file = preg_replace('/([^.a-z0-9]+)/i', '-', $nom_file);

if(!empty($_POST['posted'])) {
    // On vérifie si le champ est rempli

//etc.
Sur PHP débutant, tu as un tuto à ce sujet : les fonctions

Bonne lecture. :)

Re: Peut etre que si je double sa marche ?!

Posté : 10 janv. 2010, 16:20
par thekingkong
Haaaa nolem, mon clark kent :D
merci merci merci, vraiment sympa ce forum je déconseille vivement les débutant d'utilisateur du siteduzero comment il nous traite la bas, vraiment comme des chiens enfin breff sa fait longtemps que je n'y est plus était :mrgreen:

En tout cas merci merci merci :D

Mais juste une dernière question :oops: ( si vous voulez bien-sur pour cette partie ) :

je double aussi ? car je ne sait absolument rien faire en php a par peut être la fonction echo, if, et afficher écrire une variable. :oops:

$nom_file = $_FILES['fichier']['name'];
$taille = $_FILES['fichier']['size'];
$tmp = $_FILES['fichier']['tmp_name'];

$nom_file = strtr($nom_file,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$nom_file = preg_replace('/([^.a-z0-9]+)/i', '-', $nom_file);

if(!empty($_POST['posted'])) {
// On vérifie si le champ est rempli

//etc.

Re: Peut etre que si je double sa marche ?!

Posté : 10 janv. 2010, 20:16
par thekingkong
Répondez-moi s'il vous plait ! :(

Re: Peut etre que si je double sa marche ?!

Posté : 10 janv. 2010, 20:24
par Aureusms
Je ne pense sinon tu va créé un deuxième fichier.
Créé une fonction pour bien répéter les mêmes instructions c'est plus simple.

Re: Peut etre que si je double sa marche ?!

Posté : 10 janv. 2010, 20:31
par Ryle
Hé ho ?! Pas d'impatience, c'est le week end ;)

Pour la peine, je vais même pas te répondre, je vais t'expliquer, et t'ajouteras l'upload de fichier aux fonctions de php que tu connais :p

Pour chaque fichier que tu veux uploader il te faut un champ input dans le formulaire :
<input type="file" name="nom_du_champ_du_fichier" />
Le(s) fichier(s) est/sont transféré(s) sur serveur dans un dossier temporaire. Toutes les informations relatives au(x) fichier(s) envoyé(s) sont dans la variable $_FILES (nom du fichier d'origine, taille du fichier, etc.).
Ainsi, le nom du fichier temporaire est contenu dans $_FILES['nom_du_champ_du_fichier']['tmp_name']. Afin de récupérer ce fichier, il te faut le déplacer du dossier temporaire vers l'emplacement de ton choix avec move_uploaded_file().

Si tu veux uploader plusieurs fichiers, il te faut effectivement plusieurs inputs dans ton formulaire, et il te faut pour chacun d'eux déplacer le fichier temporaire dans le répertoire de ton choix (avec le nom de fichier qui va bien). Pour cela tu peux donner des noms différents aux inputs (et répéter les traitements pour chacun d'eux). Tu peux également nommer tes inputs avec le même nom et des []. Tu obtiens ainsi un tableau dans $_FILES que tu peux facilement parcourir ($_FILES['nom_du_champ_sans_crochets'][0]['name'] contient le premier fichier, $_FILES['nom_du_champ_sans_crochets'][1]['name'] le second, etc.)

Re: Peut etre que si je double sa marche ?!

Posté : 10 janv. 2010, 20:44
par thekingkong
Merci : :D
Je tacherait d'être patient ( puis au fait bon week-end ).

Oui merci c'est bon xd j'ai ajouté les champs pour uploader les fichier :D bon sa marche mais par pour les champs que j'ai ajouter, la il y a vraiment un problèmes. Quel chance vous avez de connaitre le php par cœur au moins vous ne dépendez de personne.

Merci, ( Sur tout de m'avoir répondu quand même savourez bien cette fin de week ) :D

Re: Peut etre que si je double sa marche ?!

Posté : 11 janv. 2010, 09:34
par niuxe
Haaaa nolem, mon clark kent :D
Heu.... 8-| ...
Je veux pas de problème avec les voisins... :lol:


En complément de l'explication de Ryle, je rajouterai ceci (je vais faire court :^o ) :

Lorsque tu « upload » un fichier sur le serveur, l'élément form aura obligatoirement l'attribut :
* action qui pointera soit dans le même fichier ou dans un autre, (À noter que dans le même fichier, cela rend la tâche plus aisée)
* method avec la valeur post
* enctype avec la valeur multipart/form-data (encodage des données envoyées)
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post" enctype="multipart/form-data">
    <fieldset>
        <legend>envoie de fichiers</legend>
        <p>
            <label for="id_image">image : </label>
            <input type="file" name="image" id="id_image" />
            <input type="hidden" name="max_file_size" value="200000" /> <!-- valeur exprimée en octets -->
            <input type="hidden" name="__envoi" value="__ok" />
            <input type="submit" name="envoyer" value="envoyer" />
        </p>
    </fieldset>
</form>


Traiter un formulaire d'upload de fichier est quelque chose à prendre avec beaucoup d'attention et d'une manière générale, ne jamais faire confiance à l'utilisateur y compris toi (!). Lorsque le formulaire est soumis la super-globale $_POST ne te sera pas d'une grande aide (sauf au contrôle de soumission du formulaire). Ce sera la super-globale $_FILES. Pour rappel, une super-globale peut être appelée dans n'importe quel endroit du code. $_FILES est un tableau à deux dimensions et de type associatif.
$_FILES["image"]["name"] = "bg_temp.jpg"; // le nom de départ du fichier
$_FILES["image"]["type"] = image/jpeg; // le type MIME du fichier uploadé
$_FILES["image"]["tmp_name"] = "C:\wamp\tmp\php24D3.tmp"; // Là où le fichier est placé temporairement. (cf. Ryle)
$_FILES["image"]["error"] = 0; //Est ce qu'il y a eu une erreur lors de l'envoi sur le serveur ? À noter que la valeur exprimée renvoie sur un code exprimé par des constantes (http://fr2.php.net/manual/fr/function.constant.php).
$_FILES["image"]["size"] = 14441; // le poids du fichier envoyé exprimé en octets.
Lors de l'envoi du formulaire, comment connaître toutes ces informations ? Tu vas avoir besoin de l'élément html pre et de la fonction native PHP print_r. ton code devrait avoir à peu près cette gueule là :
<?php
function debug($x){
    echo "<pre>";
    print_r($x);
    echo "</pre>";
}
    if(isset($_POST["__envoi"]) && $_POST["__envoi"] == "__ok"){
        debug($_FILES);
    }
?>
<form action="<?php echo htmlspecialchars("controle.php"); ?>" method="post" enctype="multipart/form-data">
<!-- etc. -->
Maintenant que tu as vu que donne l'array $_FILES, il va falloir coder tout ça. :roll:
Dans un premier temps, récupération des erreurs, s'il y a et faire des tests afin de savoir si le fichier s'est bien envoyé ou qu'il n'y a pas de problème. Cela donne un truc du style pour le début (nous y reviendrons un peu plus loin sur cette structure) :
        //récupération du code erreur s'il y a...
        $erreur[] = $_FILES["image"]["error"];
        if($erreur[0] == UPLOAD_ERR_OK){
            
        }else{

        }
Ce qui revient à dire, si $erreur est égale ( « == » ) à zéro, ..., sinon ... (je ne parle pas de la clef [0]) ;)

Partons du principe qu'il y eu aucune erreur lors du transfert du fichier, il te reste à faire les autres filtres d'usages :
* Est ce que le nom du fichier est correct ?
* Est ce que l'extension du fichier attendue est correcte ?
* Est ce que le transfert du fichier dossier tmp au dossier personnel s'est bien déroulé ?

Pour toutes ces énumérations, il va falloir une fonction pour chacune et réunir le tout. Au passage, une fonction personnelle ne fait qu'une seule et unique chose. ;)
nom du fichier correct ?
function nettoyer_nom_fichier($nom){
    $caractere_depart = "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ";
    $caractere_sortie = "AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy";
    
    //remplace caracteres erronés
    $nom = strtr(basename($_FILES[$nom]["name"]),$caractere_depart,$caractere_sortie);
    //remplace les caracteres autres que lettres, chiffres et point par _ et retourne la valeur obtenue
    return preg_replace('/([^.a-z0-9]+)/i', '_', $nom);
}

extension fichier attendue :
function verification_extension_image($nom){
    $extension_acceptee = array(
        "gif",
        "jpg",
        "jpeg"
    );
    //récupération de l'extension
    $pos_dernier_point = strrpos($_FILES[$nom]["name"],".");
    $extension_fichier_form = strtolower(substr($_FILES[$nom]["name"],$pos_dernier_point + 1));
    
    //extension trouvée ?
    return (!in_array($extension_fichier_form,$extension_acceptee))? "Extension de fichier non autorisé" : 0 ;
}
La dernière ligne (conditionnelle ternaire) retourne une valeur 0 si tout s'est bien passé. Cela revient à dire ceci :
if(!in_array($extension_fichier_form,$extension_acceptee)){
    $erreur = 0;
}else{
    $erreur = "Extension de fichier non autorisé";
}
return $erreur;
transfert dans le dossier personnel :
function transfert_fichier_rep_perso($dossier_temp, $destination,$nom){
    //test si le transfert est ok
    return(@move_uploaded_file($dossier_temp,$destination.$nom) == false)? "transfert du fichier ".$nom." au dossier impossible" : "fichier ".$nom." envoyé sur le serveur" ;
}
Nous arrivons à la fonction qui va contrôler si tout se déroule bien. Il manque plus qu'à ficeler le tout. (Heu..., s'il y en a plus je vous l'emballe ? :lol: )
function controle_envoi_image($nom_input){
    //récupération du code erreur s'il y a...
    $erreur[] = $_FILES[$nom_input]["error"];
    
    //verification du transfert fichier vers le serveur
    if($erreur[0] !== UPLOAD_ERR_OK){
        switch($erreur[0]){
            case UPLOAD_ERR_NO_FILE :
                $erreur[] = "Aucun fichier a été transmis au serveur.";
                break;
            case UPLOAD_ERR_INI_SIZE :
                $erreur[] = "Le fichier dépasse la taille max. autorisé par le serveur."; //par php en fait. voir la config je crois ou mettre une directive. 
                break;
            case UPLOAD_ERR_FORM_SIZE :
                $erreur[] = "Le fichier dépasse la taille max. (".($_POST["MAX_FILE_SIZE"] / 1000)." ko) autorisé par le formulaire.";
                break;
            case UPLOAD_ERR_PARTIAL :
                $erreur[] = "Le fichier a été transmis partiellement au serveur.";
                break;
            default :
                $erreur[] = "erreur de traitement du formulaire envoi fichiers";
        }
    //vérification en rapport au fichier uploadé (ext - dimension - valeur - etc.)
    }else{
        //erreur de traitement de transfert au dossier perso
        $erreur[] = verification_extension_image($nom_input);
    }
    
    //si erreur : affiche les erreurs
    //sinon transfert le fichier dans le bon dossier avec le nouveau nom
    if(!preg_match("#^0+$#",implode("",$erreur))){
        echo "<p>erreur(s) de traitement trouvée(s) : </p>";
        echo "<ul>";
        for($i = 0 ; $i < count($erreur) ; $i++){
            echo (!is_int($erreur[$i]))? "<li>".$erreur[$i]."</li>" : "" ;
        }
        echo "</ul>";
        
        return false;
        
    }else{
        return true;
    }
}

Re: Peut etre que si je double sa marche ?!

Posté : 11 janv. 2010, 10:10
par niuxe
suite :

Commentons la dernière fonction « controle_envoi_image » :
Comme je l'ai mentionné plus haut, tu as la structure avec les constantes natives PHP 5 à propos de l'envoi de fichier.
Cette fonction se divise en trois parties :
* teste si le fichier est bien arrivé sur le serveur (UPLOAD_ERR_OK, UPLOAD_ERR_NO_FILE,etc.)
* teste suivant ta logique (choix extension, s'il y a : choix des dimensions, etc.)
* s'il y a une erreur de traitement, affiches ces dernières
Pour finir, la fonction retourne vrai ou faux.

Si tout est bon, on peut changer le nom du fichier et tenter de transférer le fichier du dossier temporaire au dossier précisé.

En résumé,

quand le formulaire est soumis :
cherche et affiche les erreurs,
changement nom,
transfert du fichier dans le dossier personnel
envoi des données à la base (si besoin)
    //soumission form image
    if(isset($_POST["__envoi"]) && $_POST["__envoi"] == "__ok"){
        $nom_input = "image";
        //si le controle d'envoi est ok alors le nom du fichier  est changé sinon le nom du fichier sera égale à rien 
        $nom_image = (controle_envoi_image($nom_input) == true)? nettoyer_nom_fichier($nom_input) : "" ;
        echo transfert_fichier_rep_perso($_FILES[$nom_input]["tmp_name"], "",$nom_image); // le deuxième paramètre : indiquer le chemin de destination
    }
Le fichier final aura cette tête là :
<?php
function debug($x){
    echo "<pre>";
    print_r($x);
    echo "</pre>";
}

function nettoyer_nom_fichier($nom){
    $caractere_depart = "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ";
    $caractere_sortie = "AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy";
    
    //remplace caracteres erronés
    $nom = strtr(basename($_FILES[$nom]["name"]),$caractere_depart,$caractere_sortie);
    //remplace les caracteres autres que lettres, chiffres et point par _ et retourne la valeur obtenue
    return preg_replace('/([^.a-z0-9]+)/i', '_', $nom);
}

function verification_extension_image($nom){
    $extension_acceptee = array(
        "gif",
        "jpg",
        "jpeg"
    );
    //récupération de l'extension
    $pos_dernier_point = strrpos($_FILES[$nom]["name"],".");
    $extension_fichier_form = strtolower(substr($_FILES[$nom]["name"],$pos_dernier_point + 1));
    
    //extension trouvée ?
    return (!in_array($extension_fichier_form,$extension_acceptee))? "Extension de fichier non autorisé" : 0 ;
}

function transfert_fichier_rep_perso($dossier_temp, $destination,$nom){
    //test si le transfert est ok
    return(@move_uploaded_file($dossier_temp,$destination.$nom) == false)? "transfert du fichier ".$nom." au dossier impossible" : "fichier ".$nom." envoyé sur le serveur" ;
}

function controle_envoi_image($nom_input){
    //récupération du code erreur s'il y a...
    $erreur[] = $_FILES[$nom_input]["error"];
    
    //verification du transfert fichier vers le serveur
    if($erreur[0] !== UPLOAD_ERR_OK){
        switch($erreur[0]){
            case UPLOAD_ERR_NO_FILE :
                $erreur[] = "Aucun fichier a été transmis au serveur.";
                break;
            case UPLOAD_ERR_INI_SIZE :
                $erreur[] = "Le fichier dépasse la taille max. autorisé par le serveur."; //par php en fait. voir la config je crois ou mettre une directive. 
                break;
            case UPLOAD_ERR_FORM_SIZE :
                $erreur[] = "Le fichier dépasse la taille max. (".($_POST["MAX_FILE_SIZE"] / 1000)." ko) autorisé par le formulaire.";
                break;
            case UPLOAD_ERR_PARTIAL :
                $erreur[] = "Le fichier a été transmis partiellement au serveur.";
                break;
            default :
                $erreur[] = "erreur de traitement du formulaire envoi fichiers";
        }
    //vérification en rapport au fichier uploadé (ext - dimension - valeur - etc.)
    }else{
        //erreur de traitement de transfert au dossier perso
        $erreur[] = verification_extension_image($nom_input);
    }
    
    //si erreur : affiche les erreurs
    //sinon transfert le fichier dans le bon dossier avec le nouveau nom
    if(!preg_match("#^0+$#",implode("",$erreur))){
        echo "<p>erreur(s) de traitement trouvée(s) : </p>";
        echo "<ul>";
        for($i = 0 ; $i < count($erreur) ; $i++){
            echo (!is_int($erreur[$i]))? "<li>".$erreur[$i]."</li>" : "" ;
        }
        echo "</ul>";

        return false;
    
    }else{
        return true;
    }
}

    //soumission form image
    if(isset($_POST["__envoi"]) && $_POST["__envoi"] == "__ok"){
        $nom_input = "image";
        //si le controle d'envoi est ok alors le nom du fichier  est changé sinon le nom du fichier sera égale à rien 
        $nom_image = (controle_envoi_image($nom_input) == true)? nettoyer_nom_fichier($nom_input) : "" ;
        echo transfert_fichier_rep_perso($_FILES[$nom_input]["tmp_name"], "",$nom_image); // le deuxième paramètre : indiquer le chemin de destination
    }
?>
<form action="<?php echo htmlspecialchars("controle.php"); ?>" method="post" enctype="multipart/form-data">
    <fieldset>
        <legend>envoie de fichiers</legend>
        <p>
            <label for="id_image">image : </label>
            <input type="hidden" name="MAX_FILE_SIZE" value="200000" />
            <input type="file" name="image" id="id_image" />
            <input type="hidden" name="__envoi" value="__ok" />
            <input type="submit" name="envoyer" value="envoyer" />
        </p>
    </fieldset>
</form>
Si tu as des questions n'hésite pas à poser sur le forum. Également, ce fichier peut être encore amélioré. J'ai essayé de faire simple.

Bonne journée