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 :

[Résolu] Je n'arrive pas à uploader d'image lors de la publication d'un article de blog


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [Résolu] Je n'arrive pas à uploader d'image lors de la publication d'un article de blog
    Bonjour à tous !

    Je débute en PHP, et j'essaie de coder un blog en suivant un tuto sur YouTube (qui est très bien fait ! mais comme il date de 2015, il y a des petites choses qui ne fonctionnent plus comme il faut. Je suis arrivée à me dépatouiller jusqu'à présent, mais là je bloque complètement !...)
    J'essaie de configurer une fonction qui permet d'uploader une image depuis notre disque dur vers le serveur.
    Le blog utilise Materialize ; j'ai repris le code du site Materialize, car celui du tuto ne fonctionnait pas/plus.

    Voici mon fichier write.php :

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    <!-- Formulaire de création des articles -->
    <h2>Poster un article</h2>
     
    <?php
     
        /* Commande d'envoi du formulaire si les champs sont renseignés */
        if(isset($_POST['post'])) {
            $title = htmlspecialchars(trim($_POST['title']));
            $content = htmlspecialchars(trim($_POST['content']));
            $posted = isset($_POST['public']) ? "1" : "0";
     
            $errors = [];
     
            /* Affichage d'erreur si tous les champs ne sont pas renseignés */
            if(empty($title) || empty($content)) {
                $errors['empty'] = "Veuillez remplir tous les champs.";
            }      
     
            if(!empty($_FILES['image']['name'])) {
                $file = $_FILES['image']['name'];
                $extensions = ['.png','.jpg','.jpeg','.gif','.PNG','.JPG','.JPEG','.GIF'];
                $extension = strrchr($file,'.');
     
                /* Affichage d'erreur si l'extension n'est pas reconnue */
                if(!in_array($extension,$extensions)) {
                    $errors['image'] = "Cette extension d'image n'est pas valide.";
                }
            }
     
            if(!empty($errors)) {
                ?>
                <!-- En cas d'erreur, affichage de celle-ci -->
                    <div class="card red">
                        <div class="card-content white-text">
                            <?php
                                foreach($errors as $error) {
                                    echo $error."<br/>";
                                }
                            ?>
                        </div>
                    </div>
                <?php
            } else {
     
                /* En l'absence d'erreur, exécution de la fonction d'envoi de l'article vers la base de données */
                post($title,$content,$posted);
     
                /* S'il y a une image, uploader celle-ci */
                if(!empty($_FILES['image']['name'])) {
                    post_img($_FILES['image']['tmp_name'], $extension);
                } else {
                    $id = $db->lastInsertId();
                    header("Location:index.php?page=post&id=".$id);
                }
            }
        }
     
    ?>
     
    <form method="post" enctype="mutlipart/form-data">
        <div class="row">
     
            <!-- Titre de l'article -->
            <div class="input-field col s12">
                <input type="text" name="title" id="title">
                <label for="title">Titre de l'article</label>
            </div>
     
            <!-- Contenu de l'article -->
            <div class="input-field col s12">
                <textarea class="materialize-textarea" name="content" id="content"></textarea>
                <label for="content">Contenu de l'article</label>
            </div>
     
            <!-- Bouton permettant de télécharger une image -->
            <div class="col s12">
                    <div class="file-field input-field">
                        <div class="btn col s2">
                            <span>Image de l'article</span>
                            <input type="file" name="image" class="col s12">
                        </div>
                        <div class="file-path-wrapper">
                            <input class="file-path validate" type="text">
                        </div>
                    </div>
            </div>
     
            <div class="col s6">
     
                <!-- Curseur permettant de rendre l'article public -->
                <p>Public ?</p>
                <div class="switch">
                    <label>
                        Non
                        <input type="checkbox" name="public" />
                        <span class="lever"></span>
                        Oui
                    </label>
                </div>
            </div>
            <div class="col s6 right-align">
                <br/><br/>
     
                <!-- Bouton d'envoi de l'article -->
                <button class="btn" type="submit" name="post">Publier</button>
            </div>
        </div>
    </form>
    Voici le fichier associé write.func.php :

    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
    <?php
        /* Fonction d'envoi de l'article vers la base de données */
        function post($title,$content,$posted) {
            global $db;
     
            $p = [
                'title'     => $title,
                'content'   => $content,
                'writer'    => $_SESSION['admin'],
                'posted'    => $posted
            ];
     
            $sql = "
            INSERT INTO nic_posts(title,content,writer,date,posted) 
            VALUES(:title,:content,:writer,NOW(),:posted)
            ";
            $req = $db->prepare($sql);
            $req->execute($p);
        }
     
        function post_img($tmp_name, $extension) {
            global $db;
            $id = $db->lastInsertId();
            $i = [
                'id'    => $id,
                'image' => $id.$extension   // $id = 25 ; $extension = .jpg ; $id.$extension = 25.jpg
            ];
            $sql = "UPDATE nic_posts SET image = :image WHERE id = :id";
            $req = $db->prepare($sql);
            $req->execute($i);
            move_uploaded_file($tmp_name,"../img/posts/".$id.$extension);
            header("Location:index.php?page=post&id=".$id);
        }
    Enfin, la connexion à la base de données se fait via le fichier main-functions.php :

    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
    <?php
        /*  Le "session_start()" est à mettre au début de chaque page qui utilise les sessions ($_SESSION). */
        session_start();
     
        /* Identifiants de connexion à la base de données */
        $dbhost = 'localhost';
        $dbname = 'nic_blog';
        $dbuser = 'root';
        $dbpassword = '';
     
        /* Fonction de connexion à la base de données */
        try {
            $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname,$dbuser,$dbpassword,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
        } catch(PDOexception $e) {
            die("Une erreur est survenue lors de la connexion à la base de données.");
        }
    ?>
    L'envoi de post sans image fonctionne bien.
    L'envoi de post avec image fonctionne aussi, mais l'image sélectionnée n'est pas uploadée dans le répertoire "posts" comme prévu ; c'est l'image par défaut : "post.png", qui s'affiche à la place.

    Cela fait des jours que je patine... Une idée, s'il vous plait ?...

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 233
    Points : 15 528
    Points
    15 528
    Par défaut
    affichez le contenu de $_FILES au début de votre code.
    vous pouvez essayer cette fonction qui affichera dans le code HTML, n'importe quelle variable composée d'objets, tableaux, code XML ou valeurs TRUE, FALSE ou NULL,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function aff($var)
    {
    	echo "<pre>";
    	echo htmlspecialchars(var_export($var, TRUE));
    	echo "</pre>";
    }

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 405
    Points : 4 841
    Points
    4 841
    Par défaut
    Bonjour,

    multipart, pas mutlipart;

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    Bonjour,

    multipart, pas mutlipart;
    Bien vu !! Excellent... Un grand merci Toufik, tu me sauves !!

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2020
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par mathieu Voir le message
    affichez le contenu de $_FILES au début de votre code.
    vous pouvez essayer cette fonction qui affichera dans le code HTML, n'importe quelle variable composée d'objets, tableaux, code XML ou valeurs TRUE, FALSE ou NULL,
    (...)
    Un grand merci pour cette fonction très utile, que je ne connaissais pas !

    Excellente fin de journée à tous les deux !!

    (Dites, je n'arrive pas à passer mon message comme "résolu"... y a-t-il un bouton pour ajouter le tag ? j'ai essayé de placer [Résolu] dans le titre mais ça ne fonctionne pas... </boulet>)

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 405
    Points : 4 841
    Points
    4 841
    Par défaut
    Oui, le bouton est juste en bas de page à gauche.

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

Discussions similaires

  1. [FTP] je n'arrive pas à uploader dans un dossier
    Par pierrot10 dans le forum Langage
    Réponses: 1
    Dernier message: 11/03/2008, 01h57
  2. SDL ? Je n'arrive pas à charger mon image
    Par fredo3il dans le forum C
    Réponses: 3
    Dernier message: 23/01/2008, 00h12
  3. Mon appli Web Start n'arrive pas à charger une image
    Par nouknouk dans le forum Applets
    Réponses: 4
    Dernier message: 25/04/2007, 22h55
  4. Je n'arrive pas à recuperer une image
    Par lemonsoda dans le forum Langage
    Réponses: 6
    Dernier message: 26/01/2006, 09h32

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