Initialisation d'un champ de database MySQL de type JSON

Gutt-V Messages postés 23 Date d'inscription mercredi 26 juin 2024 Statut Membre Dernière intervention 28 octobre 2024 - 28 oct. 2024 à 10:02
jordane45 Messages postés 38263 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 octobre 2024 - 28 oct. 2024 à 16:22

Bonjour,

J'ai, une nouvelle fois, besoin de vos lumières.

Cette fois, je m'attaque au type de données JSON de la base de données MySQL.

Je crois avoir compris qu'il faut, avant tout, initialiser le champ de type JSON s'il est NULL.

Pour cela, j'ai le code suivant :

        //initialise l'enregistrement si null
        $req = "UPDATE {$this->table} SET data3= JSON_SET(data3,'$.preferences',JSON_ARRAY()) 
        WHERE data1= :data1AND data2 = :data2 AND JSON_TYPE(data3->'$.preferences') IS NULL";
        $this->db->prepare($req, [':data1' => $this->data1, ':data2' => $this->data2], $this->class, true);
 
        $req = "UPDATE {$this->table} SET data3 = JSON_ARRAY_INSERT(data3,'$.preferences[0]', :data3) 
        WHERE data1= :data1 AND data2= :data2";
        $this->db->prepare($req, [':data3' => $this->data3, ':data1' => $this->data1, ':data2' => $this->data2], $this->class, true);

Je précise que j'ai plusieurs fois vider le cache, que ma $this->db fonctionne très bien, mais que je n'arrive pas à insérer la moindre donnée dans data3 ..

Pour complèter, même si, pour moi, la cause n'est pas là, je vous met la procédure prepare de mon $this->db :

     * Prepare
     * @param string $statement requète à passer
     * @param array $attributes paramètres pour le execute
     * @param string $class_name nom de la classe dans laquelle retourner les données
     * @param bool $unique true si un seul résultat attendu false si FetchAll
     * @return mixed
     */
    public function prepare(string $statement, array $attributes, string $class_name = null, $unique = false)
    {
        try {
            $requete = $this->getPDO()->prepare($statement);
            dump($class_name);
            if ($class_name === null) {
                $requete->setFetchMode(PDO::FETCH_OBJ);
            } else {
                $requete->setFetchMode(PDO::FETCH_CLASS, $class_name);
            }
            $res = $requete->execute($attributes);

            if (strpos($statement, 'UPDATE') === 0 || strpos($statement, 'INSERT') === 0 || strpos($statement, 'DELETE') === 0) {// pas de données à renvoyer
                return $res;
            }
            if ($unique) {
                $datas = $requete->fetch();
            } else {
                $datas = $requete->fetchAll();
            }
            return $datas;
        } catch (\Exception $e) {
            throw new \Exception("Impossible d'effectuer la requête : " . $statement . " : " . $e->getMessage());
        }

    }

Dernière précision,

Ma database est une mysql composée de 3 champs :

data1 : INT de taille 10 non signé

data2 : VARCHAR de taille 200 NULL autorisé

data3 JSON NULL autorisé

Merci d'avance pour essayer d'éclairer ma lanterne !

1 réponse

jordane45 Messages postés 38263 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 octobre 2024 4 693
28 oct. 2024 à 16:22

Bonjour,

Commence par tester ta requête DIRECTEMENT dans ta bdd ( via phpmyadmin par exemple) pour t'assurer de la syntaxe...

Une fois que ça marchera.. là tu pourras coder ta requête via le PHP ....


0