Bonjour à tous, je suis un grand débutant, j'ai commencé à lire , écouté, et à écrire le code "espace membre", un super tutoriel, merci à Grafikart. Tout fonctionne correctement. J'ai ajouté la partie mise à jour d'un avatar ou photo ou logo ... et là je bloque, si une âme de bonne volonté pourrait me dire la grosse bêtise que je fais , je lui en serai reconnaissant.
Cordialement

voici la page qui sert à uploder et mettre à jour la BD
"
<?php
$target_dir = "fic/photo/"; // dossier où seront déposé les images
$target_file = $target_dir . basename($_FILES["photo"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Vérifier si le fichier image est une image réelle ou fausse image
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["photo"]["tmp_name"]);
if($check !== false) {
echo "<h2 class='alert-success'>  Le fichier est une image - " . $check["mime"] . ". </h2>";
$uploadOk = 1;
} else {
echo "<h3 class='alert-danger'>  Le fichier n’est pas une image.</h3>";
$uploadOk = 0;
}
}

// Vérifier si le fichier existe déjà
if (file_exists($target_file)) {
echo "<h3 class='alert-danger'>  Désolé, le fichier existe déjà.</h3>";
$uploadOk = 0;
}

// Vérifier la taille du fichier
if ($_FILES["photo"]["size"] > 500000) {
echo "<h3 class='alert-danger'>  Désolé, votre dossier est trop volumineux.</h3>";
$uploadOk = 0;
}

// Autoriser certains formats de fichiers
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "<h3 class='alert-danger'>  Désolé, seuls les fichiers JPG, JPEG, PNG et GIF sont autorisés.</h3>";
$uploadOk = 0;
}

// Vérifier si $uploadOk est défini à 0 par une erreur
if ($uploadOk == 0) {
echo "<h3 class='alert-danger'>  Désolé, votre fichier n’a pas été téléchargé.</h3>";
// si tout va bien, essayez de télécharger le fichier et de mettre à jour la bd

} else {
if (move_uploaded_file($_FILES["photo"]["tmp_name"], $target_file)) {
require_once 'inc/db.php'; // cnx bd
// sql pour sélectionner le membre à modifier

  $query =  $pdo->prepare('UPDATE membres SET avatar=:avatar  WHERE id =" '.$_SESSION['auth']->id .' ');
 // Liaisopn des paramètres nommés
$query->bindValue(':avatar',  $_POST['photo']);
$query->execute();

echo "<h1 class='alert-success'>Le fichier ". htmlspecialchars( basename( $_FILES["photo"]["name"])). " a été téléchargé.</h1>";

} else {
echo "<h3 class='alert-danger'>  Désolé, il y a eu une erreur de téléchargement de votre fichier.</h3>";
}
}

?>
"
Le message d'erreur:
Fatal error: Uncaught exception 'PDOException' with message '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 '" 10' at line 1' in /home/users3/h/hww2897/www/dev/contact-mb/upload.php:69 Stack trace: #0 /home/users3/h/hww2897/www/dev/contact-mb/upload.php(69): PDOStatement->execute() #1 {main} thrown in /home/users3/h/hww2897/www/dev/contact-mb/upload.php on line 69

La ligne 69 correspont à $query->execute();

Merci de votre aide

9 réponses


bonjour.
pas de session start ?
pourquoi l'id n'est pas lui aussi binder ?

pour insérer ton code correctement. utilise les balises du markdown les backstick si je me trompe

demmare la session aussi tout depuis de la page

if(session_status() == PHP_SESSION_NONE){ session_start(); } $query = $pdo->prepare('UPDATE membres SET avatar = :avatar WHERE id = :id '); // Liaisopn des paramètres nommés $query->execute([ 'avatar' => ..., 'id' => $_SESSION['auth']->id ]);

Merci pour vos réponses, j'ai oublié de dire quand début de page j'avais ce code pour lancer la session
"" <?php session_start(); require_once 'inc/functions.php'; logged_only(); ?> <?php require 'inc/header_espace.php'; ?> ""
Le code que j'ai modifié delon "devox"
"```"
{
if (move_uploaded_file($_FILES["photo"]["tmp_name"], $target_file)) {
// sql pour sélectionner le membre à modifier
require_once 'inc/db.php'; // cnx une fois seulement
$query = $pdo->prepare('UPDATE membres SET avatar = :avatar WHERE id = :id ');
// Liaison des paramètres nommés
$query->execute([ 'avatar' => $_POST['photo'], 'id' => $_SESSION['auth']->id ]);
echo "<h1 class='alert-success'>Le fichier ". htmlspecialchars( basename( $_FILES["photo"]["name"])). " a été téléchargé.</h1>";

} else {
echo "<h3 class='alert-danger'>  Désolé, il y a eu une erreur de téléchargement de votre fichier.</h3>";
}
}
"```"
plus d'érreur de syntax, le fichier est bien posé dans le bon dossier (fic/photo/), mais le nom du fichier ne figure pas dans le champ "avatar' de la table , aurai-je oublié quelques chose?

Stp format le code c dure a lire comme ca

utilise plutot
$target_file // au lieu de $_POST['photo']

Super devvox, ça marche bien, upload -> Ok, bd ->Ok.
J'ai remarqué la chose suivante, comme tout est OK, la photo devrait s'afficher, elle ne s'affiche que lorsque on se déconnecte et reconnecte.
Question peut régler ou pas ce problème ? Est-ce normal, cela est peut être du au fait que l'on garde en mémoire une session active?
Merci pour le temps que vous m'avez accorder, je suis vraiment debutant, excusez moi encore...

apres ta req met a jour ta session avatar j´imagine c comme ca tu l´affiche $_session['avatar'] ?

tu fait $_SESSION['avatar'] = $target_file;

pas de soucis. :*-

Cool, ça marche bien, merci beaucoup devox.

C'est cool pense a convertir en .webp par exemple, compressé tes images reduire leur tailles pour la performance 😙

Ok, mais là il faut que je trouve un tuto qui m'explique comment le mettre en oeuvre :), je ne connaissais pas ce type de format, c'est Google qui souhaite l'imposer, comme Adobe souhaite imposer le format DNG. Je pense qu'il y a une fonction en php qui le permet?