IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Problème d'insertion d'image en base [Fait] [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut Problème d'insertion d'image en base
    Bonjour à tous !!!

    J'en apelle à le sagesse du forum pour me sortir d'une impasse...

    Je suis actuellement en train de construire un système de catalogue de produits pour le compte d'une société qui désire les vendre en ligne.

    Chaqun des produits possède une identité en base de données (MySQL) comprenant plusieurs attributs (un nom, des dimensions, un prix, une illustration et 5 caractéristiques complémentaires - carac1, carac2, carac3, carac4 et carac5)

    en train de plancher sur un système d'upload d'illustration de produit, ma requete d'insertion refuse de s'exécuter pour des raisons que je ne comprend pas...

    Voici un résumé de mon code pour que vous compreniez mieux.
    PS: il s'agit pour l'instant que d'une "maquette" qui ne comprote pour l'instant aucun aspect "sécuritaire".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    // un formulaire de saisie avec possibilité d'upload
    ...
    // un script PHP de vérification de l'intégrité des données saisies
    ..
    // un script d'insertion en base de données
    <?php
    mysql_connect("localhost", "root", "") or die ("impossible de se connecter à MySQL");			
    mysql_select_db("propiscine") or die ("impossible de se connecter à la base de données");
     
    // Récupération des variables
    $reference = $_POST['ajout_reference'];
    $dimension = $_POST['ajout_dimension'];
    $prix = $_POST['ajout_prix'];
    $image = file_get_contents ($_FILES['photo']['tmp_name']);
    $carac1 = $_POST['ajout_carac1'];
    $carac2 = $_POST['ajout_carac2'];
    $carac3 = $_POST['ajout_carac3'];
    $carac4 = $_POST['ajout_carac4'];
    $carac5 = $_POST['ajout_carac5'];
     
    //echo $image;
     
     
    // Insertion en base de données
    $requete = mysql_query("insert into baignoires_balneo (id, nom, dimension, prix, photo, autre1, autre2, autre3, autre4, autre5) values ('','$reference','$dimension','$prix',addslashes($image),'$carac1','$carac2','$carac3','$carac4','$carac5')") or die ("requête d'ajout incorrecte");
     
    ?>
    Mon problème: imossible d'insérer le parametre $image en base. Ma requete ne fonctionne pas (renvoi du message d'erreur) bien que l'echo de l'image me revoie l'image en question.

    Pour info, j'utilise easyPHP 1.8 et mon attribut image en base est de type BLOB.

    Merci d'avance pour votre aide...

  2. #2
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    Pourquoi insérer addslashes($image) et pas simplement $image quoté ?

    Si tu veux, tu as un très bon exemple dans ce tuto
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Je me suis effectivement aide des document publiés par cyril beaussier...

    Quant à l'insertion "addslashé" de mon image, celle-ci me renvoie le meme résultat, à savoir le "die" de ma requete...

    Je ne sais pas quoi faire d'autre...

  4. #4
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    Ton champ id est un int en auto increment ?

    Si c'est le cas, il ne va pas supporter les quotes vides, pour lui, c'est une chaine ...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = mysql_query("insert into baignoires_balneo (nom, dimension, prix, photo, autre1, autre2, autre3, autre4, autre5) values ('$reference','$dimension','$prix',addslashes($image),'$carac1','$carac2','$carac3','$carac4','$carac5')") or die ("requête d'ajout incorrecte");
    ça devrait suffire
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Je suis navré de mon insistance mais mon script ne fonctionne tjrs pas...

    Le premier champ de ma base est effectivement id INT(11) en auto increment. Seulement, si je ne fais pas figurer ce champ lors de mon insertion, je me heurte au même mesage d'erreur (die)

    Sans l'attribut image, mon insertion se fait sans problèmes...

    Autres éléments d'aide:
    - la taille de l'image, bien que non testée, ne dépasse pas la taille max imposée
    - j'ai testé une insertion manuelle de photo via PHPMyadmin et le résultat est une quantité impressionnante de code binaire...

    Je sens que je brûle et que le pb est tout bête mais bon...

  6. #6
    Membre expérimenté
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Par défaut
    tu peux me coller ton message d'erreur STP ?
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Le message d'erreur que s'affiche à l'écran est tout simplement le "die" inséré en fin de ma requete d'insertion à savoir "requete d'ajout incorrecte".

    J'en conclu donc que ma requête est mauvaise mais malgré l'avoir tourné dans tout les sens, je ne vois pas ce qui pourrait clocher à part l'ajout de ce nouveau champs qui bloque l'ensemble de ma requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $requete = mysql_query
    ("insert into baignoires_balneo (id, nom, dimension, prix, photo, autre1, autre2, autre3, autre4, autre5) 
    values ('','$reference','$dimension','$prix','$image','$carac1','$carac2','$carac3','$carac4','$carac5')") or die ("requête d'ajout incorrecte");
    J'ai testé '$image' -> pas bon
    j'ai testé $image -> pas bon
    j'ai testé "$image" -> pas bon (et pourquoi pas hein? ^^)
    j'ai testé addslashes($image) -> pas bon
    j'ai testé 'addslashes($image)' -> pas bon (très désespéré)
    j'ai même testé directement la fonction de récupération file_get_content['photo']['tmp_name'] qui me renvoi un "exected T_NUM or T_STRING variable"

  8. #8
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    Premierement il n'est pas bon d'inserer une image en base.
    Cela ralentis la base.
    Il vaut mieux ecrire cette image sur le disque et mettre le chemin vers celle ci.


    Si tu n'as pas le choix, je pense que tu devrais essayer d'inserer ton image en base64.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Malheureusement, ce qui offrirait des facilité de travail pour moi (Ex: stockage des images dans un fichier puis appel de celles-ci avec un href), proposerait des dificultés aux utilisateurs finaux...
    De plus, il ne s'agit pas d'un catalogue d'image tres imposant car environ une vingtaine d'illustrations seront insérées...

    Mon choix c'est donc logiquement orienté vers cette mécanique.

    Personnellement, je pense que c'est le format de ma variable $image qui coince... j'en veut pour preuve la requete qui est chargée de l'insérer en base qui n'accepte ma variable que lorsque celle-ci est "addslashée" MAIS qui me restitue du binaire en sortie à l'écran.
    Inversement, un $image non "addslashé" me fait planter ma requête mais m'affiche une image correcte...

  10. #10
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    Tu devrais y trouver ton bonheur :
    http://beaussier.developpez.com/arti...hp/mysql/blob/

  11. #11
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Je te recommande d'urgence la lecture de cet article :
    http://sql.developpez.com/stockerimages/

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Je suis désespéré.............

    je ne sais plus quoi faire... Après une journée complète à tenter de résoudre ce probleme, je suis dans l'impasse...

    Je ne vois pas d'autre alternative que l'inscription en base étant donné mes contraintes de travail...

    je joint ici mon code en entier pour savoir si une solution n'existerai pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
     
    //MON FORMULAIRE DE SAISIE
    // JE SUIS CONTRAINT DE FAIRE QU'UN SEUL ET UNIQUE FORMULAIRE POUR GERER LES ENTREES
    <form enctype="multipart/form-data" action="modif_bain_balneo2.php" method="post">
      <table border="1">
        <tr>
    	<td>Veuillez saisir sa reference</td>
    	<td><input name="ajout_reference" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez saisir ses dimensions</td>
    	<td colspan="2"><input name="ajout_dimension" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez saisir ses son prix</td>
    	<td><input name="ajout_prix" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez saisir une caracteristique complementaire </td>
    	<td><input name="ajout_carac1" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez saisir une caracteristique complementaire </td>
    	<td><input name="ajout_carac2" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez saisir une caracteristique complementaire </td>
    	<td><input name="ajout_carac3" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez saisir une caracteristique complementaire </td>
    	<td><input name="ajout_carac4" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez saisir une caracteristique complementaire </td>
    	<td><input name="ajout_carac5" type="text"></input></td>
        </tr>
        <tr>
    	<td>Veuillez uploader une image d'illustration</td>
    	<input type="hidden" name="MAX_FILE_SIZE" value="250000"></input>
    	<td><input type="file" name="fic"></input></td>
        </tr>
        <tr>
    	<td colspan="2"><input type="submit" value="Envoyer"></input></td>
        </tr>
      </table>
    </form>
     
     
    //MON SCRIPT DE RECUPERATION ET D'INSERTION EN BASE
    <?php
    mysql_connect("localhost", "root", "") or die ("impossible de se connecter à MySQL");			
    mysql_select_db("propiscine") or die ("impossible de se connecter à la base de données");
     
    // Récupération des variables
    //echo file_get_contents ($_FILES['fic']['tmp_name']);
    $reference = $_POST['ajout_reference'];
    $dimension = $_POST['ajout_dimension'];
    $prix = $_POST['ajout_prix'];
    $image = file_get_contents ($_FILES['fic']['tmp_name']);
    $carac1 = $_POST['ajout_carac1'];
    $carac2 = $_POST['ajout_carac2'];
    $carac3 = $_POST['ajout_carac3'];
    $carac4 = $_POST['ajout_carac4'];
    $carac5 = $_POST['ajout_carac5'];
     
    // Insertion en base de données
    $requete = mysql_query("insert into baignoires_balneo (id, nom, dimension, prix, photo, autre1, autre2, autre3, autre4, autre5) values ('','$reference','$dimension','$prix',addslashes ($image),'$carac1','$carac2','$carac3','$carac4','$carac5')") or die ("requête d'ajout de produit baignoire balneo incorrecte");
     
     
    //MON SCRIPT D'AFFICHAGE
    <?php
    $requete = mysql_query("select * from baignoires_balneo order by id") or die ("requête d'affichage des produits bain-balneo incorrecte");
    while ($donnees=mysql_fetch_array($requete))
    {
    ?>
    <p class="affichage_table">
        <table border="1">
    	<tr>
                      <td colspan="4"><?php echo $donnees['photo']; ?>"></td>
    	</tr>
        </table>
    <?
    }
    ?>
    Le résultat est le suivant : echec de ma requete -> le DIE est affiche à l'ecran

    Compléments d'information: losque j"addslashe" ma variable $image immédiatement apres récupération (CF $image = addslashes(file_get_contents ($_FILES['fic']['tmp_name'])) et que je met '$image' tel quel en base, il y a bien insertion mais restitution en binaire

    encore une fois merci d'avance

  13. #13
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    c'est normal que cela te restitue du binaire.
    Ton image est en binaire.
    Il faut envoyer le bon content-type et faire un echo de la variable.
    Il faut bien faire attention a ne pas mettre d'espace ou autre echo dans le fichier. (le mieux est de ne pas fermer le fichier avec ?>)

    ensuite tu place l'appel a ton fichier dans une balise HTML img.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    OK...

    Dans l'hypothese où $donnees['photo'] correspond bien à mon image en base, ou faut-il réèlement placer le header (content-type: image/jpeg)?

    Le placer juste avant mon echo me donne un message du type : Warning: cannot modify header information - headers already sent by (output started at *ma page d'affichage* a la ligne ou le header est placé)

    ai-je encore oublié une étape? pourquoi le header se revoit-il l'erreur tout seul?

  15. #15
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    il faut que tu separe en deux ton script;
    un qui te permet d'inserer l'image et un qui va l'afficher ou tu n'as que du code PHP.
    sinon le content type va deja etre envoye.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Je ne comprend pas ton aide...

    pourquoi faut-il que mon scrip d'affichage de mon image soit séparé du reste de mon actuel script d'affichage? (réponse pas forcement bligatoire ^^)

    Actuellement, je sépare bien mes scripts de saisies de données (mon formulaire) de mon script d'insertion en base et de mon script d'affichage.

    En outre, je ne vois pas comment je pourrais faire autrement... dans mon affichage, j'apeller bien mon image à travers l'echo de $donnees['photo']...

    Si j'avais à réaliser un tel script, il ne pourrait s'appliquer à tous mes produits (ou du moins, il serait vachement répétitif avec des tests "isset" à répétition) - je ne vois d'ailleurs aucunement la façon de l'implémenter indépendament du reste...

    Après une journée passée sur ce truc, j'avoue que je suis un peu perdu... je m'inquiete même de mes possibilités de réussite sur ce point... je sais plus trop la...

  17. #17
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    As tu regarder les tuto qui ont ete poste un peu plus haut dans le post ?

    En gros des que tu as du code HTML dans une page PHP, le serveur HTTP envoi le content type par defaut qui est souvent text/html.
    Or tu ne peux avoir qu'un content type par requete (logique du ne peux pas dire que c du HTML et en meme temps que c une image. C'est soit l'un soit l'autre.)

    Donc il faut que ta page n'envoie que du HTMl ou que le code binaire de ton image.

    De plus, pour que le navigateur voit qu'il s'agit d'une image et lui applique certaines options, il faut mettre l'url de ton script dans un tag IMG.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Je crois que j'ai finalement compris...

    Dans mon cas, il me reste donc a créer une base de données d'image indépendante de l'ensemble des mes produit et à les indexer en fonction de ceux-ci afin de les diférencier.

    Reste donc a construire un script apellé par ma page d'affichage avec pour parametre le produit en question et qui resitura ensuite l'image souhaitée.

    C'est tout bête mais c'est ton explication des différents content-type qui m'a mis la puce à l'oreille: en effet, impossible de faire cohabiter deux content-type ds une meme page et ma page d'affichage en contient deja un pour l'HTML.

    merci de ton aide!!!

  19. #19
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    Pas de pb.
    Pense a "Resolu".

  20. #20
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Puis-je me permettre de suggérer (à nouveau) que tu lises l'article que j'ai indiqué en première page ?
    Cela t'aurait probablement évité quelques prises de tête et cela t'en évitera à coup sûr par la suite.
    En gros : évite d'enregistrer les images dans ta base de données : n'enregistre que leur nom. Ça simplifie toutes les manipulations.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'insertion hibernate dans la base
    Par sheura dans le forum Hibernate
    Réponses: 5
    Dernier message: 20/09/2007, 14h02
  2. Problème d'insertion d'images
    Par Abhorash dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 4
    Dernier message: 08/06/2007, 18h12
  3. Problème d'insertion d'image dans un tableau
    Par aminos40 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 01/06/2007, 09h54
  4. problème d'insertion d'images
    Par captainflex dans le forum Ruby on Rails
    Réponses: 5
    Dernier message: 20/05/2007, 23h20
  5. Problème d'insertion d'image dans une fenêtre.
    Par Antigonos Ier Gonatas dans le forum Tkinter
    Réponses: 2
    Dernier message: 26/08/2006, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo