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 ?...