Page 1 sur 2

photo dans BDD

Posté : 16 févr. 2011, 19:11
par ezacal
bonjour
Je souhaite rajouter des photos dans ma bdd, mais j'avoue ne pas maitriser.
le client se connecte par un formulaire ou il donne son id et son mot de passe
puis il doit pouvoir charger sa photo.
J'ai cherché des scripts et j'ai trouvé celui de damienalexandre.fr qui me convenait tout à fait
Après l"étude de quelques tutos, j'ai modifié le script comme ci après.
[php]<?php


session_start();


		
/**
 * Script d'upload d'image PHP
 * http://damienalexandre.fr/
 * Novembre 2007 - v1.3
 * http://damienalexandre.fr/Upload-d-image-en-PHP.html
 */

$db = mysql_connect(XXXX', 'XXXX', 'XXXX')  or die('Erreur de connexion '.mysql_error());
// sélection de la base  

mysql_select_db('XXXX',$db)  or die('Erreur de selection '.mysql_error());


$sql="SELECT * FROM client  WHERE id = '".$_REQUEST['id']."'";
$resultat=mysql_query($sql) or die("Erreur SQL : $sql<br/>".mysql_error());
$client = mysql_fetch_array ($resultat)	;

$photo1=$_POST['photo1'];
$id=$client['id'];
$dossier= $client['dossier'];

if ($_POST['id'] !== $id or $_POST['motdepasse'] !==$dossier)
		{header("location: index.php");}
		
if ($_REQUEST['envoi']=="envoyer")
{
$sql="UPDATE client SET 
photo1='$photo1'
WHERE id='".$_REQUEST['id']."'";
mysql_query ($sql);
echo mysql_error();

}

function get_extension($nom) {
    $nom = explode(".", $nom);
    $nb = count($nom);
    return strtolower($nom[$nb-1]);
}

// --------------------- Options diverses //

// Extensions images autorisé (pour le moment, que du jpeg)
$extensions_ok = array('jpg', 'jpeg');
// MimeType autorisé
/* 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF (Ordre des octets Intel), 8 = TIFF (Ordre des octets Motorola), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF */
$typeimages_ok = array(2);

$taille_ko = 1024; // Taille en kilo octect (ko)
$taille_max = $taille_ko*1024; // En octects
$dest_dossier = 'img/'; // Creez ce dossier et chmoodez le !
print_r($_FILES['photo']);
    if(isset($_FILES['photo'])) // Formulaire envoyé
    {
        // Les erreurs que PHP renvoi
        if($_FILES['photo']['error'] !== "0") {
                switch ($_FILES['photo']['error']) {
                case 1:
                    $erreurs[] = "Votre image doit faire moins de $taille_ko Ko !";
                    break;
                case 2:
                    $erreurs[] = "Votre image doit faire moins de $taille_ko Ko !";
                    break;
                case 3:
                    $erreurs[] = "L'image n'a été que partiellement téléchargé.";
                    break;
                case 4:
                    $erreurs[] = "Aucun fichier n'a été téléchargé.";
                    break; // Pas de 5, ne pas demander pourquoi ^^ (voir doc PHP)
                case 6:
                    $erreur[] = "Un dossier temporaire est manquant.";
                    break;
                case 7:
                    $erreurs[] = "Échec de l'écriture du fichier sur le disque.";
                    break;
            }
        }
        // getimagesize arrive à traiter le fichier ?
        if(!$getimagesize = getimagesize($_FILES['photo']['tmp_name'])) {
            $erreurs[] = "Le fichier n'est pas une image valide.";
        }
        // on vérifie le type de l'image
        if( (!in_array( get_extension($_FILES['photo']['name']), $extensions_ok ))
           or (!in_array($getimagesize[2], $typeimages_ok )))
        {
            foreach($extensions_ok as $text) { $extensions_string .= $text.', '; }
            $erreurs[] = 'Veuillez sélectionner un fichier de type '.substr($extensions_string, 0, -2).' !';
        }
        // on vérifie le poids de l'image
        if( file_exists($_FILES['photo']['tmp_name']) 
                  and filesize($_FILES['photo']['tmp_name']) > $taille_max)
        {
            $erreurs[] = "Votre fichier doit faire moins de $taille_ko Ko !";
        }

        // copie du fichier si aucune erreur !
        if(!isset($erreurs) or empty($erreurs))
        {
            $dest_fichier = basename($_FILES['photo']['name']);
            $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝà áâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
            // un chtit regex pour remplacer tous ce qui n'est ni chiffre ni lettre par "_"
            $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
            
            // pour ne pas ecraser un fichier existant
            while(file_exists($dest_dossier . $dest_fichier)) {
                $dest_fichier = rand().$dest_fichier;
            }
            
            // copie du fichier
            if(move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier)) {
                $valid[] = "Image uploadé avec succés (<a href='".$dest_dossier . $dest_fichier."'>Voir</a>)";
            } else {
                $erreurs[] = "Impossible d'uploader le fichier.<br />Veuillez vérifier que le dossier ".$dest_dossier." existe avec un chmod 755 (ou 777).";
            }
        }
    }
?>
<!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" lang="fr">
	<head>	
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<title>Upload d'image en PHP</title>
	</head>
	<body>

<form method="POST" action="" enctype="multipart/form-data">
<?php
if(!empty($erreurs)) {
    echo '<ul class="erreur">';
    foreach($erreurs as $erreur) {
        echo '<li>'.$erreur.'</li>';
    }
    echo '</ul>';
}
if(!empty($valid)) {
    echo '<ul class="validation">';
    foreach($valid as $text) {
        echo '<li>'.$text.'</li>';
    }
    echo '</ul>';
}

?>

    <fieldset>
    <legend>Envoi d'image</legend>
    <p>
            <label for="photo">Image : </label>
            <input type="file" name="photo" id="photo" />
    </p>
        <p>
            <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $taille_max; ?>" />
            <input type="submit" name="envoi" value="Envoyer" />
        </p>
    </fieldset>
</form>

</body>
</html>
[/php]
Mais il ne marche pas !!!
message d'erreur suivant
(Array ( [name] => graph.jpg [type] => image/jpeg [tmp_name] => /var/log/tmp/phposNVRw [error] => 0 [size] => 4629 )
Warning: move_uploaded_file(img/graph.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in /homez.110/creditsr/www/photo.php on line 119

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/var/log/tmp/phposNVRw' to 'img/graph.jpg' in /homez.110/creditsr/www/photo.php on line 119

* Impossible d'uploader le fichier.
Veuillez vérifier que le dossier img/ existe avec un chmod 755 (ou 777).)

j'ai créé photo1 dans ma bdd en blob.

Je n'y comprends que dalle !!!

Les erreurs sont surement simples mais le débutant que je suis ne les trouve pas
merci de votre aide

Re: photo dans BDD

Posté : 16 févr. 2011, 19:43
par xTG
Le message d'erreur anglais est pourtant traduit en français. ^^

C'est un problème de chemin. Le dossier de destination img n'existe pas à cet endroit de l'arborescence.
Où se trouve ton script par rapport à ce dossier ?

Re: photo dans BDD

Posté : 17 févr. 2011, 14:35
par ezacal
merci pour ton aide !
je comprends !
c'est
$dest_dossier = 'img/'; // Creez ce dossier et chmoodez le !
qui est incomplet.
j'ai donc créé le dossier img et cela fonctionne : la photo est bien dans ce dossier.
mais comme vous le voyez dans le script, je souhaite mettre cette photo dans une bdd dans le dossier du client.
j'ai modifié 2/3 bricoles
$photo1=$_FILES['photo'];
au lieu de
$photo1=$_POST['photo'];
mais la photo n'est toujours pas chargée.
merci

Re: photo dans BDD

Posté : 17 févr. 2011, 14:50
par xTG
Alors tout d'abord ton update ne bdd doit se faire si le fichier a été uploadé. Donc tout à la fin !
Car dans tous les cas il te faut le chemin vers ce fichier : $dest_dossier . $dest_fichier (et non pas $_FILES['photo'] qui est un array et non le nom du fichier !)

Re: photo dans BDD

Posté : 17 févr. 2011, 17:29
par ezacal
Je crois avoir compris que je dois donc charger le fichier dans la bdd après qu'il soit chargé dans mon dossier?
Mais comment charger un fichier dont je ne connais pas le nom dans ma bdd ?
En plus, je sais incrémenter une bdd via un formulaire, mais je ne sais pas comment charger un fichier qui est sur le serveur.
Mais je n'ai peut être pas compris ce que tu m'as expliqué!

Re: photo dans BDD

Posté : 17 févr. 2011, 18:59
par ezacal
j'ai fouillé un peu et j'ai avancé!!!
la meilleure solution est bien d'uploader dans un dossier et de modifier le nom du fichier afin de le rendre unique (avec le N° id du client par exemple)
Je parts donc sur cette solution.
Mais peut on modifier le nom d'un fichier AVANT son chargement, car j'ai plusieurs clients qui peuvent charger leur photo et il serait plus facile qu'elle ait le bon nom dès le départ.
Je cherche de mon côté.
merci si vous pouvez me renseigner

Re: photo dans BDD

Posté : 17 févr. 2011, 19:24
par ezacal
je chauffe !
fonction rename (dur d'être débutant :oops: :oops: )

Re: photo dans BDD

Posté : 17 févr. 2011, 20:33
par xTG
Tu as déjà une partie pour avoir un nom de fichier unique dans ton code. :/
// pour ne pas ecraser un fichier existant
            while(file_exists($dest_dossier . $dest_fichier)) {
                $dest_fichier = rand().$dest_fichier;
            }
Et sinon relis mon message, il y a tout ce que tu cherches dedans. ^^'

Re: photo dans BDD

Posté : 19 févr. 2011, 16:40
par ezacal
oui, ça c'est parfait si le client charge 2 fois sa photo, mais ce que je voudrais ,c'est que la photo s'appelle photo"n°id".jpg
par ex photo1060.jpg
j'ai essayé de modifier
          $dest_fichier = basename($_FILES['photo']['name']);
            $dest_fichier = strtr($dest_fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝà áâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
            // un chtit regex pour remplacer tous ce qui n'est ni chiffre ni lettre par "_"
            $dest_fichier = preg_replace('/([^.a-z0-9]+)/i', '_', $dest_fichier);
par
			
            $dest_fichier = rename($dest_fichier, $NewNomFichier);
mais je ne trouve pas d'info sur le net pour que $NewNomFichier prenne la valeur voulue.
merci

Re: photo dans BDD

Posté : 19 févr. 2011, 17:13
par xTG
A cette étape le fichier n'existe pas encore (sauf dans le dossier temporaire).
Donc la fonction rename() ne te sert à rien.

A cet endroit du code tu formes le nom que prendra le fichier final.
C'est donc une simple chaîne de caractère.
Quel type d'extension manipules-tu ? Est-ce variable ?
Car pour insérer ton id il va falloir supprimer l'extension, placer ton id, puis remettre l'extension dans la chaîne de caractère $dest_fichier.

Re: photo dans BDD

Posté : 19 févr. 2011, 17:18
par moogli
salut,

pas besoin d'utiliser rename, tu change le nom dans le move_uploaded_file
exemple : move_uploaded_file($fichierTemporaire,'photo'.$id.'.'.$extension)

pour info
- foreach($extensions_ok as $text) { $extensions_string .= $text.', '; } => ça c'est un imlode

@+

Re: photo dans BDD

Posté : 21 févr. 2011, 15:55
par ezacal
merci à tous les 2
pour répondre à XTG, je ne gere que des jpg
l'explication de moogli m'a bien aidé : l'image s'appelle maintenant CNI.jpg
php modifié
  		
                        $id2=$_SESSION['id'];
			$extension='jpg';
        // copie du fichier si aucune erreur !
        if(!isset($erreurs) or empty($erreurs))
        {	
		

			$dest_fichier = "CNI$id2.$extension";
			
            // pour ne pas ecraser un fichier existant
            while(file_exists($dest_dossier . $dest_fichier)) {
                $dest_fichier = rand().$dest_fichier;
            }
            
            // copie du fichier

            if(move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier .'CNI'.$id2.'.'.$extension)) {
                $valid[] = "Image uploadée avec succés (<a href='".$dest_dossier . $dest_fichier."'>Voir</a>)";
            } else {
                $erreurs[] = "Impossible d'uploader le fichier.<br />Veuillez vérifier que le dossier ".$dest_dossier." existe avec un chmod 755 (ou 777).";
            }
        }
    }

mais l'id n'est pas inséré !

CNI.jpg et non CNI1060.jpg par exemple !

Re: photo dans BDD

Posté : 21 févr. 2011, 16:04
par xTG
Et est-ce que la variable de session id existe ?
Fais un var_dump() de cette variable.

Re: photo dans BDD

Posté : 21 févr. 2011, 18:13
par ezacal
en effet!
elle n'existe pas. pourtant quand je teste le post
pas de soucis, mais la variable n'est pas transférée!!!
var_dump($_SESSION['id']) ; = NULL

Re: photo dans BDD

Posté : 21 févr. 2011, 18:34
par xTG
Quel code utilises-tu pour la renseigner cette variable ?