SitePoint Sponsor

User Tag List

Results 1 to 2 of 2
  1. #1
    SitePoint Member
    Join Date
    Jul 2011
    Posts
    17
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Question php weight calculation

    Hi there, i follow a tutorial from www.phpwebcommerce.com and i'm trying to customize the shipping cost based on product weight instead of flat rate. This tutorial original setting for shipping cost is in checkout-function.php , which i just set a value to define the flat rate shipping. And the miniCart.php file is showing all the calculation. I'm trying to customize the code by doing this:
    In my database, table product...i add a new field call pd_weight and insert weight for the product then
    common.php i add a new function "CalculateShippingCost()" . In checkout-function.php i modified "function getOrderAmount($orderId)" & i guess in miniCart.php i need to remove "$shopConfig" and replace some coding but im really confuse. I'm not sure all the coding i customize is it correct. Please help me....any help will very appreciate! thanks a million.


    common.php
    PHP Code:
    <?php
    /*
        Contain the common functions 
        required in shop and admin pages
    */
    require_once 'config.php';
    require_once 
    'database.php';

    /*
        Make sure each key name in $requiredField exist
        in $_POST and the value is not empty
    */
    function checkRequiredPost($requiredField) {
        
    $numRequired count($requiredField);
        
    $keys        array_keys($_POST);
        
        
    $allFieldExist  true;
        for (
    $i 0$i $numRequired && $allFieldExist$i++) {
            if (!
    in_array($requiredField[$i], $keys) || $_POST[$requiredField[$i]] == '') {
                
    $allFieldExist false;
            }
        }
        
        return 
    $allFieldExist;
    }

    function 
    getShopConfig()
    {
        
    // get current configuration
        
    $sql "SELECT sc_name, sc_address, sc_phone, sc_email, sc_shipping_cost, sc_order_email, cy_symbol 
                FROM tbl_shop_config sc, tbl_currency cy
                WHERE sc_currency = cy_id"
    ;
        
    $result dbQuery($sql);
        
    $row    dbFetchAssoc($result);

        if (
    $row) {
            
    extract($row);
        
            
    $shopConfig = array('name'           => $sc_name,
                                
    'address'        => $sc_address,
                                
    'phone'          => $sc_phone,
                                
    'email'          => $sc_email,
                                
    'sendOrderEmail' => $sc_order_email,
                                
    'shippingCost'   => $sc_shipping_cost,
                                
    'currency'       => $cy_symbol);
        } else {
            
    $shopConfig = array('name'           => '',
                                
    'address'        => '',
                                
    'phone'          => '',
                                
    'email'          => '',
                                
    'sendOrderEmail' => '',
                                
    'shippingCost'   => '',
                                
    'currency'       => '');    
        }

        return 
    $shopConfig;                        
    }


    /*********************** Function Shipping Cost  **************************************/
    function CalculateShippingCost()
    {

    // get current configuration
        
    $sql "SELECT pd_weight
                FROM tbl_product
               "
    ;
                
        
    $result dbQuery($sql);
        
    $row    dbFetchAssoc($result);

        if (
    $row) {
            
    extract($row);
            
            

    $weightTotal $pd_weight $od_qty;

                    
    /////////////////////West Malaysia ///////////////////////////////
     
    if($weightTotal == 0.25 country == "WestMalysia"///250gram or 0.25kg
                    
    {
                            
    $conclusion 6;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal == 0.5 country == "WestMalysia")  ///500gram or 0.5kg
                    
    {
                            
    $conclusion 6;//your shipping Price
                    
    }
                    
                     else if(
    $weightTotal == 0.75 country == "WestMalysia")  ///750gram or 0.75kg
                    
    {
                            
    $conclusion 7;//your shipping Price
                    
    }
                    
                     else if(
    $weightTotal == country == "WestMalysia")
                    {
                            
    $conclusion 8;//your shipping Price
                    
    }
                    
                     else if(
    $weightTotal == 1.25 country == "WestMalysia")
                    {
                            
    $conclusion 9;//your shipping Price
                    

                    
                    else if(
    $weightTotal == 1.5 country == "WestMalysia")
                    {
                            
    $conclusion 11;//your shipping Price
                    

                    
                    else if(
    $weightTotal == 1.75 country == "WestMalysia")
                    {
                            
    $conclusion 12;//your shipping Price
                    
    }
                    
                     else if(
    $weightTotal == country == "WestMalysia")
                    {
                            
    $conclusion 13;//your shipping Price
                    
    }
                    
                    
    /////////////////////EAST Malaysia ///////////////////////////////
                    
    else if($weightTotal == 0.25 country == "EastMalysia")
                    {
                            
    $conclusion 9;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal == 0.5 country == "EastMalysia")
                    {
                            
    $conclusion 9;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal == 0.75 country == "EastMalysia")
                    {
                            
    $conclusion 11;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal == country == "EastMalysia")
                    {
                            
    $conclusion 14;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal == 1.25 country == "EastMalysia")
                    {
                            
    $conclusion 17;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal == 1.5 country == "EastMalysia")
                    {
                            
    $conclusion 19;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal == 1.75 country == "EastMalysia")
                    {
                            
    $conclusion 22;//your shipping Price
                    
    }
                    
                    else if(
    $weightTotal ==country == "EastMalysia")
                    {
                            
    $conclusion 14;//your shipping Price
                    
    }
                    
                    
                    return 
    $weightTotal;
                        
                    
    }
    /*******************************************************************************/




    function displayAmount($amount)
    {
        global 
    $shopConfig;
        return 
    $shopConfig['currency'] . number_format($amount);
    }

    /*
        Join up the key value pairs in $_GET
        into a single query string
    */
    function queryString()
    {
        
    $qString = array();
        
        foreach(
    $_GET as $key => $value) {
            if (
    trim($value) != '') {
                
    $qString[] = $key'=' trim($value);
            } else {
                
    $qString[] = $key;
            }
        }
        
        
    $qString implode('&'$qString);
        
        return 
    $qString;
    }

    /*
        Put an error message on session 
    */
    function setError($errorMessage)
    {
        if (!isset(
    $_SESSION['db_desmond_error'])) {
            
    $_SESSION['db_desmond_error'] = array();
        }
        
        
    $_SESSION['db_desmond_error'][] = $errorMessage;

    }

    /*
        print the error message
    */
    function displayError()
    {
        if (isset(
    $_SESSION['db_desmond_error']) && count($_SESSION['db_desmond_error'])) {
            
    $numError count($_SESSION['db_desmond_error']);
            
            echo 
    '<table id="errorMessage" width="550" align="center" cellpadding="20" cellspacing="0"><tr><td>';
            for (
    $i 0$i $numError$i++) {
                echo 
    '&#8226; ' $_SESSION['db_desmond_error'][$i] . "<br>\r\n";
            }
            echo 
    '</td></tr></table>';
            
            
    // remove all error messages from session
            
    $_SESSION['db_desmond_error'] = array();
        }
    }

    /**************************
        Paging Functions
    ***************************/

    function getPagingQuery($sql$itemPerPage 10)
    {
        if (isset(
    $_GET['page']) && (int)$_GET['page'] > 0) {
            
    $page = (int)$_GET['page'];
        } else {
            
    $page 1;
        }
        
        
    // start fetching from this row number
        
    $offset = ($page 1) * $itemPerPage;
        
        return 
    $sql " LIMIT $offset$itemPerPage";
    }

    /*
        Get the links to navigate between one result page to another.
        Supply a value for $strGet if the page url already contain some
        GET values for example if the original page url is like this :
        
        http://www.phpwebcommerce.com/plaincart/index.php?c=12
        
        use "c=12" as the value for $strGet. But if the url is like this :
        
        http://www.phpwebcommerce.com/plaincart/index.php
        
        then there's no need to set a value for $strGet
        
        
    */
    function getPagingLink($sql$itemPerPage 10$strGet '')
    {
        
    $result        dbQuery($sql);
        
    $pagingLink    '';
        
    $totalResults  dbNumRows($result);
        
    $totalPages    ceil($totalResults $itemPerPage);
        
        
    // how many link pages to show
        
    $numLinks      10;

            
        
    // create the paging links only if we have more than one page of results
        
    if ($totalPages 1) {
        
            
    $self 'http://' $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ;
            

            if (isset(
    $_GET['page']) && (int)$_GET['page'] > 0) {
                
    $pageNumber = (int)$_GET['page'];
            } else {
                
    $pageNumber 1;
            }
            
            
    // print 'previous' link only if we're not
            // on page one
            
    if ($pageNumber 1) {
                
    $page $pageNumber 1;
                if (
    $page 1) {
                    
    $prev " <a href=\"$self?page=$page&$strGet/\">[Prev]</a> ";
                } else {
                    
    $prev " <a href=\"$self?$strGet\">[Prev]</a> ";
                }    
                    
                
    $first " <a href=\"$self?$strGet\">[First]</a> ";
            } else {
                
    $prev  ''// we're on page one, don't show 'previous' link
                
    $first ''// nor 'first page' link
            
    }
        
            
    // print 'next' link only if we're not
            // on the last page
            
    if ($pageNumber $totalPages) {
                
    $page $pageNumber 1;
                
    $next " <a href=\"$self?page=$page&$strGet\">[Next]</a> ";
                
    $last " <a href=\"$self?page=$totalPages&$strGet\">[Last]</a> ";
            } else {
                
    $next ''// we're on the last page, don't show 'next' link
                
    $last ''// nor 'last page' link
            
    }

            
    $start $pageNumber - ($pageNumber $numLinks) + 1;
            
    $end   $start $numLinks 1;        
            
            
    $end   min($totalPages$end);
            
            
    $pagingLink = array();
            for(
    $page $start$page <= $end$page++)    {
                if (
    $page == $pageNumber) {
                    
    $pagingLink[] = $page ";   // no need to create a link to current page
                
    } else {
                    if (
    $page == 1) {
                        
    $pagingLink[] = " <a href=\"$self?$strGet\">$page</a> ";
                    } else {    
                        
    $pagingLink[] = " <a href=\"$self?page=$page&$strGet\">$page</a> ";
                    }    
                }
        
            }
            
            
    $pagingLink implode(' | '$pagingLink);
            
            
    // return the page navigation link
            
    $pagingLink $first $prev $pagingLink $next $last;
        }
        
        return 
    $pagingLink;
    }
    ?>

    miniCart.php
    PHP Code:

    <?php
    if (!defined('WEB_ROOT')) {
        exit;
    }

    $cartContent getCartContent();

    $numItem count($cartContent);    
    ?>
    <table width="180" border="0" cellspacing="0" cellpadding="4" id="minicart" >
      
     <?php
    if ($numItem 0) {
    ?>
     <tr>
      <td colspan="2" class="black_txt_2">Cart Content</td>
     </tr>
    <?php
        $subTotal 
    0;
        for (
    $i 0$i $numItem$i++) {
            
    extract($cartContent[$i]);
            
    $pd_name "$ct_qty x $pd_name";
            
    $url "index.php?c=$cat_id&p=$pd_id";
            
            
    $subTotal += $pd_price $ct_qty;
    ?>
     <tr>
       <td width="73%" ><a href="<?php echo $url?>"><span class="green_txt_2"><?php echo $pd_name?></span></a></td>
       
      <td width="27%" align="right" class="black_txt_2"><?php echo displayAmount($ct_qty $pd_price); ?></td>
     </tr>
    <?php
        
    // end while
    ?>
      <tr><td align="right" class="black_txt_2">Sub-total</td>
      <td width="27%" align="right" class="black_txt_2"><?php echo displayAmount($subTotal); ?></td>
     </tr>
      <tr><td align="right"  class="black_txt_2">Shipping</td>
      <td width="27%" align="right" class="black_txt_2"><?php echo displayAmount($shopConfig['shippingCost']); ?></td>
     </tr>
      <tr><td align="right" class="black_txt_2"><strong>Total</strong></td>
      <td width="27%" align="right" class="black_txt_2"><strong><?php echo displayAmount($subTotal $shopConfig['shippingCost']); ?></strong></td>
     </tr>
      <tr><td colspan="2">&nbsp;</td></tr>
      <tr>
      <td colspan="2" align="center" class="black_txt_2"><a href="cart.php?action=view"> <img src="images/btn_proceedtocheckout.gif" ></a></td>
     </tr>  
    <?php    
    } else {
    ?>
      <tr><td colspan="2" align="center" valign="middle" class="black_txt_2">Shopping Cart Is Empty</td></tr>
    <?php
    }
    ?> 
    </table>

    checkout-functions.php
    PHP Code:
    <?php
    require_once 'config.php';

    /*********************************************************
    *                 CHECKOUT FUNCTIONS 
    *********************************************************/
    function saveOrder()
    {
        
    $orderId       0;
        
    $shippingCost  5;
        
    $requiredField = array('hidShippingFirstName''hidShippingLastName''hidShippingAddress1''hidShippingCity''hidShippingPostalCode',
                               
    'hidPaymentFirstName''hidPaymentLastName''hidPaymentAddress1''hidPaymentCity''hidPaymentPostalCode');
                               
        if (
    checkRequiredPost($requiredField)) {
            
    extract($_POST);
            
            
    // make sure the first character in the 
            // customer and city name are properly upper cased
            
    $hidShippingFirstName ucwords($hidShippingFirstName);
            
    $hidShippingLastName  ucwords($hidShippingLastName);
            
    $hidPaymentFirstName  ucwords($hidPaymentFirstName);
            
    $hidPaymentLastName   ucwords($hidPaymentLastName);
            
    $hidShippingCity      ucwords($hidShippingCity);
            
    $hidPaymentCity       ucwords($hidPaymentCity);
                    
            
    $cartContent getCartContent();
            
    $numItem     count($cartContent);
            
            
    // save order & get order id
            
    $sql "INSERT INTO tbl_order(od_date, od_last_update, od_shipping_first_name, od_shipping_last_name, od_shipping_address1, 
                                          od_shipping_address2, od_shipping_phone, od_shipping_state, od_shipping_city, od_shipping_postal_code, od_shipping_cost,
                                          od_payment_first_name, od_payment_last_name, od_payment_address1, od_payment_address2, 
                                          od_payment_phone, od_payment_state, od_payment_city, od_payment_postal_code)
                    VALUES (NOW(), NOW(), '
    $hidShippingFirstName', '$hidShippingLastName', '$hidShippingAddress1', 
                            '
    $hidShippingAddress2', '$hidShippingPhone', '$hidShippingState', '$hidShippingCity', '$hidShippingPostalCode', '$shippingCost',
                            '
    $hidPaymentFirstName', '$hidPaymentLastName', '$hidPaymentAddress1', 
                            '
    $hidPaymentAddress2', '$hidPaymentPhone', '$hidPaymentState', '$hidPaymentCity', '$hidPaymentPostalCode')";
            
    $result dbQuery($sql);
            
            
    // get the order id
            
    $orderId dbInsertId();
            
            if (
    $orderId) {
                
    // save order items
                
    for ($i 0$i $numItem$i++) {
                    
    $sql "INSERT INTO tbl_order_item(od_id, pd_id, od_qty)
                            VALUES (
    $orderId{$cartContent[$i]['pd_id']}{$cartContent[$i]['ct_qty']})";
                    
    $result dbQuery($sql);                    
                }
            
                
                
    // update product stock
                
    for ($i 0$i $numItem$i++) {
                    
    $sql "UPDATE tbl_product 
                            SET pd_qty = pd_qty - 
    {$cartContent[$i]['ct_qty']}
                            WHERE pd_id = 
    {$cartContent[$i]['pd_id']}";
                    
    $result dbQuery($sql);                    
                }
                
                
                
    // then remove the ordered items from cart
                
    for ($i 0$i $numItem$i++) {
                    
    $sql "DELETE FROM tbl_cart
                            WHERE ct_id = 
    {$cartContent[$i]['ct_id']}";
                    
    $result dbQuery($sql);                    
                }                            
            }                    
        }
        
        return 
    $orderId;
    }

    /*
        Get order total amount ( total purchase + shipping cost )
    */
    function getOrderAmount($orderId)
    {
        
    $orderAmount 0;
                                                        
    ///ORIGINAL///
                                            /////////SELECT SUM (pd_price * od_qty) /////        
        
    $sql "SELECT SUM(pd_price * [od_qty * pd_weight] ) 
                FROM tbl_order_item oi, tbl_product p 
                WHERE oi.pd_id = p.pd_id and oi.od_id = 
    $orderId
                
                UNION
                
                SELECT pd_weight
                FROM tbl_product
                WHERE oi.pd_id = p.pd_id "
    ;  ////?????
                
                
                /***********ORIGINAL************
                SELECT od_shipping_cost 
                FROM tbl_order
                WHERE od_id = $orderId";
                ********************************/
                
        
    $result dbQuery($sql);

        if (
    dbNumRows($result) == 2) {
            
    $row dbFetchRow($result);
            
    $totalPurchase $row[0];
            
            
    $row dbFetchRow($result);
            
    $weightTotal $row[0];                            /******original***** $shippingCost = $row[0]; **************/
            
            
    $orderAmount $totalPurchase $weightTotal;  /*****original****** $totalPurchase + $shippingCost ***********/
        
    }    
        
        return 
    $orderAmount;    
    }

    ?>

  2. #2
    Non-Member bronze trophy
    Join Date
    Nov 2009
    Location
    Keene, NH
    Posts
    3,760
    Mentioned
    23 Post(s)
    Tagged
    0 Thread(s)
    Your shipping cost function doesn't make a whole lot of sense -- and breaks a lot of 'common sense' coding practices. That massive IF statement for example seems to set a 'conclusion' variable that's local in scope and not returned -- the massive if statement repeatedly checks the SAME values over and over for no good reason... real world I very much doubt your totalweights would perfectly equal multiples of 0.25, so wouldn't a "less than" comparison be better? (a multiply and then ceil by granularity might be even better) -- and really given the number of results you should probably either be using an array or a SWITCH/CASE instead of IF/ELSE.

    When I get back to my workstation I'll take a stab at digging deeper into the code -- I'm seeing lots of little "what the?" all over the place... like wasting overhead on extract, etc, etc...


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •