Salut à tous !

J'aurais juste une petite question sur la bonne marche à suivre pour la soustraction en PHP, sur mon "site" les commandes sont fictives et fonctionnent en points et certains utilisateurs ont des points gratuits.

Je m'explique, un produit vaut par exemple 20 points, il est possible que l'utilisateur ai 10 points "gratuits" déjà sur son compte.

Dans ma table des produits chacun vaut un certain nombre de points
Dans ma table des commandes je fais le lien avec les items commandés et leur nombre de points dans la table produits

J'obtiens le total des points avec:

$row = $this->DB->query('SELECT SUM(produits.points) AS total FROM commandes JOIN produits WHERE commandes.service = produits.id AND commandes.numero = ?', [$time], true);
$totalPoints = $row['total'];

Concernant les points gratuits ils se trouvent dans une autre table qui regroupe plusieurs infos:

$points_gratuits = $this->DB->query('SELECT points_gratuits AS pg FROM gratuit WHERE domaine = ?', [$domaine], true); 
$gratuit = $points_gratuits['pg']; 

A chaque commande je vais donc déjà faire une condition pour savoir si la personne a des points gratuits ou non et ensuite si c'est le cas faire la différence entre ces points gratuits et le total de sa commande, par contre si la commande vaut plus "chère" sur son nombre de points restants comment ça se passe ?

Est-ce qu'il y a un moyen simple de prendre dans un premier temps dans les points gratuits et ensuite avoir le nombre de points reellements utilisés

Merci d'avance pour votre aide !

8 réponses


Jenjak
Auteur
Réponse acceptée

Salut !

@SLK: oui ça fonctionne parfaitement ! le substr() me sert effectivement à enlever le signe négatif

if($gratuit >= $totalPoints){
      $difference = $gratuit-$totalPoints;
      $this->DB->query("UPDATE gratuit SET points_gratuits ='$difference'  WHERE domaine = ?", [$domaine], true);
      $this->DB->query("INSERT INTO livraison (commande, pg, pp) VALUE ('$time', '$difference', '0')");
} else {
      $difference2 = $gratuit-$totalPoints;
      $this->DB->query("UPDATE gratuit SET points_gratuits ='0'  WHERE domaine = ?", [$domaine], true);
      $points_util = substr($difference2,1);
      $this->DB->query("INSERT INTO livraison (commande, pg, pp) VALUE ('$time', '$gratuit', '$points_util')");
}

OK Carouge10, je regarde la méthode en multipliant par -1 :)

Bonjour,
Il suffit de faire un conditions entre le total de points et tes points gratuits.

if($totalPoints >= $gratuit){
    // Je mets à jour la table des points gratuits avec en retirant le total de points
} else {
    // Action à faire en cas de manque de points gratuits
}
Jenjak
Auteur

Salut Carouge10, merci pour ta réponse, je m'étais déjà imaginé ce principe simple, mais par contre comme je le vois soit il y a assez de points gratuits et on soustrait le total, soit il n'y en a pas assez et on va directement faire l'autre action.

Par exemple, il reste 20 points gratuits, la personne va faire une commande sur 30 points, il faudrait donc que les 20 points gratuits soient soustraits et qu'ensuite il ne "paye" sur 10 points

if($gratuit >= $totalPoints){
    $difference = $gratuit-$totalPoints;
    // ici ma requete pour faire la différence entre les points gratuits restants et le total des points
} else {
    echo "Vous avez payé $nb_points_payants";
    // ici ma requete qui va inserer dans la table commande les points hors gratuits
}
Jenjak
Auteur

Hello, du coup j'ai fais un truc un peu à ma sauce, ça n'est pas du tout optimisé et je ne sais pas si c'est la bonne marche à suivre mais ça à l'air de fonctionner

if($gratuit >= $totalPoints){
      $difference = $gratuit-$totalPoints;
      $this->DB->query("UPDATE gratuit SET points_gratuits ='$difference'  WHERE domaine = ?", [$domaine], true);
      echo "points gratuits restants: $difference";
} else {
      $difference2 = $gratuit-$totalPoints;
      echo "points gratuits utilisés: $gratuit<br /><br />";
      $this->DB->query("UPDATE gratuit SET points_gratuits ='0'  WHERE domaine = ?", [$domaine], true);
      $points_util = substr($difference2,1);
      echo "points utilisés: $points_util";
}

Bonsoir,
c'est bon.
Je n'ai pas d'idée pour optimiser la requête

Salut,

dans le 'else',
il faut aussi 'update' le champ 'points_payants'.

Je crois comprendre que tu veux enlever le signe négatif avec le substr() ?
Si oui, il me semble qu'il faut mettre '0' en 2ème paramètre.
la ligne echo "points utilisés: $points_util"; affiche ce qu'il faut ??

Si c'est pour avoir les points utilisés, il y a plus simple et moins complexe.
Il suffit de multiplier $difference2 par -1

Je suis bien d'accord ^^