réalisation d'une galerie - probleme upload

Petit nouveau ! | 5 Messages

25 juil. 2012, 12:44

Salut, je suis débutant et
Je voudrais réaliser une galerie en php.
J’essaie de comprendre et d’utiliser des fonctions php nécessaires pour écrire/lire des chemins d'images dans une bdd,
J'ai une bdd avec une table à 4 champs, id, nom, note, photo.
un fichier de connection php, un fichier config.php, un fichier insert_form.php et un formulaire
mais lorsque j’utilise l’ensemble de fichiers pour uploader et mettre à jour la bdd,
le champ « chemin de l’image » est bon, mais j’ai pas l’image uploadée dans le dossier,( les images doivent être dans un sous dossier).


voila le fichier insert_form.php:

Code : Tout sélectionner

<?php include "config.php"; include "database.fn.php"; $link = database_connect($db); // ***** ici on récupère les données et on les stocke dans mysql $nom = $_POST['nom']; $note = $_POST['note']; //******* On renomme l'image de manière aléatoire pour éviter un conflit dans le dossier (2 fois le même nom par exemple $dir = 'images/'; $ext = strtolower( pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION) ); $contenu=strip_tags($ext); // pour nettoyer le contenu du fichier des éventuelles balises HTML ou PHP $fichier=uniqid('',false).'.'.$contenu; //**** on bouge l'image $fichier="images/".$_FILES['image']['name']; if (is_uploaded_file($_FILES['image']['name'])){ if (!move_uploaded_file($_FILES['image']['tmp_name'],$fichier)){ echo "Problème: impossible de déplacer le fichier"; exit; } else { echo "Problème : Attaque possible par le fichier ".$_FILES['image']['name']; exit; } } move_uploaded_file($_FILES['image']['tmp_name'], $dir.$fichier); $photo = $fichier; // on enregistre les données $result = mysql_query("INSERT INTO poster VALUES ( '', '".mysql_real_escape_string($nom)."', '".mysql_real_escape_string($note)."', '".mysql_real_escape_string($photo)."' ) "); //Si il y a une erreur, on crie ^^ if (!$result) { die('Requête invalide : ' . mysql_error()); } // on ferme la connection mysql donc ci-dessous plus de sql mysql_close($link); ?>
au final j'ai une entrée dans la base avec le chemin, le nom mais pas de fichier image dans le dossier de destination.
Si quelqu'un à une idée cela m'aiderait grandement.
merci
Modifié en dernier par lamerehic le 25 juil. 2012, 15:25, modifié 1 fois.

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

25 juil. 2012, 13:14

salut,

Pourquoi as tu deux move_uploded_file ?

le premier ne te suffit pas ?
rajout lui le nom du répertoire dans le chemin (en fait le second semble correct pas le premier).

Est ce que ton niveau d'erreur est à E_ALL (tupeux le voir dans un phpinfo()) c'est très important pour le développement.

vire l'utilisation de la fonction exit(). ce n'est pas une bonne pratique s'il y a une erreur elle doit être affichée mais mettre en vrac la mise en page du site, et ne pas laisser à l'internaute la possibilité de continuer sa navigation ;) )


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

Petit nouveau ! | 5 Messages

25 juil. 2012, 15:20

Salut,
j'ai enlevé le second move_uploded_file
dans mon php info (sous xamp) je suis en PHP Version 5.3.8
display_errors On On etc mais je ne vois pas de E_ALL
et j'ai viré le exit

Code : Tout sélectionner

<?php include "config.php"; include "database.fn.php"; $link = database_connect($db); // ***** ici on récupère les données et on les stocke dans mysql $nom = $_POST['nom']; $note = $_POST['note']; //******* On renomme l'image de manière aléatoire pour éviter un conflit dans le dossier (2 fois le même nom par exemple $dir = 'images/'; $ext = strtolower( pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION) ); $contenu=strip_tags($ext); // pour nettoyer le contenu du fichier des éventuelles balises HTML ou PHP $fichier="images/".uniqid('',false).'.'.$contenu; //**** on bouge l'image move_uploaded_file($_FILES['image']['tmp_name'], $dir.$fichier); $photo = $fichier; // on enregistre les données $result = mysql_query("INSERT INTO poster VALUES ( '', '".mysql_real_escape_string($nom)."', '".mysql_real_escape_string($note)."', '".mysql_real_escape_string($photo)."' ) "); //Si il y a une erreur, on crie ^^ if (!$result) { die('Requête invalide : ' . mysql_error()); } // on ferme la connection mysql donc ci-dessous plus de sql mysql_close($link); ?>
J'ai bien le chemin mais le fichier n'est pas déplacé...
Je ne sais pas s'il est uploadé quelque part non plus.

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

27 juil. 2012, 08:57

plutot garder ce bout de code :)
<?php
$fichier="images/".$_FILES['image']['name'];
if (is_uploaded_file($_FILES['image']['name'])){
   if (!move_uploaded_file($_FILES['image']['tmp_name'],$fichier)){
      echo "Problème: impossible de déplacer le fichier"; exit;
   } else {
      echo "Problème : Attaque possible par le fichier ".$_FILES['image']['name']; exit;
  }
}
vu que $fichier="images/".$_FILES['image']['name']; ton fichier sera dans un répertoire images enfant du répertorie courant (donc soit enfant de celui où ce trouve ce script soit enfant du répertoire qui contient le script appelant celui ci :)

bon la tu écrase le nom de fichier unique fait juste au dessus mais c'est fonctionnel ;)
par contre toi tu ajoute $dir, sachant que $fichier contient deja 'images/' tu va avoir images/images/nomdfichier.ext :)
donc enlève $fichier="images/".$_FILES['image']['name']; qui ne sert à rien, etre supprime la variable $dir.

+

pour le E_ALL cherche error_reporting :)
Il en faut peu pour être heureux ......

Petit nouveau ! | 5 Messages

28 juil. 2012, 15:41

merci pour ta réponse,
j'ai fini par réussir l'upload, je crée des thumbnails ensuite et je les stocke dans des dossiers.
Maintenant je veux faire une entrée dans la base.
avec l'id le nom, le titre, etc...
j'ai réécrit le code, j'ai bien l'upload mais j'ai pas d'entrée dans la base.

Code : Tout sélectionner

<?php include "config.php"; include "database.fn.php"; // ***** ici on récupère les données et on les stocke dans mysql $nom = $_POST['nom']; $note = $_POST['note']; //******* On renomme l'image de manière aléatoire pour éviter un conflit dans le dossier (2 fois le même nom par exemple include 'functions.php'; $allowed_ext = "jpg, gif, png, jpeg, JPG"; $top = 50; $filename = $_FILES['image']['name']; // Is the extension allowed? $extension = checkext($filename, $allowed_ext); if ($extension != False) { // Move the temporary file to the image folder $save_to="temp/"; if ($_POST['send_upload']==1) { $file_name=$_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], $save_to.basename($file_name)) or die('Cannot upload image'); $filepath = $save_to.basename($file_name); } // Create an image resource from the uploaded image if($extension == "jpg" || $extension == "jpeg" || $extension == "JPG"){ $source=imagecreatefromjpeg($filepath); }elseif($extension == "png") { $source=imagecreatefrompng($filepath); }elseif($extension == "gif") { $source=imagecreatefromgif($filepath); } // Resize the image resource $width_orig = imagesx( $source ); // width of image resource $height_orig = imagesy( $source ); // height of image resource $uploadedimage = $source; // Create space for the resized image //Save the resized image if($extension == "jpg" || $extension == "jpeg" || $extension == "JPG"){ imagejpeg($uploadedimage, $filepath, 100); }elseif($extension == "png") { imagepng($uploadedimage, $filepath); }elseif($extension == "gif") { imagegif($uploadedimage, $filepath); } //Print and clean stuff $im =imagejpeg($uploadedimage, "images/genuine/" . $filename ); //imagedestroy($im); imagedestroy($uploadedimage); // imagedestroy($source); } $im = imagecreatefromjpeg('images/genuine/'.$filename); // thumbnail list($width, $height) = getimagesize('images/genuine/'.$filename); $new_width = 150; $new_height = round((150/$width)*$height); // Redimensionnement $image_p = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($image_p, $im, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagejpeg($image_p, 'images/thumbs/'.md5($filename).'-thumb.jpg', 70); imagedestroy($im); imagedestroy($image_p); $link = database_connect($db); $sql = "SELECT * FROM poster WHERE `md5`='".addslashes(md5($filename))."'"; $result = mysql_query($sql, $link) or die('Erreur MySQL'); if (mysql_num_rows($result)==1) return md5($filename); $ip = $_SERVER["REMOTE_ADDR"]; $photo = "../images/genuine/" . $filename; $md5 = ".addslashes(md5($filename))."; $model = ''; $title = ".addslashes($filename)."; $today = date("F j, Y, g:i a"); $loc = ".addslashes($ip)."; $warnings = 0; $candidate = 0; $accepted = 0; $date_accepted = 0; // echo $title,"</br>", $photo,"</br>", $md5, $loc, $today; // on enregistre les données $result = "INSERT INTO poster (id,nom, note, photo, md5, model, title, date, ip, warning, candidate, accepted, date_accepted) VALUES ( '', '".mysql_real_escape_string($nom)."', '".mysql_real_escape_string($note)."', '".mysql_real_escape_string($photo)."', '".mysql_real_escape_string($md5)."', '".mysql_real_escape_string($model)."', '".mysql_real_escape_string($title)."', '".mysql_real_escape_string($today)."', '".mysql_real_escape_string($loc)."', '".mysql_real_escape_string($warnings)."', '".mysql_real_escape_string($candidate)."', '".mysql_real_escape_string($accepted)."', '".mysql_real_escape_string($date_accepted)."', ) "; mysql_query($result); //Si il y a une erreur, on crie ^^ if (!$result) { die('Requête invalide : ' . mysql_error()); echo"$result"; } // on ferme la connection mysql donc ci-dessous plus de sql mysql_close($link); ?>

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

28 juil. 2012, 20:23

Salut,

Pour commencer il faut que tu mette la création de miniature et l'insertion en base dans un if conditionné par le résultat de move_uploaded_file.
En clair
<?php
If(move_uploaded_file(lefichiertemporaire, lefichierfinal) === true) {
// miniature
// insertion. 
}
?>
Sinon ton code de miniature ou d'insertion (voir les deux) est exécuté même si l'upload à foiré, ce qui n'est pas bon du tout ;)


Ensuite le addslashes sert à rien, le mysql_real_escape_string() est suffisant.

Je te conseil de tester ta requête en dehors afin d'etre sur que cela fonctionne sans être mélangé avec le reste.

Utilise var_dump() pour afficher les variables et voir ce qui se passe.

Tu peux aussi utiliser xdebug et un IDE comme éclipse / netbeans etc, ça te permet de debuger plus facilement :)


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

Petit nouveau ! | 5 Messages

31 juil. 2012, 11:41

Merci pour les lumières...
j'avance progressivement:
J'ai repris mon code, inséré un if, mais j'ai toujours pas d'insert dans la base...
J'arrive pas a voir pourquoi,

Code : Tout sélectionner

$poids = getimagesize('images/genuine/'.$filename); if($poids !=0) { // on enregistre les données $sql = "INSERT INTO poster (nom, note, photo, md5, model, title, date, ip, warning, candidate, accepted, date_accepted) VALUES ( '".mysql_real_escape_string($nom)."', '".mysql_real_escape_string($note)."', '".mysql_real_escape_string($photo)."', '".mysql_real_escape_string($md5)."', '".mysql_real_escape_string($model)."', '".mysql_real_escape_string($title)."', '".mysql_real_escape_string($today)."', '".mysql_real_escape_string($loc)."', '".mysql_real_escape_string($warnings)."', '".mysql_real_escape_string($candidate)."', '".mysql_real_escape_string($accepted)."', '".mysql_real_escape_string($date_accepted)."', ) "; mysql_query($sql); //Si il y a une erreur, on crie ^^ if (!$sql) { die('Requête invalide : ' . mysql_error()); echo"$sql"; } // on ferme la connection mysql donc ci-dessous plus de sql mysql_close($connect); }; var_dump($sql);



j'ai bien le contenu de la requete qui est la mais il n'est pas inséré dans la base:

Code : Tout sélectionner

var_dump($sql): string(305) "INSERT INTO poster (nom, note, photo, md5, model, title, date, ip, warning, candidate, accepted, date_accepted) VALUES ( 'phot', '5', '../images/genuine/IMG_5807.jpg', '7fda55f20e25f3067260b448cc21617f', '', 'IMG_5807.jpg.', 'July 31, 2012, 9:01 am', '127.0.0.1', '0', '0', '0', '0', ) "

Petit nouveau ! | 5 Messages

09 août 2012, 00:28

J'ai trouvé une des erreurs, c'était la virgule en trop dans les requetes....