IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Envois d'un tableau dans une requête SQL [PHP 7]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Débutant
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Débutant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Envois d'un tableau dans une requête SQL
    Bonjour à tous,

    Je viens vous faire part d'un problème un peu compliqué qui me bloque depuis maintenant 2 jours, je vous avoue que je suis à court de solution (et de patience). Je vais essayer de vous expliquer ça de la manière la plus simple possible.

    J'ai une page de liste de produit que l'utilisateur peut ajouter dans un panier (avec sa quantité). Je récupère les données de l'utilisateur dans un tableau que je sérialize afin d'envoyer de les envoyer dans ma base de données. Le problème, c'est que je ne m'en sort pas pour récupérer ses ****** de données.
    Ma table panier comporte 2 champs : users_id et products (en TEXT). Quand je poste un produit, j'obtiens l'id de l'utilisateur qui l'a posté, et ça c'est parfait, mais rien dans mon champ produit. Voici le code que j'ai produit jusqu'alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // Si products est vide, j'initialize un tableau vide
    $panier = ($ordersModel->getUserPanier($user->id) && $ordersModel->getUserPanier($user->id)->products) ? unserialize($ordersModel->getUserPanier($user->id)->products) : array();
     
    // Je récupère la liste de mes produits en base de données
    $products_list = $productModel->findAll();
     
     
    // Je vérifie si mon post existe et n'est pas vide, je push dedans un tableau avec l'id du produit et la quantité
    if (isset($_POST) && !empty($_POST)) {
     
     
        $tab = [$_POST["product_id"] . "a" => ["qt" => $_POST["qt"]]];
     
        $post = $_POST;
     
        if (existPanier($post, $panier)) {
            $index = $_POST["product_id"] . "a";
            unset($panier[$index]);
            $tab2 = array_merge($panier, $tab);
     
     
        } else {
            $tab2 = array_merge($panier, $tab);
     
        }
     
    }
     
     
    function existPanier($post, $panier)
    {
        return isset($post["product_id"]) && array_key_exists($post["product_id"] . "a1", $panier);
    }
     
    //$test = existPanier($post, $panier).$ordersModel->addPanier($user->id,[$_POST["product_id"]]);
    $test = existPanier($panier,$post).$ordersModel->addPanier($user->id,[$_POST["product_id"] . "a" => ["qt" => $_POST["qt"]]]);

    J'essaie sur le $test de passer ma requête en utilisant ma fonction "existPanier" ainsi que ma fonction qui contient ma requête. Je vous poste ci dessous les deux requêtes dont je me sert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     // Ajouter un produit dans un panier
     
        public function addPanier($users_id, $products){
     
            $req = $this->pdo->prepare("INSERT INTO panier(users_id, products) VALUES (?, ?)");
            $req->execute([$users_id, $products]);
     
        }
     
        // Afficher le panier d'un utilisateur
     
        public function getUserPanier($users_id){
            $req = $this->pdo->prepare("SELECT * FROM panier WHERE users_id = ?");
            $req->execute([$users_id]);
            $data = $req->fetch();
            if(!empty($data)){
                return $data;
            }else{
                $data = [];
                return $data;
            }
        }
    Je bloque complètement sur l'envois de mes données dans ma table panier, il ne me manque pas grand chose pour y arriver, ça commence à me rendre fou ! Je vous remercie d'avance pour aide qui sera précieuse ! Hésitez pas si vous avez besoin de précisions supplémentaire, j'ai conscience que mes explications peuvent paraître assez brouillonne !

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut,

    je pense que tu as oublié une étape et comme t'es en PHP 7 sers toi du typage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function addPanier(int $users_id, array $products)
    {
        $stmt = $this->pdo->prepare("INSERT INTO panier(users_id, products) VALUES (:id, :data)");
        $stmt->bindValue(':id', $users_id, PDO::PARAM_INT);
        $stmt->bindValue(':data', serialize($products), PDO::PARAM_STR);
        return $stmt->execute();
    }
    Tu as juste oublié de sérialiser ton panier.

    Ensuite tu peux améliorer ton code surtout que tu es sous PHP 7 qui a apporté un paquet de sucres syntaxiques

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    j'ai repris ton code du mieux que j'ai pu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // Si products est vide, j'initialize un tableau vide
    $cart = ($ordersModel->getUserPanier($user->id) && $ordersModel->getUserPanier($user->id)->products)
                ? unserialize($ordersModel->getUserPanier($user->id)->products)
                : [];
     
    // Je récupère la liste de mes produits en base de données$
    $products_list = $productModel->findAll();  // POURQUOI ?
     
    if (isset($_POST['product_id'], $_POST['qt'])) {
        $pid = $_POST['product_id'];
        $qty = (int)$_POST['qt']; // je considère que les quantités sont des entiers
        // ajout dans le panier de [produit_id => quantité]
        $cart[$pid] = $qty;
        saveCart($ton_user_id, $cart); // ...
    }
     
    public function saveCart(int $users_id, array $cart)
    {
        $stmt = $this->pdo->prepare("INSERT INTO panier(users_id, products) VALUES (:id, :data)");
        $stmt->bindValue(':id', $users_id, PDO::PARAM_INT);
        $stmt->bindValue(':data', serialize($cart), PDO::PARAM_STR);
        return $stmt->execute();
    }
    Il y a des question dedans

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Débutant
    Inscrit en
    Janvier 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Débutant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Alors j'ai réussi, je poste le code ci dessous, en fait j'utilise mal le serialize, ce qui fait que le résultat de ma requête me retournait un array dans le champ products.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    panier = ($ordersModel->getUserPanier($user->id) && $ordersModel->getUserPanier($user->id)->products) ? unserialize($ordersModel->getUserPanier($user->id)->products) : array();
     
     
    $products_list = $productModel->findAll();
     
     
    if (isset($_POST) && !empty($_POST)) {
     
     
        $tab = [$_POST["product_id"] . "a" => ["qt" => $_POST["qt"]]];
     
        $post = $_POST;
     
     
     
        if (existPanier($post, $panier)) {
            $index = $_POST["product_id"] . "a";
            unset($panier[$index]);
     
            $tab2 = array_merge($panier, $tab);
            $test = existPanier($panier,$post).$ordersModel->addPanier($user->id,serialize([$_POST["product_id"] . "a" => ["qt" => $_POST["qt"]]]));
     
     
     
     
     
        } else {
            $tab2 = array_merge($panier, $tab);
            $test = existPanier($panier,$post).$ordersModel->addPanier($user->id,serialize([$_POST["product_id"] . "a" => ["qt" => $_POST["qt"]]]));
     
     
        }
     
    }
     
     
    function existPanier($post, $panier)
    {
        return isset($post["product_id"]) && array_key_exists($post["product_id"] . "a1", $panier);
    }
    Et voici les paramètres de mes requêtes avec le serialize, ce qui me donne les données que je souhaitait obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
       // Ajouter un produit dans un panier
     
        public function addPanier($users_id, $products){
     
            $req = $this->pdo->prepare("INSERT INTO panier(users_id, products) VALUES (?, ?)");
            $req->execute([$users_id, serialize($products)]);
     
        }
     
        // Afficher le panier d'un utilisateur
     
        public function getUserPanier($users_id){
            $req = $this->pdo->prepare("SELECT * FROM panier WHERE users_id = ?");
            $req->execute([$users_id]);
            $data = $req->fetch();
     
            if(!empty($data)){
                $data->products = unserialize($data->products);
                return $data;
            } else{
                $data = [];
                return $data;
            }
        }
    En ce qui concerne la ligne $products_list = $productModel->findAll();, c'est par rapport à ma vue. J'affiche les produits sous forme de card avec bootstrap, du coup je fais appel à ma fonction findAll() qui contient ma requête pour afficher tout les produits en base de données. Je suis allé faire un foreach dans ma vue pour les afficher.

    Prochaine étape : Afficher tout les produits que l'utilisateur à ajouté au panier sans générer une nouvelle ligne à chaque dans ma BDD. Merci pour ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Erreur dans une requête sql
    Par Goundy dans le forum PHP & Base de données
    Réponses: 37
    Dernier message: 30/01/2006, 16h08
  2. [SQL] Récupérer des variables de formulaire dans une requête SQL
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/11/2005, 18h44
  3. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59
  4. Nom de champ variable dans une requête SQL
    Par stip dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2004, 18h02
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo