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?
 
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
 
Buonasera,
scusami Marino, ma non riesco a comprendere la query posso farla nell'array? per favore potresti farmi un esempio? Grazie
 
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:
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
 
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 />";
?>
 
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:
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
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 !
 
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
?>
 
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 />";
?>
 

Discussioni simili