Résolu Formulaire avec plusieurs valeurs (JSON)

73V3N9!V3N

Membre
Inscription
19 Octobre 2018
Messages
23
Réactions
2
Points
5 144
Bonjour à tous,
J'ai encore un problème mais cette fois-ci plus léger à résoudre, je m'explique.
J'ai mon formulaire de type POST, jusqu'à la tout fonctionne bien, j'encode mes données en JSON puis je les envoies à la vérification.
Le problème, c'est que j'ignore comment décodé la valeur (json_decode ne fonctionne pas).
Je précise tout de même, qu'il s'agit d'une valeur pouvant contenir plusieurs données.

Un exemple ci-dessous :
Sans titre 1.png
< Les 2 badges ont été sélectionnés.
Sans titre 2.png
Je récupère donc ça < comment l'exploiter par exemple, dans une requête vérifier si le badge existe ?

Je récupère donc correctement la valeur du moins presque, je décode ça avec json_decode mais je me retrouve avec un truc du style [VIP] ces [ & ] pose problème.
Comment les retirer ? Comment faire pour vérifier 2 valeurs (unique l'un l'autre) dans une seule requête PDO.

Merci pour votre aide, c'est vraiment embêtant d'être coincé là-dessus, je ne peux plus avancer dans mon projet.
 

73V3N9!V3N

Membre
Inscription
19 Octobre 2018
Messages
23
Réactions
2
Points
5 144
Un petit extrait de ton code PHP n'est pas de refus :p json_decode fonctionne bien, c'est sûrement toi qui l'utilise mal ou qui décode la mauvaise variable... Tu as essayé de debug ton code ?
Salut, je te donne ça, en effet, j'ai debug plusieurs fois, la valeur de "badges" retourne [lavaleur].

PHP:
if(isset($_SESSION['id'])) {
    $json = file_get_contents('php://input');
    $data = json_decode($json);
    if(isset($data->badges)) {
        $ThisPDO = $pdo->query('SELECT * FROM user_badges WHERE user_id = ? AND badge_id = ?', [$_SESSION['id'], $data->badges]);
        if($ThisPDO->rowCount() == 1) {
            $response = array('error' => false, 'message' => 'Les modifications ont bien été prises en compte.', 'saved_data' => []);
        } else {
            $response = array('error' => true, 'message' => json_decode($data->badges, true), 'saved_data' => []);
        }
    }
}

En sachant que ça me retourne une erreur, je debug le message depuis "message".
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
Tu peux me montrer la partie du code JS qui envoie la data aussi s'il te plaît ? :p
Et un petit screen du contenu de tes variables $json et $data avec le debugger ou avec var_dump (juste avant de passer dans le if)

PS: Par convention, ta variable "$ThisPDO" devrait s'appeler $thisPdo ; on nomme les variables en camel case (première lettre minuscule puis chaque mot commence par une majuscule).
PS2: Ta variable $thisPdo devrait avoir un nom plus explicite. Vu que c'est une requête qui a un but précis tu devrais l'appeler par exemple $getUserBadge
PS3: On utilise plus la notation "array('blabla', 2, null)" mais plutôt "['blabla', 2, null]" :p
PS4: Ton saved_data est similaire dans les 2 cas et est un tableau vide. Soit l'information est inutile soit tu pourrais gérer le truc mieux en évitant la redondance d'information. Par exemple en créant le tableau $response = ['saved_data' => []] et en faisant un array_push ou un merge avec le message et le error par exemple
PS5: On n'utilise JAMAIS query() pour une requête avec des paramètres ! On utilise d'abord prepare() puis execute() avec en paramètre le tableau des valeurs à bind...
 
Dernière édition:

73V3N9!V3N

Membre
Inscription
19 Octobre 2018
Messages
23
Réactions
2
Points
5 144
Tu peux me montrer la partie du code JS qui envoie la data aussi s'il te plaît ? :p
Et un petit screen du contenu de tes variables $json et $data avec le debugger ou avec var_dump (juste avant de passer dans le if)

PS: Par convention, ta variable "$ThisPDO" devrait s'appeler $thisPdo ; on nomme les variables en camel case (première lettre minuscule puis chaque mot commence par une majuscule).
PS2: Ta variable $thisPdo devrait avoir un nom plus explicite. Vu que c'est une requête qui a un but précis tu devrais l'appeler par exemple $getUserBadge
PS3: On utilise plus la notation "array('blabla', 2, null)" mais plutôt "['blabla', 2, null]" :p
PS4: Ton saved_data est similaire dans les 2 cas et est un tableau vide. Soit l'information est inutile soit tu pourrais gérer le truc mieux en évitant la redondance d'information. Par exemple en créant le tableau $response = ['saved_data' => []] et en faisant un array_push ou un merge avec le message et le error par exemple
PS5: On n'utilise JAMAIS query() pour une requête avec des paramètres ! On utilise d'abord prepare() puis execute() avec en paramètre le tableau des valeurs à bind...
Salut,
Je te ça :
PHP:
string(24) "{"badges":["ADM","VIP"]}"
object(stdClass)#5 (1) {
  ["badges"]=>
  array(2) {
    [0]=>
    string(3) "ADM"
    [1]=>
    string(3) "VIP"
  }
}

JavaScript:
removeBadges: function() {
    var e = this;
    if (this.loading)
        return this.$parent.$parent.flashError([{
            error: !0,
            message: "Une suppression est déjà  en cours... Merci de patienter."
        }]);
    this.loading = !0,
    axios.post(this.routes["do.user.store.data"], {
        badges: this.selected
    }).then((function(t) {
        e.loading = !1,
        e.$parent.$parent.flashError([{
            error: t.data.error,
            message: t.data.message
        }]),
        t.data.error || (t.data.unableToBeDeleted.length > 0 && (1 == t.data.unableToBeDeleted.length ? e.$parent.$parent.flashError([{
            error: !0,
            message: "Le badge " + t.data.unableToBeDeleted[0] + " n'a pas pu être supprimé car il a été acheté en boutique."
        }]) : e.$parent.$parent.flashError([{
            error: !0,
            message: "Les badges " + t.data.unableToBeDeleted.join(", ") + " n'ont pas pu être supprimés car ils ont été achetés en boutique."
        }])),
        t.data.saved.forEach((function(t) {
            e.$store.commit("REMOVE_USER_BADGE", {
                badge_code: t
            })
        }
        )),
        e.selected = [])
    }
    ))
}

Je retiens ce que tu me dis, je ferais les modifications nécessaires :)
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
Ton code a l'air bizarre :mmh:
Ta page PHP l'objectif c'est de supprimer un ou plusieurs badges ? Pourquoi ta requête c'est un SELECT alors que ça devrait être un DROP ?
Ensuite effectivement il faut corriger ta requête car celle-ci ne marchera que pour un seul badge et pas plusieurs.

Est-ce que tu as discord ou teamviewer ? Il faudrait qu'on regarde ça ensemble car c'est pas du tout compliqué à faire :p
 

73V3N9!V3N

Membre
Inscription
19 Octobre 2018
Messages
23
Réactions
2
Points
5 144
Ton code a l'air bizarre :mmh:
Ta page PHP l'objectif c'est de supprimer un ou plusieurs badges ? Pourquoi ta requête c'est un SELECT alors que ça devrait être un DROP ?
Ensuite effectivement il faut corriger ta requête car celle-ci ne marchera que pour un seul badge et pas plusieurs.

Est-ce que tu as discord ou teamviewer ? Il faudrait qu'on regarde ça ensemble car c'est pas du tout compliqué à faire :p
Salut,
Oui, pas de problème, voici mon discord : 7evenGiven#9758
Le select, vérifie que le badge existe ou non chez l'utilisateur, le DROP je l'ai retiré volontairement car déjà la requête bloque à cet endroit là (SELECT).
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
Salut,
Oui, pas de problème, voici mon discord : 7evenGiven#9758
Le select, vérifie que le badge existe ou non chez l'utilisateur, le DROP je l'ai retiré volontairement car déjà la requête bloque à cet endroit là (SELECT).
On va regarder ça ensemble, en tout cas il y a l'air d'avoir quelques petites coquilles là-dedans :p
Je t'ai rajouté :ok:
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
Le problème venait du fait qu'il passait $data->badges en paramètre de sa requête (et qu'il utilisait un "=" au lieu d'un "IN").
$data->badges est un array, sauf que dans sa requête le paramètre attendu est un string.

On a juste du coup fait transformé l'array en string avec implode ($badges = implode("','" $data->badges)), rajouté un "IN('?')" dans la requête et remplacé le paramètre dans la requête par $badges pour la faire fonctionner :p
Résolu :ok:
 
Dernière édition:
Cette réponse a aidé l'auteur de cette discussion !

73V3N9!V3N

Membre
Inscription
19 Octobre 2018
Messages
23
Réactions
2
Points
5 144
Le problème venait du fait qu'il passait $data->badges en paramètre de sa requête.
$data->badges est un array, sauf que dans sa requête le paramètre attendu est un string.

On a juste du coup fait transformé l'array en string avec implode ($badges = implode(',' $data->badges)) et remplacé le paramètre dans la requête par $badges pour la faire fonctionner :p
Résolu :ok:
Merci encore :tchuss:
 

Paul GTP

Légende vivante
VIP
Inscription
15 Août 2013
Messages
6 194
Réactions
7 545
Points
24 772
Finalement ça ne fonctionnait pas, du coup on a fait autrement. PDO est pas prévu pour gérer les arrays, du coup on a un peu feinté
Je laisse des commentaires à chaque ligne pour ceux qui voudraient comprendre le code...
Code:
$in = str_repeat('?,', count($data->badges) - 1) . '?'; // On crée un "?" pour chaque badge qui existe
$query = "DELETE FROM user_badges WHERE user_id = ? AND badge_id IN ({$in})"; // On prépare la requête en y insérant le bon nombre de paramètres à binder
$params = array_merge(
    [$id],
    $data->badges
); // On créé le tableau de paramètres qu'on va binder avec en premier le user_id et en deuxième la liste des badges en concaténant 2 tableaux (le tableau des badges et un tableau contenant l'id de l'utilisateur)

// On prépare et exécute notre requête avec les éléments ci-dessus
$deleteBadges = $db->prepare($query);
$deleteBadges->execute($params);
 
Haut