8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je construits un site(local) de collection.
J’insère des éléments dans ma base de données via un formulaire. Tout va bien.
Par contre quand je fait une modification, j'ai une erreur SQl qui me dit erreur de syntaxe.
J'ai beau regarder, comparer je ne comprends pas ou est l'erreur.

Le code qui fonctionne:
    $q = $this->_bdd->prepare("[b]INSERT INTO[/b] timbre(referenceYT, pays, annee, categorie,serie, theme, valeurFaciale, surcharge,
      couleur, dentelure, dimension, cotationNeuf, nombreNeuf, cotationOblitere, nombreOblitere, description, commentaire, image )
   [b] VALUES[/b](:referenceYT, [langue]ays, :annee, :categorie,:serie, :theme, :valeurFaciale, :surcharge,
      :couleur, :dentelure, :dimension, :cotationNeuf, :nombreNeuf, :cotationOblitere, :nombreOblitere, :description, :commentaire, :image)");

// $q->bindValue(':id_timbre', $timbre->id());
$q->bindValue(':referenceYT', $timbre->refYT());//, PDO::PARAM_INT);
$q->bindValue(':pays', $timbre->pays());//, PDO::PARAM_INT);
$q->bindValue(':annee', $timbre->annee());//, PDO::PARAM_INT);
$q->bindValue(':categorie', $timbre->categorie());//, PDO::PARAM_INT);
$q->bindValue(':serie', $timbre->serie());//, PDO::PARAM_INT);
$q->bindValue(':theme', $timbre->theme());//, PDO::PARAM_INT);
$q->bindValue(':valeurFaciale', $timbre->valfaciale());//, PDO::PARAM_INT);
$q->bindValue(':surcharge', $timbre->surcharge());//, PDO::PARAM_INT);
$q->bindValue(':couleur', $timbre->couleur());//, PDO::PARAM_INT);
$q->bindValue(':dentelure', $timbre->dentelure());//, PDO::PARAM_INT);
$q->bindValue(':dimension', $timbre->dimension());//, PDO::PARAM_INT);
$q->bindValue(':cotationNeuf', $timbre->coteneuf());//, PDO::PARAM_INT);
$q->bindValue(':nombreNeuf', $timbre->nbneuf());//, PDO::PARAM_INT);
$q->bindValue(':cotationOblitere', $timbre->coteoblit());//, PDO::PARAM_INT);
$q->bindValue(':nombreOblitere', $timbre->nboblit());//, PDO::PARAM_INT);
$q->bindValue(':description', $timbre->description());//, PDO::PARAM_INT);
$q->bindValue(':commentaire', $timbre->comment());//, PDO::PARAM_INT);
$q->bindValue(':image', $timbre->image());//, PDO::PARAM_INT);
$q->execute();


et celle qui provoque l'erreur:
      
$q = $this->_bdd->prepare("[b]UPDATE[/b] timbre
     [b] SET[/b](pays =:pays,annee =:annee, categorie=:categorie,serie=:serie, theme=:theme,valeurFaciale =:valeurFaciale, surcharge=:surcharge,
        couleur=:couleur, dentelure=:dentelure, dimension=:dimension, cotationNeuf=:cotationNeuf, nombreNeuf=:nombreNeuf, cotationOblitere=:cotationOblitere,
         nombreOblitere=:nombreOblitere,description=:description, commentaire=:commentaire, image=:image)
       [b] WHERE[/b] referenceYT = :referenceYT");
    
    // $q->bindValue(':id_timbre', $timbre->id());
    $q->bindValue(':referenceYT', $timbre->refYT());//, PDO::PARAM_INT);
    $q->bindValue(':pays', $timbre->pays());//, PDO::PARAM_INT);
    $q->bindValue(':annee', $timbre->annee());//, PDO::PARAM_INT);
    $q->bindValue(':categorie', $timbre->categorie());//, PDO::PARAM_INT);
    $q->bindValue(':serie', $timbre->serie());//, PDO::PARAM_INT);
    $q->bindValue(':theme', $timbre->theme());//, PDO::PARAM_INT);
    $q->bindValue(':valeurFaciale', $timbre->valfaciale());//, PDO::PARAM_INT);
    $q->bindValue(':surcharge', $timbre->surcharge());//, PDO::PARAM_INT);
    $q->bindValue(':couleur', $timbre->couleur());//, PDO::PARAM_INT);
    $q->bindValue(':dentelure', $timbre->dentelure());//, PDO::PARAM_INT);
    $q->bindValue(':dimension', $timbre->dimension());//, PDO::PARAM_INT);
    $q->bindValue(':cotationNeuf', $timbre->coteneuf());//, PDO::PARAM_INT);
    $q->bindValue(':nombreNeuf', $timbre->nbneuf());//, PDO::PARAM_INT);
    $q->bindValue(':cotationOblitere', $timbre->coteoblit());//, PDO::PARAM_INT);
    $q->bindValue(':nombreOblitere', $timbre->nboblit());//, PDO::PARAM_INT);
    $q->bindValue(':description', $timbre->description());//, PDO::PARAM_INT);
    $q->bindValue(':commentaire', $timbre->comment());//, PDO::PARAM_INT);
    $q->bindValue(':image', $timbre->image());//, PDO::PARAM_INT);
    $q->execute();

le message d'erreur:
Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '(pays ='France',annee ='2015', categorie='Auto adhésif',serie='L\'art et la mat' à la ligne 2

Merci pour votre aide parce que là je ne vois pas(bon même si ça doit être gros) Smiley ohwell
Le problème vient de
serie='L\'art et la mat'
je pense... En SQL, les apostrophes s'échappent avec une autre apostrophe :
serie='L''art et la mat'

Modifié par Mathieu8337 (07 May 2020 - 09:36)
Bonjour Mathieu8337 et merçi de te pencher sur mon souci.

J'ai creusé un peu plus en isolant chaque ligne, en fait le souci vient de la dernière ligne:
$q->bindValue(':image', $timbre->image());

La valeur à passé vient de mon formulaire.php
'image'=>$_POST['pathimage'] : et il est là le problème, la valeur est null(vide)

Du coup je ne comprends pas le libellé de l'erreur.

Par le $_POST['pathimage'] je pensais récupérer le chemin de l'image du btn type file.
Mais ça ne marche pas, ni via le label.
Visiblement je suis obligé de créer un input dans lequel je vais stocké le nom de l'image de façon à ce qu'il soit transmis par le form.

Des conseils ?
Merçi

ps: du coup le titre ne correspond plus trop.
Oula, la récupération d'image ça ne marche pas du tout comme ça... Si tu as une balise du genre <input type="file">, déjà dans la balise form il faut mettre enctype="multipart/form-data" et ensuite le fichier n'est pas dans $_POST mais dans $_FILES.
Il faudra ensuite le copier sur ton serveur avec la fonction move_uploaded_file() (plus d'infos ici : https://www.php.net/manual/fr/function.move-uploaded-file.php ) et ensuite seulement tu pourras mettre quelque chose en base de données...