Partage
  • Partager sur Facebook
  • Partager sur Twitter

mysql UPDATE ne fonctionne pas vraiment

    4 avril 2022 à 21:36:49

    Bonjour à tous !

    Je m'explique. Je suis sur un projet perso, juste pour apprendre. J'ai 2 table dans ma base de données, et une jointure entre les deux.

    En premier c'est ma page de connexion à la BDD :connexionDB.php

    <?php
        error_reporting(0);
        class connexionDB {
            private $host = 'localhost';
            private $name = 'oprpg';
            private $user = 'root';
            private $pass = 'root';
            private $connexion;
    
            function __construct($host = null, $name = null, $user = null, $pass = null) {
                if($host != null) {
                    $this->host = $host;
                    $this->name = $name;
                    $this->user = $user;
                    $this->pass = $pass;
                }
                try {
                    $this->connexion = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name, $this->user, $this->pass, array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8',
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
                } catch (PDOException $e) {
                    echo 'Erreur : Impossible de se connecter à la BDD!';
                    die();
                }
            }
    
             // Gain de vitesse lors d'une requère SQL
             // A utiliser de préférence avec la requête SELECT.
            public function query($sql, $data = array()) {
                $req = $this->connexion->prepare($sql);
                $req->execute($data);
                return $req;
            }
    
            // A utiliser avec INSERT, UPDATE ou DELETE
            public function insert($sql, $data = array()) {
                $req = $this->connexion->prepare($sql);
                $req->execute($data);
            }
        }
    
        // Faire la connexion à ma fonction
        $DB = new connexionDB();
    ?>

    Ensuite j'ai la page de connexion au site qui contient la jointure, connexion.php :

    <?php
        session_start();
        include('connexionDB.php');
    
        if (isset($_SESSION['id'])) {
            header('Location: index.php');
            exit;
        }
    
        // Si la variable $_POST contient des infos, on les traites
        if(!empty($_POST)) {
            extract($_POST);
            $valid = true;
    
            if(isset($_POST['connexion'])) {
                $mail = htmlentities(trim($pseudo));
                $mdp = trim($mdp);
    
                if(empty($pseudo)) {
                    $valid = false;
                    $er_pseudo = "Il faut mettre un mail";
                }
    
                if(empty($mdp)) {
                    $valid = false;
                    $er_mdp = "Il faut mettre un mot de passe";
                }
    
                // On fait une requête pour savoir si le couple pseudo/mdp existe bien
                $req = $DB->query("SELECT * FROM utilisateur INNER JOIN profil ON utilisateur.id = profil.id WHERE pseudo = ? AND mdp = ?",
                        array($pseudo, crypt($mdp, "$6$rounds=5000$macleapersonnaliseretagardersecret$")));
                $req = $req->fetch();
    
                if($req['id'] =="") {
                    $valid = false;
                    $er_mail = "Le pseudo ou le mot de passe est incorrect";
                }
    
                // S'il y a un résultat on charge la SESSION de l'utilisateur
                if($valid) {
                    //COMPTE
                    $_SESSION['id'] = $req['id'];
                    $_SESSION['pseudo'] = $req['pseudo'];
                    $_SESSION['perso'] = $req['perso'];
                    $_SESSION['mail'] = $req['mail'];
                    
                    //PROFIL
                    $_SESSION['prime'] = $req['prime'];
                    $_SESSION['niveau'] = $req['niveau'];
                    $_SESSION['argent'] = $req['argent'];
                    $_SESSION['points'] = $req['points'];
                    $_SESSION['puissance'] = $req['puissance'];
                    $_SESSION['equipage'] = $req['equipage'];
                    $_SESSION['fdd'] = $req['fdd'];
                    $_SESSION['titre'] = $req['titre'];
    
                    header('Location: index.php');
                    exit;
                }
            }
        }
    ?>

    Donc la partie qui nous intéresse est la requête, et la recupération dans la session des colonnes des tables (je connais pas le nom sorry).

    On a donc la première table :

     id étant la clé primaire, et mail une clé unique.

    Et la deuxième :

    Donc "normalement" les deux sont joints par l'id de la table utilisateur et de la profil qui sont les même. (Corrigés moi si je me trompe je débute).

    Donc ensuite dans une autre page la page profil, j'ai un formulaire avec un select avec lequel je veux changer le titre :

    <form class="formulaire-titre" method="post">
         <select name="titre" id="select-titre">
               <option>aucun</option>
               <option value="Créateur">Créateur</option>
         </select>
         <button class="bouton-titre" type="submit" name="changer-titre">ok</button>
    </form>

    Et le php qui me permet de le changer dans la session et dans la table profil(normalement) :

    <?php
        session_start();
        include("connexionDB.php");
    
        if ($_POST['value'] === "") {
            $_POST['value'] === NULL;
        }
        if(!isset($_SESSION['id'])) {
            header('Location: index.php');
            exit;
        }
        $image = $_SESSION['perso'] . '/' . $_SESSION['perso'] . '001';
    
        if(isset($_POST['changer-titre'])) {
            $n_titre = $_POST['titre'];
            $_SESSION['titre'] = $n_titre;
            $id = $_SESSION['id'];
            
            $DB->insert("UPDATE profil SET titre = $n_titre WHERE id = $id");
        }
        
    
    ?>

    Or bien que la session change, le titre dans la table ne change pas. Si je modifie dans la requête mysql id = $id par id = ? c'est pareil ça ne modifie pas la bdd. Pareil si je récupère l'id de la table utilisateur ou de la table profil. Mais si je change par id = 1. Là ça modifie pour la première ligne. Donc la requête en soi fonctionne sauf quand je veux modifier par l'id en cours d'utilisation.

    J'ai regardé en ligne, des personnes disent d'utiliser mysql_error(); pour savoir d'où vient l'erreur mais cette fonction m'indique une erreur dans vscode : undefined function mysql_error();

    Donc j'avoue que je suis perdu sur ce que je dois faire. Est-ce la jointure qui fait que je dois faire une requète spéciale ?

    Voilà, merci de m'aider je suis bloqué dessus depuis un petit moment et j'ai vraiment envie de trouver la solution.



    -
    Edité par EwenLefloch 4 avril 2022 à 21:44:17

    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2022 à 22:05:57

      Bonjour,

      EwenLefloch a écrit:

      "normalement" les deux sont joints par l'id de la table utilisateur et de la profil qui sont les même

      Deux clés primaires auto-incrémentées ne seront pas forcément égale. Les deux auto-incrément peuvent évoluer différemment en fonction de plusieurs facteurs, les tentatives d'insertions non faites par l'application, les erreurs d'insertions, etc.

      Selon moi, si tu veux qu'un utilisateur puisse ne pas avoir de données de profil, alors la clé primaire de la table profil ne doit pas être auto-incrémentée et doit être une clé étrangère vers la table utilisateur ...

      Ensuite, côté PHP il aurait plein plein plein de choses à dire ... Mais la première, essentielle, si tu mets :

      EwenLefloch a écrit:

      error_reporting(0);

      Alors ton script ne lèvera aucune erreur, jamais, même celle de PDO ... Donc commence par activer les erreurs PHP pour découvrir ce qu'il se passe.

      EwenLefloch a écrit:

      des personnes disent d'utiliser mysql_error(); pour savoir d'où vient l'erreur

      Cette fonction est liée à une série de fonctions obsolètes et disparue de PHP depuis plusieurs versions ... Dans ton code tu utilises la classe PDO pour communiquer avec ta base de données, et le paramètre PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING est suffisant, du moment que l'affichage des erreurs PHP est activé ...

      -
      Edité par Benzouye 4 avril 2022 à 22:09:24

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        5 avril 2022 à 9:15:21

        Bonjour, en effet j'avais totalement oublié que j'avais rajouter la ligne error_reporting(0); il y a plusieurs jours. Donc encore une erreur bête que j'aurai pu eviter ! Merci.

        En l'enlevant, les erreurs affichées sont :

        if ($_POST['value'] === "") {
            $_POST['value'] === NULL;
        }

        Autre erreur bête de ma part, d'écrire value au lieu de titre donc c'est corrigé.

        et aussi de déplacer ce if dans le if(isset($_POST['changer-titre']))

        Ce qui m'enlève l'erreur.

        Par contre la dernière erreur affichée est celle-ci :

        Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1 in C:\MAMP\htdocs\OPRPG\connexionDB.php on line 36

        Pour rappel mon update est ecrit :

         $DB->insert("UPDATE profil SET titre = $n_titre WHERE id = $id");


        et $id = $_SESSION['id']. Même erreur si je change $id par ? dans ma requête.

        Mais ce que je lis dans le manuel (rtfm on connait) c'est que WHERE s'écrit bien comme ça normalement...

        Lorsque j'enlève toute la partie :

        if ($_POST['value'] === "") {
            $_POST['value'] === NULL;
        }

        L'erreur affichée cette fois est :

        Warning: PDOStatement::execute(): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Aucun' in 'field list' in C:\MAMP\htdocs\OPRPG\connexionDB.php on line 36

        Donc Unknown column 'Aucun' c'est là où je suis perdu. Aucun est la value d'une des options du select. Donc je ne comprends pas pourquoi il cherche la value en tant que colonne alors que je dis bien SET titre dans ma requête...

        Par ailleurs, merci Benzouye pour ton aide ! J'ai pu me rendre compte de certains trucs idiots dans mon code !

        -
        Edité par EwenLefloch 5 avril 2022 à 9:37:44

        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2022 à 13:18:05

          Il faut encadrer tes variables avec des guillemets si tu ne veux pas qu'elles soient interprétées comme des noms de table ou de colonne.

          Le mieux restant de faire des requêtes préparées avec des marqueurs et en passant ton tableau $data à ta méthode insert.

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

          mysql UPDATE ne fonctionne pas vraiment

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown