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 :
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
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>
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
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); }
L'envoi de post sans image fonctionne bien.
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 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 ?...
Partager