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
/*
	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 == 1 & 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 == 2 & 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 == 1 & 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 ==2 & 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 '&#38;#8226; ' . $_SESSION['db_desmond_error'][$i] . "<br>\\r\
";
		}
		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
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
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;	
}

?>

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…