Initialisation d'un champ de database MySQL de type JSON

Résolu
Gutt-V Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -  
Gutt-V Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -

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 !

A voir également:

2 réponses

Gutt-V Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   1
 

Bon,

J'ai fini par trouver, je pose le code ici pour ceux qui se poseraient la question :

   //initialise l'enregistrement 
        $req = "INSERT INTO {$this->table} (`data1` ,`data2` ,`data3`) VALUES ($this->data1, :$this->data2, JSON_ARRAY('$data3')) 
        $this->db->query($req, null, true);
 //rajoute des éléments à l'array
        $req = "UPDATE {$this->table} SET data3 = JSON_ARRAY_APPEND(data3,'$[0]', :data3) 
        WHERE data1= :data1 AND data2= :data2";
        $this->db->query($req, null, true)

Ok, je passe sans requête préparée pour tester, mais c'est pour donner une idée

1
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

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
Gutt-V Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   1
 

En fait c'est ce que j'ai fait (je suis sous Laragon donc HeidiSQL, mais c'est pareil) et il ne se ^passe rien, pas d'erreur pas de mise à jour. Ma data3 reste à NULL.

Alors que je voudrais un tableau de string.

0