Sommare i prezzi dei prodotti aggiunti al carrello di diverse aziende con Select sum php mysqli

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Ciao a tutti,
sto cercando di sommare i prezzi dei prodotti aggiunti al carrello e che fanno parte di diverse aziende.
Il risultato che vorrei ottenere è il totale dei prezzi relativi ai prodotti aggiunti al carrello di ogni singola azienda.
Ho provato in vari modi ma non riesco ad ottenere la somma ma solo i singoli prezzi dei prodotti.

PHP:
foreach ($_SESSION["cart_products"] as $cart_itm)
{
    $product_code = $cart_itm["product_code"];
    $coupon_shop = $cart_itm["coupon_shop"];
      
        $resultsomma = mysqli_query($conn,"SELECT SUM(prezzo_reale) AS total FROM coupons_coupons WHERE coupon_id=$product_code and coupon_shop=$coupon_shop");
                      
     while($rowsomma = $resultsomma->fetch_assoc()) {
$somma =$rowsomma['total'];
    echo "SHOP $coupon_shop TOT $somma<br>";                  
    }
Il risultato che ottengo è
SHOP 1 TOT 7.00
SHOP 1 TOT 14.00
SHOP 1 TOT 7.00
SHOP 10 TOT 1.00

mentre a me servirebbe ottenere il seguente risultato:
SHOP 1 TOT 28.00
SHOP 10 TOT 1.00

Dove sto sbagliando?
 

marino51

Utente Attivo
28 Feb 2013
2.917
164
63
Lombardia
puoi usare la stessa logica della soluzione precedente,

all'interno del loop ottieni 4 array
PHP:
    $coupon_shop[]    = $cart_itm["coupon_shop"];
    $product_code[]   = $cart_itm["product_code"];

    $product_qta[]    = $cart_itm["product_qta"];
    $product_prezzo[] = "SELECT prezzo ...."
dopo il loop trovi l'array univoca ed usandola, sommi i prezzi * qta
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Buonasera,
scusami Marino, ma non riesco a comprendere la query posso farla nell'array? per favore potresti farmi un esempio? Grazie
 

marino51

Utente Attivo
28 Feb 2013
2.917
164
63
Lombardia
no la query la esegui normalmente, il suo risultato (prezzo) lo inserisci nell'array

rettifica, visto che usi mysqli, si puoi farlo

PHP:
    $query = "SELECT ....
    $product_prezzo[] = $conn->query($query)->fetch_row()[0];
 
Ultima modifica:

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Ho fatto in questo modo ma ottengo solo il totale della prima azienda e con risultati multipli. Dove sbaglio?
PHP:
$couponshopX = array();
$somma= array();
foreach ($_SESSION["cart_products"] as $cart_itm)
{
    $product_code = $cart_itm["product_code"];
    $coupon_shop = $cart_itm["coupon_shop"];
        $product_qty = $cart_itm["product_qty"];
            $product_price = $cart_itm["product_price"];

          $sql = "SELECT prezzo_reale FROM coupons_coupons WHERE coupon_id=$product_code and coupon_shop=$coupon_shop ORDER BY coupon_shop ASC ";
    $result = $conn->query($sql);

    if ($result->num_rows > 0)
    {
        while($row = $result->fetch_assoc())
        {
            $somma[]=$row['prezzo_reale'];
      
          
        }
    }
   if (count($somma) > 0)
{
    $prezzo = array_unique($somma);
foreach ($prezzo as $prezzo)
{
        
        $sql = "SELECT prezzo_reale (SUM) as total FROM coupons_coupons WHERE coupon_id=$product_code and coupon_shop=$coupon_shop and prezzo_reale=$prezzo ORDER BY coupon_shop ASC ";
    $result = $conn->query($sql);

    if ($result->num_rows > 0)
    {
        while($row = $result->fetch_assoc())
        {
            $somma[]=$row['total'];
            $total = array_sum($somma);
          
        }
    }
  
}

}
Questo il risultato
shop: 1 prezzo: 36
shop: 1 prezzo: 36
shop: 1 prezzo: 36
shop: 1 prezzo: 36
shop: 10 prezzo: 36

Mentre dovrei ottenere
shop: 1 prezzo 35
shop 10 prezzo 1
 

marino51

Utente Attivo
28 Feb 2013
2.917
164
63
Lombardia
prova così,
PHP:
<?php
$coupon_shopS  = array();
$prezzo_realeS = array();

$s = -1;
foreach ($_SESSION["cart_products"] as $cart_itm)
{
    $coupon_shop   = $cart_itm["coupon_shop"];
    $product_code  = $cart_itm["product_code"];
    $product_qty   = $cart_itm["product_qty"];
    $product_price = $cart_itm["product_price"];
    $prezzo_reale  = 0;

    $sql = "SELECT prezzo_reale FROM coupons_coupons WHERE coupon_id=$product_code AND coupon_shop=$coupon_shop";
    $result = $conn->query($sql);
    if ($result->num_rows > 0)
    {
        while($row = $result->fetch_assoc())
        {
            $prezzo_reale = $row['prezzo_reale'];
        }
    }

    if (!array_key_exists($coupon_shop, $coupon_shopS))
    {
        $s++;
        $coupon_shopS[$s]  = $coupon_shop;
        $prezzo_realeS[$s] = $prezzo_reale * $product_qty;
    }
    else
    {
        for ($x=0; $x < count($coupon_shopS); $x++)
        {
            if($coupon_shop == $coupon_shopS[$x])
            {
                $prezzo_realeS[$x] += $prezzo_reale * $product_qty;
                break;
            }
        }
    }
}

$prezzo_realeT = 0;

for ($x=0; $x < count($coupon_shopS); $x++)
{
    $prezzo_realeT += $prezzo_realeS[$x];

    echo "shop : " . $coupon_shopS[$s] . " prezzo : " . $prezzo_realeS[$x] . "<br />";
}
echo "<br />totale prezzo : " . $prezzo_realeT . "<br />";
?>
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Buongiorno Marino e grazie per l'attenzione.
Allora con il codice che mi hai postato ottengo i seguenti risultati:
shop : 10 prezzo : 14
shop : 10 prezzo : 14
shop : 10 prezzo : 16
shop : 10 prezzo : 12
shop : 10 prezzo : 1
totale prezzo : 57

Il totale generale è corretto mentre quelli per le aziende no. Infatti il risultato per essere corretto dovrebbe essere:

shop : 1 prezzo: 28 ( 3 prodotti uno da 14,00 e 2 da 7,00 )
shop : 8 prezzo: 28 ( 2 prodotti uno da 16,00 e l'altro da 12,00 )
shop : 10 prezzo: 1 ( 1 prodotto da 1,00 )
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.917
164
63
Lombardia
questa funzione "!array_key_exists" sembra che lavori male ho provato a sostituirla con "!isset" ma anch'essa ha problemi

come seconda cosa mi é rimasto un indice "$s" nella riga di stampa dei totali

orbene, questo é lo script modificato senza usare le funzioni sopraddette,
PHP:
<?php
$coupon_shopS  = array();
$prezzo_realeS = array();

$s = -1;
foreach ($_SESSION["cart_products"] as $cart_itm)
{
    $coupon_shop   = $cart_itm["coupon_shop"];
    $product_code  = $cart_itm["product_code"];
    $product_qty   = $cart_itm["product_qty"];
    $product_price = $cart_itm["product_price"];
    $prezzo_reale  = 0;

    $sql = "SELECT prezzo_reale FROM coupons_coupons WHERE coupon_id=$product_code AND coupon_shop=$coupon_shop";
    $result = $conn->query($sql);
    if ($result->num_rows > 0)
    {
        while($row = $result->fetch_assoc())
        {
            $prezzo_reale = $row['prezzo_reale'];
        }
    }

    $trovato = false;
    for ($x=0; $x < count($coupon_shopS); $x++)
    {
        if($coupon_shop == $coupon_shopS[$x])
        {
            $trovato = true;
            $prezzo_realeS[$x] += $prezzo_reale * $product_qty;
            break;
        }
    }
    if (!$trovato)
    {
        $s++;
        $coupon_shopS[$s]  = $coupon_shop;
        $prezzo_realeS[$s] = $prezzo_reale * $product_qty;
    }
}

$prezzo_realeT = 0;

for ($x=0; $x < count($coupon_shopS); $x++)
{
    $prezzo_realeT += $prezzo_realeS[$x];

    echo "shop : " . $coupon_shopS[$x] . " prezzo : " . $prezzo_realeS[$x] . "<br />";
}
echo "<br />totale prezzo : " . $prezzo_realeT . "<br />";
?>
e questo il risultato
upload_2018-9-27_13-52-27.png
 
  • Like
Reactions: maxnegri

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Ti confermo che cosi funziona correttamente.
Quando hai tempo e se vuoi, potresti commentare un pò il codice così da comprendere bene il tutto e non essere solo colui che copia e incolla? :) Grazie mille !
 

marino51

Utente Attivo
28 Feb 2013
2.917
164
63
Lombardia
posto lo script che ho usato per le prove, funziona "isolato" e senza connessione al database
per tutte le domande, scrivi
PHP:
<?php
// questi sono i dati passati con la $_SESSION, creo l'array aggiungendo anche il 'prezzo_reale' vedi dopo il motivo
$_SESSION['cart_products']   = array
(
    array
    (
        'coupon_shop'        => 1,
        'product_code'       => 'prod12',
        'product_qty'        => 1,
        'product_price'      => 7.00,
        'prezzo_reale'       => 7.00,
    ),
    array
    (
        'coupon_shop'        => 10,
        'product_code'       => 'prod101',
        'product_qty'        => 1,
        'product_price'      => 1.00,
        'prezzo_reale'       => 1.00,
    ),
    array
    (
        'coupon_shop'        => 1,
        'product_code'       => 'prod13',
        'product_qty'        => 1,
        'product_price'      => 7.00,
        'prezzo_reale'       => 7.00,
    ),
    array
    (
        'coupon_shop'        => 8,
        'product_code'       => 'prod81',
        'product_qty'        => 1,
        'product_price'      => 16.00,
        'prezzo_reale'       => 16.00,
    ),
    array
    (
        'coupon_shop'        => 1,
        'product_code'       => 'prod11',
        'product_qty'        => 1,
        'product_price'      => 14.00,
        'prezzo_reale'       => 14.00,
    ),
    array
    (
        'coupon_shop'        => 8,
        'product_code'       => 'prod82',
        'product_qty'        => 1,
        'product_price'      => 12.00,
        'prezzo_reale'       => 12.00,
    ),
);

$coupon_shopS  = array();  // array che conterrà 'shop' in modo univoco
$prezzo_realeS = array();  // array che conterrà la somma per 'shop'

$s = -1;  // questo é l'indice usato per l'array, parte da -1 perchè la prima volta che si somma 1 assume valore 0, primo elemento dell'array
foreach ($_SESSION["cart_products"] as $cart_itm)
{
    $coupon_shop   = $cart_itm["coupon_shop"];    // elementi ottenuti da $_SESSION["cart_products"], una riga alla volta
    $product_code  = $cart_itm["product_code"];
    $product_qty   = $cart_itm["product_qty"];
    $product_price = $cart_itm["product_price"];
    $prezzo_reale  = 0;                           // viene azzerato il prezzo perchè, se sql non restituisce un valore, la variabile é valorizzata

/*  non ho il database (ne mysql) sono costretto ad eliminare questa parte di codice commentandola

    $sql = "SELECT prezzo_reale FROM coupons_coupons WHERE coupon_id=$product_code AND coupon_shop=$coupon_shop";
    $result = $conn->query($sql);
    if ($result->num_rows > 0)
    {
        while($row = $result->fetch_assoc())
        {
            $prezzo_reale = $row['prezzo_reale'];
*/

            $prezzo_reale = $cart_itm["prezzo_reale"];  // valore assegnato come se provenisse dalla lettura del database

/*
        }
    }
*/

    echo "shop : " . $coupon_shop . " quantita : " . $product_qty . " prezzo : " . $prezzo_reale . "<br />";

    // con questo for si scorre il contenuto dell'array $coupon_shopS cercando al suo interno l'elemento $coupon_shop
    // partendo dall'indice 0 fino al numero di elementi presenti - 1, "count" conta gli elementi presenti
    // esempio da 0 a 4 sono 5 elementi

    $trovato = false;  // questa variabile indica se la ricerca ha avuto esito negativo / positivo

    for ($x=0; $x < count($coupon_shopS); $x++)
    {
        if($coupon_shop == $coupon_shopS[$x])
        {
            echo "TROVATO - AGGIORNATO shop : " . $coupon_shopS[$x] . "<br /><br />";

            $trovato = true;  // l'elemento é stato trovato quindi si somma il valore (+=)

            $prezzo_realeS[$x] += $prezzo_reale * $product_qty;

            break;  // con questa istruzione si interrompe il ciclo for, inutile farlo continuare avendo trovato e aggiornato l'elemento
        }
    }

    // uscendo dal ciclo si verifica che l'elemento non sia stato trovato, in questo caso lo si aggiunge nell'array $coupon_shopS
    // con il relativo valore

    if (!$trovato)
    {
        $s++;  // indice usato per aggiungere nuovi elementi all'array (vedi -1 all'inizio)

        echo "NON TROVATO - AGGIUNTO elemento : " . $s . "<br />";

        $coupon_shopS[$s]  = $coupon_shop;
        $prezzo_realeS[$s] = $prezzo_reale * $product_qty;

        echo "ELEMENTI : " . count($coupon_shopS) . "<br /><br />";
    }
}

$prezzo_realeT = 0;  // viene azzerata la variabile del totale generale

// con il ciclo for si scorre il contenuto dell' array $coupon_shopS
for ($x=0; $x < count($coupon_shopS); $x++)
{
    $prezzo_realeT += $prezzo_realeS[$x];  // sommando ciascun contributo nel totale generale

    echo "shop : " . $coupon_shopS[$x] . " prezzo : " . $prezzo_realeS[$x] . "<br />";  // e stampandolo
}
echo "<br />totale prezzo : " . $prezzo_realeT . "<br />";  // stampa del totale generale
?>
 

marino51

Utente Attivo
28 Feb 2013
2.917
164
63
Lombardia
potresti anche sostituire con il codice che segue, ho eliminato tutti i "loop" lasciando solo quello che serve per la visualizzazione dei risultati, codice più corto e più "bello"
PHP:
<?php
$coupon_shopS  = array();
$prezzo_realeS = array();

foreach ($_SESSION["cart_products"] as $cart_itm)
{
    $coupon_shop   = $cart_itm["coupon_shop"];
    $product_code  = $cart_itm["product_code"];
    $product_qty   = $cart_itm["product_qty"];
    $product_price = $cart_itm["product_price"];
    $prezzo_reale  = 0;

    $sql = "SELECT prezzo_reale FROM coupons_coupons WHERE coupon_id=$product_code AND coupon_shop=$coupon_shop";
    $prezzo_reale = $conn->query($sql)->fetch_row()[0];

    if ( isset($coupon_shopS[$coupon_shop]) )
    {
        $prezzo_realeS[$coupon_shop] += $prezzo_reale * $product_qty;
    }
    else
    {
        $coupon_shopS[$coupon_shop]  = $coupon_shop;
        $prezzo_realeS[$coupon_shop] = $prezzo_reale * $product_qty;
    }
}

$prezzo_realeT = 0;

foreach ($coupon_shopS as $coupon_shop)
{
    $prezzo_realeT += $prezzo_realeS[$coupon_shop];

    echo "shop : " . $coupon_shopS[$coupon_shop] . " prezzo : " . $prezzo_realeS[$coupon_shop] . "<br />";
}
echo "<br />totale prezzo : " . $prezzo_realeT . "<br />";
?>