PHP/Bdd : Remplir un tableau dynamiquement

Répondre
JuliuStation
le 05/05/2010 à 15:39
JuliuStation
Bonjour / Bonsoir
Dans le cadre d'un site "marchand", je souhaite faire un tableau qui se générerait dynamiquement lorsque quelqu'un uploaderait un nouveau produit (Une nouvelle ligne pour chaque nouveau produit). Mais quelques problèmes se posent à moi.

Tout d'abord, je souhaiterais que mon script renomme une image au moment où elle est uploadée. Voila le script qui receptionne le formulaire d'envoi :
<?php

$connexion = mysql_connect("localhost", "xx", "xx");
$selection_bd = mysql_select_db("xxxx", $connexion);


if(isset($_POST['nom'])) $nom = $_POST['nom']; else $nom="";
if(isset($_POST['appellation'])) $appellation = $_POST['appellation']; else $appellation="";
if(isset($_POST['millesime'])) $millesime = $_POST['millesime']; else $millesime="";
if(isset($_POST['description'])) $description = $_POST['description']; else $description="";
if(isset($_FILES['image'])) $image = $_FILES['image']['name'];

if (empty($_POST['nom']) ){
echo "Erreur : le nom n'a pas été donné.";
}else if (empty($_POST['appellation']) ){
echo "Erreur : l'appellation n'a pas été donnée.";
}else if (empty($_POST['millesime']) ){
echo "Erreur : le millésime de ce vin n'a pas été donné.";
}else if (empty($_POST['description']) ){
echo "Erreur : la description n'a pas été donnée.";
}else if(empty($_FILES['image']['tmp_name'])){
echo "Erreur : Aucune image n'a été choisie.";
}

$requete= "INSERT INTO catalogue_cdc VALUES (NULL, '$nom', '$appellation', '$millesime', '$description', '$image')";
//LANCEMENT DE LA REQUETE EN TEXTE
$resultat= mysql_query($requete);

if (is_uploaded_file($_FILES['image']['tmp_name'])) {

copy($_FILES['image']['tmp_name'], "./images/catalogue/" . $_FILES['image']['name']);
echo "L'envoi a été effectué.<br/> <a href='ajout_vin.php'>Effectuer un autre envoi</a>&nbsp;&nbsp;<a href='select.php'>Visionnez le catalogue du site</a>";
} else { echo "L'envoi a échoué <a href='ajout_vin.php'>Réessayer</a>";}
mysql_close($connexion);
?>

Je souhaiterais donc que les images soient renommées, comme par exemple "img01.jpg","img02.jpg","img03.jpg", etc. afin que je puisse les appeler par ailleurs en incrémentant dans une boucle for
Quelques suggestions ?
dark_nemo
le 05/05/2010 à 16:00
dark_nemo
Pourquoi tu fais un isset et un empty? empty teste l'existance et vérifie que la variable n'est pas vide.
En plus là si ton formulaire est soumis sans être complèté, tu vas avoir une ligne vide dans ta base de données.
3ème point et le plus important selon moi. Il n'y a aucune sécurisation des données. Aucun test, rien, nada.
Pour un site marchant ça fait peur :/
Image que je sois malhonnête et que je telecharge un script perso. Je fais un peu la loi sur ton site. Pour un site marchant faut passer par des pro ou être un pro.
Désolé d'être aussi direct mais là je pense à tes futurs clients
JuliuStation
le 05/05/2010 à 16:41
JuliuStation
Je préfère laisser le choix de laisser un champ libre, au cas où il manquerait des infos sur le produit, ce qui peut arriver.

Pour la sécurité, il s'agit d'un envoi uniquement en backoffice, ca ne sera que du côté propriétaire que l'envoie des fichiers se feront, donc ils n'auront aucun intérêt à attaquer leur propre site.
JuliuStation
le 05/05/2010 à 16:56
JuliuStation
Ah si, j'y pense.. Il faudrait faire une vérif par rapport à l'extension quand même, pour que ce soit toujours le même format image uploadé, histoire que je puisse aller les chercher après par une simple incrémentation en boucle.

Mais j'ai cru comprendre que $_FILES['type'] était peu fiable selon les navigateurs non ?
dark_nemo
le 05/05/2010 à 17:15
dark_nemo
Bon je vais essayer d'être constructif.
Même en backoffice il faut sécuriser. Il faut pas se dire que parce qu'un mot de passe protège le backoffice il est protégé. Un bon brute force et un peu de temps fait craquer les 3/4 des mots de passe.
De plus les 3/4 des fonctions php renvoient quelque chose. Et se quelque chose il faut le vérifier.
Par exemple dans ton script si la connexion n'est pas etablit il se passe quoi? Pas de message, rien.

Ensuite lors d'un téléchargement. Le minimum c'est de tester
Le formulaire à t'il été envoyé?
Le fichier à t'il été correctement envoyé?
La taille du fichier est tel correcte?
Le type mime du fichier est'il correct?
Le fichier à t'il été correctement déplacé?
ça c'est le minimum syndical.
En plus je crois comprendre que ton script est amené à être distribuer. Donc il faut avancer pas à pas. Avoir la doc sous les yeux et vérifier le plus possible. Il ne faut rien laisser passer.
Je sais que php est un langage permissif mais il faut se forcer à coder pro. Plus ton code est propre et bien structuré moins t'as de soucis.
JuliuStation
le 06/05/2010 à 12:26
JuliuStation
Ah d'accord, je crois avoir compris où je bloquais. En fait j'imaginais qu'un script d'envoi restait en sécurité à partir du moment où il n'était pas mis en ligne avec le reste du site.. Mais je suppose que comme l'envoi s'effectue en HTTP, il y a nécéssairement besoin de mettre les deux côtés (formulaire.php / envoi_bdd.php) tout deux en ligne pour que le protocole soit valide ? C'est peut être une question conne ^^'

Bref, voila un début de code pour sécuriser l'envoi :
//MEGA CONDITION DE CONTRÔLE DU FICHIER
//VERIF DU POIDS DU FICHIER <800ko (D'ABORD SUR LA MACHINE LOCALE -> 'name') ("filesize" plus sécurisé que $_FILES['size'])
if (filesize($_FILES['image']['name'])<800000){
echo "Le poids de l'image est supérieure à la limite autorisée (800Ko). Réduisez celle-ci.";}
// VERIF DU FORMAT DU FICHIER (.GIF OBLIGATOIRE)
else if(exif_imagetype($_FILES['image']['name']) != IMAGETYPE_GIF){
echo "Le type d'image n'est pas valide. Ce script ne tolère que le .gif";}
else if (is_uploaded_file($_FILES['image']['tmp_name'])== FALSE) {
echo "Il y a eut un problème lors de l'upload de l'image";}

//COPIE DU FICHIER TEMPORAIRE VERS DOSSIER (BDD) .
else {
copy($_FILES['image']['tmp_name'], "./images/catalogue/" . $_FILES['image']['name']);
echo "L'envoi a été effectué.<br/> <a href='ajout_vin.php'>Effectuer un autre envoi</a>&nbsp;&nbsp;<a href='select.php'>Visionnez le catalogue du site</a>";
} else { echo "L'envoi a échoué <a href='ajout_vin.php'>Réessayer</a>";}


Il semble y avoir encore quelques soucis. N'hésitez pas à me dire ce qui ne va pas.
dark_nemo
le 06/05/2010 à 22:23
dark_nemo
Bon déjà une définition 1Ko = 1024 Octets. Et oui nous sommes dans les puissances de 2 lorsqu'on parle des octets. Je vais pas entrer dans un cours mais c'est bon à savoir.
Donc 800Ko = 800 x 1024.

Ensuite si tu veux avoir une idée des choses à tester fait un
print_r($_FILE); Tu vas avoir un beau tableau associatif qui va ressembler à ça

Array
(
[image] => Array
(
[name] => monimage.gif
[type] => image/gif
[tmp_name] => totoenvacance.gif
[error] => 0
[size] => 1200
)
)
Là normalement tu devrais voir déjà les choses à corriger dans ton script. php fait déjà une partie du boulot donc autant utiliser le tableau qu'il te donne pour tes tests.
Ensuite comme tu bosses sur une image je t'invite à regarder la fonction getimagesize qui te donne pas mal d'info sur cette dernière. Taille, hauteur,largeur,type...
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours