[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:
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:
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:
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 ?... :(