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 :

Application du tutoriel "Stocker des images dans MySQL"


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 63
    Par défaut Application du tutoriel "Stocker des images dans MySQL"
    Bonjour.
    Je suis actuellement entrain d'appliquer le tutoriel "Stocker des images dans MySQL" pour les besoins de mon application web.

    J'envoie le fichier via ce formulaire html :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     <form enctype="multipart/form-data" action="#" method="post">
             <input type="file" name="img" size=50 />
             <input type="submit" value="Envoyer" />
        </form>

    La table correspondante dans la base de données :
    Nom : bdd.png
Affichages : 89
Taille : 29,2 Ko

    Le code PHP pour l'insertion de l'image récupérer dans la variable $_FILES :
    Code php : 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
     
    if ( isset($_FILES['img']) )
        {
            $link        = false;
            $img_blob   = '';
            $img_taille = 0;
            $img_type   = '';
            $img_nom    = '';
            $taille_max = 400000;
            $link        = is_uploaded_file($_FILES['img']['tmp_name']);
     
            if ($link == false) {
                echo "Problème de transfert";
                return false;
            } else {
                // Le fichier a bien été reçu
                $img_taille = $_FILES['img']['size'];
     
                if ($img_taille > $taille_max) {
                    echo "<script> alert('Fichier trop gros !');</script>";
                    return false;
                }
     
                if (strlen($_FILES['img']['name']) > 50){
                    echo "<script> alert('Nom de fichier trop grand !');</script>";
                    return false;
                }
     
                $img_type = $_FILES['img']['type'];
                $img_nom  = $_FILES['img']['name'];
     
     
                // Connexion à la database
     
                $database=$_SERVER['DOCUMENT_ROOT'].'/menuiserie/database.db';
                try{
                $link = new PDO('mysql:host=localhost;dbname=menuiserie;charset=utf8', 'root', '');
                $link->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // ERRMODE_WARNING | ERRMODE_EXCEPTION | ERRMODE_SILENT
                } catch(Exception $e) {
                echo "\nImpossible d'accéder à la base de données MySQL : ".$e->getMessage();
                die();
                }
     
     
                $img_blob = file_get_contents ($_FILES['img']['tmp_name']);
     
                $req = "INSERT INTO 'images' VALUES (" .
                "'" . $img_nom . "', " .
                "'" . $img_taille . "', " .
                "'" . $img_type . "', " .
                "'" . addslashes ($img_blob) . "'); "; // Echappement du contenu binaire
     
                foreach($link->query($req) as $transfer){
                    echo "tranfert réussi";
                }
            }
        }

    Le problème est le suivant : Lorsque je tente d'enregistrer une image dans la database, PDO m'informe d'une erreur de syntaxe dans ma requête SQL (voir lignes 48 à 52 du code PHP) : "Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''images' VALUES ('image.jpg', '341068', 'image/jpeg', '????\0JFIF\0\0H\0H...' at line 1 in /opt/lampp/htdocs/menuiserie/assets/php/realisations.php:59 Stack trace: #0 /opt/lampp/htdocs/menuiserie/assets/php/realisations.php(59): PDO->query('INSERT INTO 'im...') #1 {main} thrown in /opt/lampp/htdocs/menuiserie/assets/php/realisations.php on line 59".

    La requête SQL me paraît pourtant correcte ...
    Merci pour votre aide.

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Le tutoriel auquel tu te réfères est antédiluvien. C'est d'ailleurs un effort louable que d'essayer de le mettre "au goût du jour". Bref, ce n'est pas de cette manière qu'on compose une requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $req = "INSERT INTO 'images' VALUES (" .
                "'" . $img_nom . "', " .
                "'" . $img_taille . "', " .
                "'" . $img_type . "', " .
                "'" . addslashes ($img_blob) . "'); ";
    On ne compose pas une requête en faisant des concaténations et en utilisant addslashes (on ne fait plus ça depuis au moins dix ans). À la place il faut utiliser une requête préparée.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    stocker les images dans la bdd (colonne de type blob) ; t'as pas peur d'une taille de base gigantesque (en cas de nombreuses images stockées) ?

    Pour faire du PDO, je suis convaincu de l'intérêt de la classe PDOPlusPlus...

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 63
    Par défaut
    Merci pour vos réponses. J'ai résolu le souci qui venait entre autres des guillemets autour du nom de la table.

    Effectivement j'ai choisi d'opter pour une solution d'upload de fichier dans le folder du site, puis de sauver le chemin dans la base de données.

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

Discussions similaires

  1. [2016/04/14] Stocker des images dans MySQL
    Par Community Management dans le forum MySQL
    Réponses: 1
    Dernier message: 17/05/2020, 09h56

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