Page 1 sur 1

Formulaire d'upload Texte + Image

Posté : 23 déc. 2008, 12:57
par ekzouille
Bonjour,
Je m'excuse d'avance pour la newbitude qui me caractérise mais je cherche et je cherche, je trouve mais il m'est tres difficile de combiner toutes les solutions.

J'aimerai faire un backoffice avec une page d'upload d'images et de leur descriptions.
J'ai le formulaire lambda pour les images (dans un dossier), mais je suis perdu quant à l'ajout de texte et la recuperation du chemin de l'image dans la base SQL

Voici le bout de code du formulaire d'upload

Code : Tout sélectionner

<form method="POST" action="upload1.php" enctype="multipart/form-data"> <!-- Limite à 10Mo --> <input type="hidden" name="MAX_FILE_SIZE" value="10000000"> Fichier pour la Rubrique 1 : <input type="file" name="avatar"> <input type="submit" name="envoyer" value="Envoyer le fichier"> </form>
et la page de traitement

Code : Tout sélectionner

<?php $dossier = '../1/'; $fichier = basename($_FILES['avatar']['name']); $taille_maxi = 10000000; $taille = filesize($_FILES['avatar']['tmp_name']); $extensions = array('.png', '.gif', '.jpg', '.jpeg'); $extension = strrchr($_FILES['avatar']['name'], '.'); if(!in_array($extension, $extensions)) { $erreur = 'Tu dois uploader un fichier de type png, gif, jpg, jpeg'; } if($taille>$taille_maxi) { $erreur = 'Le fichier est trop gros... (+ de 10mo)'; } if(!isset($erreur)) { $fichier = strtr($fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) { echo 'Bravo, ton upload s\'est effectué avec succès!<br>'; echo '<a href=filelist.php>Afficher/Supprimer les visuels</a><br>'; } else { echo 'Echec de l\'upload ! Essaye encore !'; } } else { echo $erreur; } ?>
Merci d'avance !![/code]

Posté : 23 déc. 2008, 13:11
par guilt92
Ou bloques tu exactement ?

Tu as déjà créé la base de donnée ?
Tu parviens à t'y connecter en php ?

Après pour l'ajout cela ne devrait pas etre un probleme, tu as les variables $dossier et $fichier que tu utilises dans ton move_uploaded_file() donc il suffira d'ajouter cette valeur dans ta base, avec une requete du genre
mysql_query("INSERT INTO mabase (id,url_fichier) VALUES ('',''.$dossier.$fichier.''') or die(mysql_error());
Pour ajouter du texte il suffira de compléter ce meme insert avec la valeur que tu veux ajouter, si elle vient du formulaire tu pourras le faire avec une variable mysql_real_escape_string($_POST["description_du_fichier"]) ...

Le code que tu nous montre ne semble pas présenter de probleme donc c'est difficile de t'aider si tu n es pas plus précis quant à ce que tu as déjà et ce que tu veux faire ;)

Posté : 23 déc. 2008, 15:54
par ekzouille
En fait, j'aimerai avoir un formulaire avec un input pour les images, uploadés dans un dossier et un autre input pour y rentrer du texte, qui s'écrit dans ma table

alors j'ai mis un

Code : Tout sélectionner

<input type="text" name="txt">
dans mon formulaire et un

Code : Tout sélectionner

$text = $_GET['txt'];
dans ma page de traitement (avec les prerequis de connection a la base avant mon script)

me suffit-il de rajouter

Code : Tout sélectionner

mysql_query("INSERT INTO mabase (id,url_fichier,text) VALUES ('',''.$dossier.$fichier.$txt''') or die(mysql_error());
apres

Code : Tout sélectionner

if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier))
ou je suis completement a coté de la plaque :oops: ?

(encore merci pour ta rapidité et ton aide)

Posté : 23 déc. 2008, 16:42
par guilt92
Oui c'est à peu près ça à quelques exceptions près...

La première c'est de faire plutot un $_POST et un $_GET car dans ton formulaire tu as spécifé la méthode POST ;)

Aussi, et plus important, tu vas insérer dans ta base des données saisies par l'utilisateur. Il faut donc te prémunir contre des attaques par injection SQL (tu peux te renseigner sur google).

Pour cela le "minimum" est d'utiliser la fonction mysql_real_escape_string() qui empéchera d'avoir des instructions SQL.

Donc ca donnerait quelque chose du genre :
$text = mysql_real_escape_string($_POST['txt']);
Ensuite pour l'insertion c'est aussi presque ca, je pense que tu as un probleme de ' et tu as oublié une , pour séparer les éléments. Il faut encadrer les valeurs text par des ' ' et concaténer ta requete avec des " à chaque fois.
mysql_query("INSERT INTO mabase (id,url_fichier,text) VALUES ('','".$dossier.$fichier."','".$txt."'") or die(mysql_error());
Pour l'emplacement oui c'est cela :)

Par contre au préalable il faudra effectuer un mysql_connect() avec les parametres qui vont bien si ce n'est pas déjà fait...

Posté : 23 déc. 2008, 17:41
par ekzouille
Merci pour l'explication détaillée, je comprend de mieux en mieux,
malgré tout, j'ai appliqué les changements, bidouillé comme j'ai pu mais je me retrouvre toujours avec l'erreur
Erreur de syntaxe pr�s de '' � la ligne 1
voici mon code, mais je crois que j'ai pas bien capté le systeme POST & GET

Code : Tout sélectionner

<?php include('connectsql.php');?> <?php $dossier = '../1/'; $fichier = basename($_FILES['avatar']['name']); $text = mysql_real_escape_string($_POST['txt']); $taille_maxi = 10000000; $taille = filesize($_FILES['avatar']['tmp_name']); $extensions = array('.png', '.gif', '.jpg', '.jpeg'); $extension = strrchr($_FILES['avatar']['name'], '.'); if(!in_array($extension, $extensions)) { $erreur = 'Tu dois uploader un fichier de type png, gif, jpg, jpeg'; } if($taille>$taille_maxi) { $erreur = 'Le fichier est trop gros... (+ de 10mo)'; } if(!isset($erreur)) { $fichier = strtr($fichier, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) { echo 'Bravo, ton upload s\'est effectué avec succès!<br>'; echo '<a href=filelist.php>Afficher/Supprimer les visuels</a><br>'; } else { echo 'Echec de l\'upload ! Essaye encore !'; } } else { echo $erreur; } mysql_query("INSERT INTO upload (id,cat,text) VALUES ('','".$dossier.$fichier."','".$text."'") or die(mysql_error()); ?>
la valeur dans le input du formulaire est "text"

Posté : 23 déc. 2008, 18:02
par guilt92
L'erreur à l'air d'être au tout début (ligne1) peut etre dans ton fichier connectsql.php

Peut tu en poster le contenu ? (en remplacant mot de passe et tout par des * si t es pas en local)

Aussi pour l'insertion en base tu pourrais la faire dans le if(move_uploaded_file(...)) comme ca tu es sur que le fichier a été bien uploadé.

Posté : 23 déc. 2008, 18:13
par ekzouille
Voici le haut de ma page

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Document sans titre</title> <style type="text/css"> <!-- body,td,th { color: #FFFFFF; } body { background-color: #000000; margin-top: 60px; } --> </style></head> <body> <div align="center"> <?php include('connectsql.php');?> <?php $dossier = '../1/'; $fichier = basename($_FILES['avatar']['name']); $text = mysql_real_escape_string($_POST['txt']);
et ce qu'il y a dans mon connectsql.php

Code : Tout sélectionner

<?php $dbhost = "localhost"; $usebdd = "toto"; $user= "root"; $password= ""; $connexion = mysql_connect ("$dbhost","$user","$password"); if (!$connexion) { echo "Impossible d'effectuer la connexion"; exit; } $db = mysql_select_db("$usebdd", $connexion); if (!$db) { echo "Impossible de sélectionner cette base données"; exit; } ?>
Ce que je trouve bizarre est que le message apparait a la fin de la page, apres qu'il m'annonce que le fichier a bien été uploadé

Et quand tu parles de l'integrer a (move_upload...) , tu veux dire comme ca :

Code : Tout sélectionner

if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier) mysql_query("INSERT INTO upload (id,cat,text) VALUES ('','".$dossier.$fichier."','".$text."'") or die(mysql_error()); )

Posté : 23 déc. 2008, 18:24
par guilt92
En fait je te dis de le mettre dans la boucle :
     if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) 
     { 
        echo 'Bravo, ton upload s\'est effectué avec succès!<br>'; 
        echo '<a href=filelist.php>Afficher/Supprimer les visuels</a><br>'; 
        mysql_query("INSERT INTO mabase (id,url_fichier,text) VALUES ('','".$dossier.$fichier."','".$txt."'") or die("Erreur SQL :".mysql_error());
     } 
Ton champ id dans la base est bien en auto increment ?
Fais un
echo "INSERT INTO mabase (id,url_fichier,text) VALUES ('','".$dossier.$fichier."','".$txt."'"
pour que l'on puisse voir la requete aussi et poste ce que ca affiche pliz


EDIT
J'ai trouvé je pense :)

Il manque une ) dans le mysql_query

Correction :
mysql_query("INSERT INTO mabase (id,url_fichier,text) VALUES ('','".$dossier.$fichier."','".$txt."')") or die("Erreur SQL :".mysql_error());

Posté : 23 déc. 2008, 18:52
par ekzouille
Ca s'complique! hehe

J'ai donc fait les modif' comme ceci :

Code : Tout sélectionner

if(move_uploaded_file($_FILES['avatar']['tmp_name'], $dossier . $fichier)) { echo 'Bravo, ton upload s\'est effectué avec succès!<br>'; echo '<a href=filelist.php>Afficher/Supprimer les visuels</a><br>'; mysql_query("INSERT INTO upload (id,cat,text) VALUES ('','".$dossier.$fichier."','".$text."')") or die("Erreur SQL :".mysql_error()); echo "INSERT INTO upload (id,cat,text) VALUES ('','".$dossier.$fichier."','".$text."'";
et il me balance
Bravo, ton upload s'est effectué avec succès!
Afficher/Supprimer les visuels
INSERT INTO upload (id,cat,text) VALUES ('','../1/broker1hib.jpg','dqzdq'
j'ai essayé en mettant des parentheses et des apostrophes comme j'ai pu mais il m'affichait une erreur a chaque fois

Sinon, j'ai regardé dans la base, il enregistre bel et bien le texte (tres content, merci beaucoup au passage :D ) mais j'n'ai pas mis d'auto-increment pour ID et il ne veut pas le faire a present, il me retourne :
requête SQL:

Code : Tout sélectionner

ALTER TABLE `upload` CHANGE `id` `id` VARCHAR( 1 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL AUTO_INCREMENT MySQL a répondu:Documentation #1063 - Mauvais paramètre de champ pour le champ 'id'
J'ai essayé de changer la valeur (je me suis trompé au debut) mais rien a faire, toujours une erreur en retour

Posté : 24 déc. 2008, 10:47
par guilt92
Ok je pense que l'on avance.

La requete est correcte maintenant, tu n'as plus d'erreur SQL.

Tu peux donc enlever le echo en dessous du mysql_query().

Sinon pour ta table le probleme est que ton id est en varchar(1) (donc 1 caractere).

Il faut que cela soit un entier pour que l auto increment fonctionne... D autant que avec 1 seul caractere tu ne pourras pas avoir plus de 10 enregistrements (de 0 à 9...) :(

Posté : 24 déc. 2008, 14:07
par ekzouille
C'est génial, j'me suis meme permis d'ajouter un menu deroulant dans le formulaire.

J'voudrais vraiment pas abuser de ta gentillesse mais tu t'en doutes, j'ai pas fini mon script et maintenant un probleme de taille se pose devant moi!

Je peine deja a l'enoncer. J'aimerai extraire les infos de la table pour en faire un menu, j'ai fait ca

Code : Tout sélectionner

<?php $menu=mysql_query("SELECT title FROM upload WHERE cat='cat3'"); echo $menu; ?>
il m'affiche "Resource id #5 " , rien a voir avec ce que j'ai rentré dans ma table
J'commence a rentré dans des choses que j'maitrise pas vraiment :cry:

Posté : 24 déc. 2008, 15:36
par guilt92
Cool c'est bien déjà si ca marche pour la premiere partie !

Pour extraire les données d'une base cela ne se passe pas exactement comme tu le fais, je te conseille de suivre par exemple le tutorial de phpfrance
http://www.phpfrance.com/tutoriaux/inde ... l-avec-php

En gros il va te falloir faire un
while(mysql_fetch_assoc($menu)) {} 
pour pouvoir exploiter tes résultats...

La fonction mysql_fetch_assoc() permet de placer le pointeur sur le premier resultat de ta requete et renvoie un tableau avec les données sélectionnées, le while permet ensuite de se déplacer dans les différents résultats de ta requete...

Suis le tuto et renseigne toi sur cette fonction si tu veux en savoir davantage ;)

Posté : 24 déc. 2008, 15:47
par ekzouille
Merci infiniment, je vais regarder tout ca et je te tiens au courant :) !

edit: euh.. rapidement. Tu sais d'ou vient ce "Resource id #5" ?

J'ai mis :

Code : Tout sélectionner

<?php $sql = "SELECT title FROM upload WHERE title = 1"; $result = mysql_query($sql); echo $result ?>
et il me retourne toujours la meme chose, pas d'erreur, juste "Resource id #5" :roll:

Posté : 27 déc. 2008, 11:40
par luc@s
bah lis le message de guilt92 :

mysql_query retourne une ressource SQL, et pas les données sélectionnées par la requête.
Tu dois utiliser les fonctions mysql_fetch_* (voir la doc) pour exploiter cette ressource ;)