Hallo,

Ik heb van alles geprobeerd maar het lukt me maar niet, en ben nu ook best gefrustreerd daardoor door het vele proberen, maar ik wil graag de totaalprijs van Winkelwagen.php uit http://www.phphulp.nl/php/script/overig/winkelwagen-update-van-de-tutorial/1750/ berekenen. Hieronder de kopie:

Ik zoek naar een oplossing, geen commentaar over fouten in de tutorial, heb de code al gedeeltelijk herschreven op mijn pc, maar ik wil optellen..


<?php
// Sessie starten
session_start();

// Database connectie maken
include('Config.php');

// Style pagina invoegen
echo '<link rel="stylesheet" type="text/css" href="CSS/Winkelwagen.css" />';

// Javascript voor updaten en deleten winkelwagen invoegen
echo '<script type="text/javascript" src="Winkelwagen.js"></script>';

// Kijk of er iets in de winkelwagen zit
if(empty($_SESSION['winkelwagen']))
{
    echo '<p class="error">Uw winkelwagen is momenteel leeg.</p>';
}
// Anders
else
{
    echo '<div class="wrapper">';
        echo '<div class="row">';
            echo '<p class="small"><b>Aantal:</b></p>';
            echo '<p class="small"><b>Art. nr.:</b></p>';
            echo '<p class="big"><b>Product:</b></p>';
            echo '<p class="small"><b>Actie:</b></p>';
            echo '<p class="small"><b>Prijs:</b></p>';
        echo '</div>';
    
        // Exploden
        $cart = explode('|', $_SESSION['winkelwagen']);

        // Begin formulier
        echo '<form action="Upd_winkelwagen.php" method="post">';
            // Show winkelwagen
            $i = 0;
            foreach($cart as $products)
            {
                // Split
                /*
                $product[x] -->
                    x == 0 -> product id
                    x == 1 -> hoeveelheid
                */
                $product = explode(',', $products);
        
                // Get product info
                $sql = mysql_query("SELECT * FROM producten WHERE id = '".intval($product[0])."'");
              
                // Als query gelukt is
                if($sql)
                {
                    // Als er items zijn
                    if(mysql_num_rows($sql) > 0)
                    {
                        // Alle items echoën
                        $rec = mysql_fetch_assoc($sql);
                        $i++;
        
                        // Verborgen vars
                        echo '<input type="hidden" name="productnummer_'.$i.'" value="'.$product[0].'" />';
                        
                        echo '<div class="row">';
                            // Aantal
                            echo '<p class="small">';
                                echo '<input type="text" class="aantal_w" name="hoeveelheid_'.$i.'" value="'.$product[1].'" size="2" maxlength="2" onKeyPress="return submitenter(this,event)" />';
                            echo '</p>';
                            
                            // Artikel nummer
                            echo '<p class="small">';
                                if($rec['voorraad'] < $product[1])
                                {
                                    echo '<font style="color: #FF0000;">'.$product[0].'</font>';
                                    $error = TRUE;
                                }
                                else
                                {
                                    echo $product[0];
                                }
                            echo '</p>';
                            
                            // titel
                            echo '<p class="big">';
                                echo $rec['titel'];
                            echo '</p>';
                            
                            // Acties
                            echo '<p class="small">';
                                echo '<a href="javascript:removeItem('.$i.')">Del</a>';
                            echo '</p>';
                            
                            // Prijs
                            echo '<p class="small">';
                                echo '&euro; '.($rec['prijs'] * $product[1]);
                            echo '</p>';
                        echo '</div>';
                    }
                    // Anders
                    else
                    {
                        // Fout weergeven
                        echo '<p class="error">Dit product is er niet meer.</p>';
                    }
                }
                // Anders
                else
                {
                    // Mysql error opvangen
                    echo 'Er is een fout opgetreden in de query. <br />';
                    echo mysql_error();
                }
            }
        echo '</form>';
        
        if($error == TRUE)
        {
            echo '<p class="error">';
                echo 'Van artikelen waarvan het artikelnummer rood is gekleurd hebben we niet voldoende op voorraad om je bestelling direct uit te kunnen leveren.';
            echo '</p>';
        }
    echo '</div>';
    
    // Winkelwagen leeghalen & Afrekenen
    echo '<a href="javascript:removeCart()">Winkelwagen leeghalen</a><br />';
    echo '<a href="Afrekenen.php">Afrekenen</a></p>';
}
?>


Hoor het graag!
Je kan alle producten uit je sessie halen, en daarbij de prijzen ophalen uit de database, en dan de totaal uitrekenen met SUM() in MySQL of anders een array_sum() ofzo.

Verder raad ik het niet aan om in een sessie alle producten te scheiden met een |, je kan ze prima in een array opslaan in je sessie. Veel efficiënter.

Verder zijn de standaard PHP-functies voor MySQL over enkele jaren echt verleden tijd, dus ik raad je aan om je vast te houden aan de functies van MySQLi of PDO.
MySQLi heb ik zelf al gewijzigd lokaal, alleen het optellen begrijp ik niet, hoe moet het precies.
Ik weet het niet meer, frustreert heel erg na alle mallen proberen, array_sum als geprobeerd.
Als je array_sum() wilt proberen, raad ik aan om je winkelwagen eerst om te bouwen met array's.

Een mooi voorbeeld vind ik die van SanThe:
http://www.phphulp.nl/php/forum/topic/winkelwagen-script/66824/#469939

De prijzen moet je niet in de sessies opslaan, en aan de hand van de productID's die je je in je sessie hebt, uit je database ophalen.
Maar hoe zou ik het in deze winkelwagen moeten doen?

Toevoeging op 27/08/2015 23:16:57:

HOef ik als ik het ombouw de sessies neit te veranderen? Evenals het javascript
Kijk eens naar de link die ik gaf, en vergeet de manier van opslaan uit de tutorial.
Sorry, ik denk dat ik iets te lang bezig ben geweest maar moet ik nu alleen
het winkelwagenscript veranderen en de rest van de tutorial laten staan, (bedoel ik add.php, winkelwagen.js) want het etalage script heb ik helemaal zelf gemaakt.
Je bent er bijna? Je moet alleen de tussenuitkomst van de totaalsom bijhouden? (Laten we BTW even buiten beschouwing laten *kuch*).

Hoe sla je de prijs op? Dit zijn hopelijk wel getallen met een . (punt) als decimaal scheidingskarakter?

Het wordt dan gewoon zoiets?
<?php
$totaal = 0;
foreach ($cart as $products) {
    // data van producten ophalen enzo
    $totaal = $totaal + $product[1] * $res['prijs']; // product aantal * prijs
}
// $totaal bevat nu de totaalsom
?>


Optimalisatie #1
Waar Aar zegt: organiseer je cart in een (of meer) array(s), bijvoorbeeld met een product(sub)array, met als key een product id, en als waarde het aantal. ($_SESSION['cart']['products'][2] = 12; 12 x product id 2).

Optimalisatie #2
Haal alle product informatie in 1x op, in plaats van meerdere queries in een loop. Als je je sessie een beetje structureert kun je hier ook heel snel je product ids uitvissen (vervolg op vorige voorbeeld: $productIds = array_keys($_SESSION['cart']['products']);).
Thomas, de prijs blijft 0...

$totaal = 0;
foreach ($cart as $products) {
// data van producten ophalen enzo
$som = $som + $product[1] * $res['prijs']; // product aantal * prijs
}

echo ''.$som.'';

Toevoeging op 27/08/2015 23:29:41:

EDIT: Ook na je edit blijft het 0.

Toevoeging op 27/08/2015 23:29:57:

EDIT: Ook na je edit blijft het 0.
En zorg er voor dat je negatieve aantallen direct blokkeert in zowel JavaScript als PHP. Dikwijls zie ik bij custom geschreven webshops (bestaan die nog??) nog fouten waarbij je de kosten van manipuleren.

Reageren