photo dans BDD

Eléphanteau du PHP | 40 Messages

16 févr. 2011, 19:11

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

ViPHP
xTG
ViPHP | 7331 Messages

16 févr. 2011, 19:43

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 ?

Eléphanteau du PHP | 40 Messages

17 févr. 2011, 14:35

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

ViPHP
xTG
ViPHP | 7331 Messages

17 févr. 2011, 14:50

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 !)

Eléphanteau du PHP | 40 Messages

17 févr. 2011, 17:29

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é!

Eléphanteau du PHP | 40 Messages

17 févr. 2011, 18:59

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

Eléphanteau du PHP | 40 Messages

17 févr. 2011, 19:24

je chauffe !
fonction rename (dur d'être débutant :oops: :oops: )

ViPHP
xTG
ViPHP | 7331 Messages

17 févr. 2011, 20:33

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. ^^'

Eléphanteau du PHP | 40 Messages

19 févr. 2011, 16:40

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

ViPHP
xTG
ViPHP | 7331 Messages

19 févr. 2011, 17:13

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.

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

19 févr. 2011, 17:18

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

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

Eléphanteau du PHP | 40 Messages

21 févr. 2011, 15:55

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 !

ViPHP
xTG
ViPHP | 7331 Messages

21 févr. 2011, 16:04

Et est-ce que la variable de session id existe ?
Fais un var_dump() de cette variable.

Eléphanteau du PHP | 40 Messages

21 févr. 2011, 18:13

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

ViPHP
xTG
ViPHP | 7331 Messages

21 févr. 2011, 18:34

Quel code utilises-tu pour la renseigner cette variable ?