Extraire les produits qui n'ont pas une qte dans un mois donnée

Fermé
LearnDeep Messages postés 67 Date d'inscription lundi 10 décembre 2018 Statut Membre Dernière intervention 21 août 2021 - 11 août 2021 à 20:02
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 13 août 2021 à 09:54
Bonjour ,
je suis nouveau dans php 7 , j'ai crée une table production qui contient id du produit , ligne , nom de produit(produit) champ date(format(Y-m-d)) , heure et un champ qte (quantité).

Aprés ça j'ai crée une requete qui permet d'extraire les produits et leurs informations dans chaque mois données (avec une boucle foreach) , mais la requete me donne seulement les produits qui ont un enregistrement dans le mois donnée.
Mon but est d'ajouter chaque produit qui n'a pas aucun enregistrement dans un mois données aux résultats de la requete et mettre la valeur qte a zéro.
le problème est que seulement les produits qui ont une quantité dans un mois s'affichent , pour les autres mois on ne trouve pas ce produit et sa qte a zéro.

le but final est d'afficher les produits un par un pour chaque mois et si on ne trouve pas un enregistrement dans un mois donnée on affiche tous les informations du produit mais avec une qte est égale a zéro,
J'ai essayé pour deux jours mais tous ce que j'ai trouvé est les produits qui ont déja un enregistement dans un mois donnees.

   public function getProductsStatsByMonths(){
    $today =  date("Y-m-d"); 
    $date_arr = explode("-", $today);  
    $year = $date_arr[0];
    $month = $date_arr[1];
    $day = $date_arr[2];
 
    $prods = array();
    $months = array(
    1 ,
    2 ,
    3 ,
    4 ,
    5 ,
    6 ,
    7 ,
    8 ,
    9 ,
    10 ,
    11 ,
    12
 );

    foreach ($months as $month){
        $stmt = $this->conn->prepare("SELECT sum(qte) as total,ligne, produit,date,heure,qte FROM production where YEAR(date) = ? and MONTH(date) = ? group by LOWER(ligne) ");
        $stmt->execute([$year,$month]);

        while( $row = $stmt->fetch(pdo::FETCH_ASSOC)){
            array_push($prods, new ProductionByMonth(0,$row["ligne"],$row["produit"],$row["date"],$row["heure"],$row["qte"],$month,$year));
        }
    }

  
    echo json_encode($prods);
   


   }



Tous les résultas que j'ai obtenu:


[
    {
        "id": 0,
        "ligne": "Biscuit",
        "produit": "Major",
        "date": "2021-08-11",
        "heure": "10:00",
        "qte": "130",
        "month": 8,
        "year": "2021"
    },
    {
        "id": 0,
        "ligne": "Eau",
        "produit": "Safia 1.5",
        "date": "2021-08-11",
        "heure": "14:00",
        "qte": "200",
        "month": 8,
        "year": "2021"
    },
    {
        "id": 0,
        "ligne": "Lait",
        "produit": "Vitalait 1/2",
        "date": "2021-08-11",
        "heure": "8:00",
        "qte": "80",
        "month": 8,
        "year": "2021"
    },
    {
        "id": 0,
        "ligne": "Salami",
        "produit": "Mazraa",
        "date": "2021-08-11",
        "heure": "8:00",
        "qte": "100",
        "month": 8,
        "year": "2021"
    },
    {
        "id": 0,
        "ligne": "Yaourt",
        "produit": "Delice",
        "date": "2021-08-11",
        "heure": "12:00",
        "qte": "150",
        "month": 8,
        "year": "2021"
    }
]



On peut observer que le dernier enregistement par exemple a une qte seulement dans le mois 8 mais dans les autres mois il n'a pas, l'objectif est d'afficher ce meme produit pour tous le autres mois mais avec une qte est égale a zéro.
J'ésprere que quelqun peut m'aider et pardonnez moi pour ma langue Français parceque je parle l'Anglais beaucoup mieux.
A voir également:

2 réponses

yg_be Messages postés 23236 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 octobre 2024 Ambassadeur 1 539
12 août 2021 à 08:19
bonjour,
je pense que ta base de données est mal conçue. moi je travaillerais avec trois tables:
une table produits
une table mois
une table production

ce qui me permettrait de faire une requête qui me fournit le résultat attendu.
1
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
12 août 2021 à 09:14
Bonjour,

Exécuter une requête sql dans une boucle est souvent une mauvaise pratique si on peut faire autrement. Dans ton cas on peut facilement remplacer la boucle et les 12 requêtes en une seule.

Pour récupérer tous les enregistrements pour lesquels la colonne month peut avoir plusieurs valeurs, il faudrait plutôt utiliser l'opérateur IN à la place de l'opérateur = dans la clause WHERE de la requête sql.
Par exemple au lieu d'exécuter 12 fois la requête dans la boucle :
SELECT * FROM production WHERE MONTH(date) = 1
SELECT * FROM production WHERE MONTH(date) = 2
//etc...


On peut exécuter une seule requête équivalente comme ceci :
SELECT * FROM production WHERE MONTH(date) IN (1, 2, 3, etc...)


Ce qui pourrais donner pour ton code :
// [...]
$prods = array();
$months = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); 
$monthsString = implode(', ', $months); // string(37) "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12"

$stmt = $this->conn->prepare("SELECT sum(qte) as total,ligne, produit,date,heure,qte FROM production where YEAR(date) = ? and MONTH(date) IN (?) group by LOWER(ligne) ");
$stmt->execute([$year, $monthsString]);

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($results as $row){
    array_push($prods, new ProductionByMonth(0,$row["ligne"],$row["produit"],$row["date"],$row["heure"],$row["qte"],$month,$year));
}

echo json_encode($prods);


Si tu veux récupérer tous les enregistrements peu importe la valeur de month, tu peux simplement supprimer la clause WHERE sur cette colonne, soit :
// [...]
$prods = array();

$stmt = $this->conn->prepare("SELECT sum(qte) as total,ligne, produit,date,heure,qte FROM production where YEAR(date) = ? group by LOWER(ligne) ");
$stmt->execute([$year]);

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($results as $row){
    array_push($prods, new ProductionByMonth(0,$row["ligne"],$row["produit"],$row["date"],$row["heure"],$row["qte"],$month,$year));
}

echo json_encode($prods);


Bonne journée,
0
LearnDeep Messages postés 67 Date d'inscription lundi 10 décembre 2018 Statut Membre Dernière intervention 21 août 2021
12 août 2021 à 11:56
Bonjour , merci pour la réponse , je veux dire que les produits enregistrés enregistrés dans la base de données sont seulement qui ont une qte > 0 , mon but est de copier coller ces produits pour les mois que ces produits ne sont pas liés et mettre la valeure qte a zéro , est ce que cette solution peut faire ça?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524 > LearnDeep Messages postés 67 Date d'inscription lundi 10 décembre 2018 Statut Membre Dernière intervention 21 août 2021
12 août 2021 à 14:05
Je ne suis pas sûr d'avoir bien compris ta demande. Quand tu indiques "mon but est de copier coller les produits pour les mois [sans produits ?] et mettre la valeur qte à 0", est-ce tu veux dupliquer les enregistrements dans la base ou seulement mettre à jour les enregistrements déjà présents dans la base ?

Si il s'agit du deuxième cas, il faudrait faire une requête UPDATE par exemple comme ceci :
UPDATE production SET qte = 0 WHERE month = null

Je suppose que la valeur est null si la colonne month n'est pas renseigné dans l'enregistrement. Si il s'agit d'une chaine vide, il faudra corriger la comparaison dans la clause where (WHERE month = '').
0
yg_be Messages postés 23236 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 octobre 2024 1 539 > Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022
12 août 2021 à 21:19
la demande me semble claire, je pense que tu l'entraines, depuis le début, sur de fausses pistes.
prends le temps de relire la demande initiale.
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524 > yg_be Messages postés 23236 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 octobre 2024
13 août 2021 à 09:54
En effet merci pour le rappel yg_be et désolé LearnDeep, j'ai lu trop vite et les solutions que j'ai proposées ne correspondent pas à la demande initiale.

La première remarque de yg_be est la meilleure réponse, tu devrais vraiment suivre son conseil et réorganiser tes données dans plusieurs tables en utilisant le modèle relationnel.
Avoir une base avec des données bien organisées va beaucoup simplifier les traitements en php.
0