Page 1 sur 1

INSERT INTO et le formulaire type="file"

Posté : 14 juin 2008, 16:17
par abdellah63
Bonjour,

J'aimerai intégrer un formulaire <input type="file" name="image">
dans mon script pour parcourir une image sur mon pc et
l'uploader dans un répertoire précis ensuite inscrire
sont nom avec l'extension ("maphoto.gif")par exemple dans ma bdd.

j'arrive très bien a insérer des données texte dans
ma bdd grâce a ce script
<?php
if (isset($_POST['titre']) AND isset($_POST['image']) AND isset($_POST['lien']))
{
    if ($_POST['titre'] != NULL AND $_POST['image'] != NULL AND $_POST['lien'] != NULL)
    {
        mysql_connect("localhost", "root", "");
        mysql_select_db("projet");
 
        $titre = mysql_real_escape_string(htmlspecialchars($_POST['titre']));
        $image = mysql_real_escape_string(htmlspecialchars($_POST['image']));
		$lien = mysql_real_escape_string(htmlspecialchars($_POST['lien']));
 
        mysql_query("INSERT INTO albums VALUES('', '$titre', '$image', '$lien', '".time()."')");
 
        mysql_close();
    }
}
?>
 
avec les formulaires type "text"

Code : Tout sélectionner

<form action="form.php" method="post"> <p> Titre : <input type="text" name="titre" /><br /> Image : <input type="text" name="image" /><br /> <!-- c'est celui la que j'aimerai transformer en type="file" au lieu de taper maphoto.gif dans le formulaire j'irai la parcourir depuis mon pc --> Lien : <input type="text" name="lien" /><br /> <input type="submit" value="Envoyer" /> </p> </form>
j'espère que je me suis fait comprendre et merci d'avance.

Posté : 14 juin 2008, 16:20
par dunbar
Salut

Il suffit de remplacer
type:"text"
par
type="file"

Posté : 14 juin 2008, 16:28
par abdellah63
Salut

Il suffit de remplacer
type:"text"
par
type="file"

j'aurai aimé que sa soit aussi facile :D mais j'ai déjà testé ça !
enfaite on ma dit que mon form doit avoir enctype="multipart/form-data" mais c'est coté php que ça coince. quand je remplace type:"text" par type:"file" aucune entrée ni ajouté a ma bdd :cry:

Posté : 14 juin 2008, 16:33
par dunbar

Posté : 14 juin 2008, 18:27
par iclo
Et un petit conseil: surtout travailler en décomposant: on met en place l'upload de fichier, on le teste, et une fois que ça fonctionne, on s'occupe du lien avec la base de donnée. Inutile de se tapper toutes les difficultés en une fois, bonne chance ;)

Posté : 14 juin 2008, 18:35
par abdellah63
Et un petit conseil: surtout travailler en décomposant: on met en place l'upload de fichier, on le teste, et une fois que ça fonctionne, on s'occupe du lien avec la base de donnée. Inutile de se tapper toutes les difficultés en une fois, bonne chance ;)
Salut,
c'est bien ça qui me complique les choses en fait j'arrive très bien à uploader avec le script donné par dunbar mais pour inscrire ce que je viens d'uploader dans le champ "image" de ma table je ne sais pas le faire :( .
par exemple je viens d'uploader "joliephoto.jpg" dans le répertoire images comment faire pour que "joliephoto.jpg" soit inscrite dans le champ image?


Edit: c'est bon j'ai trouvé et tout seule :-*
<?php
if (isset($_POST['titre']) AND isset($_POST['lien']) AND isset($_FILES['image']))
{
    if ($_POST['titre'] != NULL AND $_POST['lien'] != NULL AND $_FILES['image'] != NULL)
    {
	
        mysql_connect("localhost", "root", "");
        mysql_select_db("projet");
 
        $titre = mysql_real_escape_string(htmlspecialchars($_POST['titre']));
		$lien = mysql_real_escape_string(htmlspecialchars($_POST['lien']));
		$image = ($_FILES['image']['name']);
 
        mysql_query("INSERT INTO albums VALUES('', '$titre', '$lien', '$image', '".time()."')");
 
        mysql_close();
    }
}
?>
<?php
// Testons si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['image']) AND $_FILES['image']['error'] == 0)
{
        // Testons si le fichier n'est pas trop gros
        if ($_FILES['image']['size'] <= 1000000)
        {
                // Testons si l'extension est autorisée
                $infosfichier = pathinfo($_FILES['image']['name']);
                $extension_upload = $infosfichier['extension'];
                $extensions_autorisees = array('jpg', 'jpeg', 'gif', 'png');
                if (in_array($extension_upload, $extensions_autorisees))
                {
                        // On peut valider le fichier et le stocker définitivement
                        move_uploaded_file($_FILES['image']['tmp_name'], 'images/' . basename($_FILES['image']['name']));
                        echo "L'envoi a bien été effectué !";
                }
        }
}
?>

Posté : 14 juin 2008, 22:53
par iclo
Bien à joué, c'est souvent en trouvant soit même qu'on apprend le plus...

Posté : 15 juin 2008, 12:14
par Ryle
Modération :
abdellah63, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

Posté : 15 juin 2008, 16:37
par abdellah63
Bonjour,

je ne vais pas vous laisser comme ça :lol: j'ai encore un problème:

j'ai ajouter la fonction date("his") histoire de ne pas écraser les images du même nom ce qui donne un truc genre 043020maphoto.jpg au lieu de maphoto.jpg. le problème c'est que ma BDD ne récupère pas 043020maphoto.jpg mais plutôt maphoto.jpg une fois que le formulaire est envoyé.
<?php
// Si les variables existent
if (isset($_POST['titre']) AND isset($_POST['lien']) AND isset($_FILES['image']))
{
    // Si on a quelque chose à enregistrer
    if ($_POST['titre'] != NULL AND $_POST['lien'] != NULL AND $_FILES['image'] != NULL)
    {  
	    // D'abord, on se connecte à MySQL
        mysql_connect("localhost", "root", "");
        mysql_select_db("projet");
    // On utilise les fonctions PHP mysql_real_escape_string et htmlspecialchars pour la sécurité
        $titre = mysql_real_escape_string(htmlspecialchars($_POST['titre']));
		$lien = mysql_real_escape_string(htmlspecialchars($_POST['lien']));
		$image = ($_FILES['image']['name']);
        // Ensuite on enregistre le message
        mysql_query("INSERT INTO albums VALUES('', '$titre', '$lien', '$image', '".time()."')");
        // On se déconnecte de MySQL
        mysql_close();
    }
}
?>
<?php
$dossier = '../images/';
$fichier = basename($_FILES['image']['name']);
$taille_maxi = 100000;
$taille = filesize($_FILES['image']['tmp_name']);
$extensions = array('.png', '.gif', '.jpg', '.jpeg');
$extension = strrchr($_FILES['image']['name'], '.'); 
//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg, txt ou doc...';
}
if($taille>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $fichier = strtr($fichier, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $fichier = preg_replace('/([^.a-z0-9]+)/i', '-', $fichier);
     if(move_uploaded_file($_FILES['image']['tmp_name'], $dossier . date("his") . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
     {
          echo 'Upload effectué avec succès !';
     }
     else //Sinon (la fonction renvoie FALSE).
     {
          echo 'Echec de l\'upload !';
     }
}
else
{
     echo $erreur;
}
?>

Code : Tout sélectionner

<form id="formulaires" action="upload.php" method="post" enctype="multipart/form-data"> <fieldset> <legend>Informations personnelles</legend> <p> <label for="form_titre"><strong>Titre : </strong></label> <input type="text" name="titre" /> </p> <p> <label for="form_lien"><strong>Lien : </strong></label> <input type="text" name="lien" /> </p> <p> <label for="form_image"><strong>Image : </strong></label> <input type="file" name="image" /> </p> <p> <input id="envoyer" type="submit" value="Envoyer" /> </fieldset> </p> </form>
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Posté : 15 juin 2008, 17:19
par Ryle
Ta base de données ne récupère que ce que tu lui envois. Si tu donnes à ta base le nom du fichier et qu'ensuite tu le renommes quand tu l'enregistres sur le serveur, il parait logique que les deux noms diffèrent... ;)

Posté : 15 juin 2008, 17:25
par abdellah63
Ta base de données ne récupère que ce que tu lui envois. Si tu donnes à ta base le nom du fichier et qu'ensuite tu le renommes quand tu l'enregistres sur le serveur, il parait logique que les deux noms diffèrent... ;)
mais comment faire alors pour renommer le fichier avant de l'envoyé a la bdd?


Edit: c'est bon j'ai trouvé
$image = date("his").($_FILES['image']['name']);
:wink:

Posté : 15 juin 2008, 17:51
par Ryle
Tout simplement ;)

Par contre assure-toi que tu utilises bien cette variable pour ta base de données ET pour renommer ton fichier. En effet, si tu fais deux fois appel à date("his") (une fois pour la base et une fois pour le fichier) il est possible qu'entre les deux appels, l'heure ait changé et tu te retrouverais de nouveaux avec deux noms différents (à une seconde près)