Andy-H Posted November 27, 2009 Share Posted November 27, 2009 <?php class Tesco { private $quantity; private $productid; private $storeid; ########################################################################################################## ###ALL INTEGER DATA FILTERED USINT THE BELOW OPTIONS WILL HAVE A MIN VALUE OF 1 AND A DEFAULT VALUE OF 1## ###E.G. IF FILTER FAILS TO VALIDATE AS INTEGER OF 1+ IT WILL DEFAULT THE VALUE TO ONE (1)################# ########################################################################################################## protected static $options = array( 'options' => array( 'min_range' => 1, 'default' => 1 ) ); public function getPrice($quantity, $productid, $storeid = '1') { ##################################################################################################### ### ONLY NEED TO VALIDATE THESE AS INTEGERS, THIS IS SUFFICIENT TO PROTECT QUERY FROM SQL INJECTION## ##################################################################################################### $this->quantity = filter_var($quantity , FILTER_VALIDATE_INT, self::$options); $this->productid = filter_var($productid, FILTER_VALIDATE_INT, self::$options); $this->storeid = filter_var($storeid , FILTER_VALIDATE_INT, self::$options); ############################################################################# ###ONLY %d NEEDED DUE TO ALL VARS USED IN SPRINTF() BEING IN DECIMAL FORMAT## ############################################################################# $query = sprintf("SELECT price, price * %d as total FROM products WHERE id = %d AND store = %d", $this->quantity, $this->productid, $this->storeid); $result = mysql_query($query) or trigger_error('Query failed: ' . mysql_error(), E_USER_ERROR); $price = mysql_fetch_assoc($result); print_r($price); } } ?> Quote Link to comment Share on other sites More sharing options...
jamesxg1 Posted November 27, 2009 Author Share Posted November 27, 2009 <?php class Tesco { private $quantity; private $productid; private $storeid; ########################################################################################################## ###ALL INTEGER DATA FILTERED USINT THE BELOW OPTIONS WILL HAVE A MIN VALUE OF 1 AND A DEFAULT VALUE OF 1## ###E.G. IF FILTER FAILS TO VALIDATE AS INTEGER OF 1+ IT WILL DEFAULT THE VALUE TO ONE (1)################# ########################################################################################################## protected static $options = array( 'options' => array( 'min_range' => 1, 'default' => 1 ) ); public function getPrice($quantity, $productid, $storeid = '1') { ##################################################################################################### ### ONLY NEED TO VALIDATE THESE AS INTEGERS, THIS IS SUFFICIENT TO PROTECT QUERY FROM SQL INJECTION## ##################################################################################################### $this->quantity = filter_var($quantity , FILTER_VALIDATE_INT, self::$options); $this->productid = filter_var($productid, FILTER_VALIDATE_INT, self::$options); $this->storeid = filter_var($storeid , FILTER_VALIDATE_INT, self::$options); ############################################################################# ###ONLY %d NEEDED DUE TO ALL VARS USED IN SPRINTF() BEING IN DECIMAL FORMAT## ############################################################################# $query = sprintf("SELECT price, price * %d as total FROM products WHERE id = %d AND store = %d", $this->quantity, $this->productid, $this->storeid); $result = mysql_query($query) or trigger_error('Query failed: ' . mysql_error(), E_USER_ERROR); $price = mysql_fetch_assoc($result); print_r($price); } } ?> That does the job absolutely perfect. Cheers mate. on prob i got is this. <?php class Tesco { private $quantity; private $productid; private $storeid; protected static $options = array( 'options' => array( 'min_range' => 1, 'default' => 1 ) ); public function getPrice($quantity, $productid, $storeid = '1') { $this->quantity = filter_var($quantity , FILTER_VALIDATE_INT, self::$options); $this->productid = filter_var($productid, FILTER_VALIDATE_INT, self::$options); $this->storeid = filter_var($storeid , FILTER_VALIDATE_INT, self::$options); $query = sprintf("SELECT price, price * %d as total FROM products WHERE id = %d AND store = %d", $this->quantity, $this->productid, $this->storeid); $result = mysql_query($query) or trigger_error('Query failed: ' . mysql_error(), E_USER_ERROR); $price = mysql_fetch_assoc($result); $total += $price['total']; echo $total; } } ?> so if i put 2 items in the process Item 1 = 100 * 6 = 600 Item 2 = 1 * 8 = 8 returns 6008 :S lol. Many many thanks James. Quote Link to comment Share on other sites More sharing options...
Andy-H Posted November 27, 2009 Share Posted November 27, 2009 Thats because the class doesn't "remember" the value of $total from the last call made to an instance of itself, it simply echoes out the totals from the two calls made without whitespace/formatting. I.E echo '600'; echo '8'; //would output 6008 This should work. <?php class Tesco { private $quantity; private $productid; private $storeid; private $total; protected static $options = array( 'options' => array( 'min_range' => 1, 'default' => 1 ) ); public function getPrice($quantity, $productid, $storeid = '1') { $this->quantity = filter_var($quantity , FILTER_VALIDATE_INT, self::$options); $this->productid = filter_var($productid, FILTER_VALIDATE_INT, self::$options); $this->storeid = filter_var($storeid , FILTER_VALIDATE_INT, self::$options); $query = sprintf("SELECT price, price * %d as total FROM products WHERE id = %d AND store = %d", $this->quantity, $this->productid, $this->storeid); $result = mysql_query($query) or trigger_error('Query failed: ' . mysql_error(), E_USER_ERROR); $price = mysql_fetch_assoc($result); $this->total += $price['total']; } public function getTotal() { ########################################### ###GET TOTAL TO TWO DECIMAL PLACES IN GBP## ########################################### return "£" . number_format($this->total, 2); } } ?> Then you can use the class to get the total like so: $tesco = new Tesco; $tesco->getPrice($param1, $param2); $tesco->getPrice($param3, $param4); echo $tesco->getTotal(); Quote Link to comment Share on other sites More sharing options...
jamesxg1 Posted November 29, 2009 Author Share Posted November 29, 2009 Andy-H you are a star, thank you so much may I add you as a friend as when I have finished the site i am working on (the one you have just helped me with) I would like to let you know and if your interested make you mod?. Cheers mate. Just a quick question. Sorry. How do i find the lowest value from all these... echo $asda->getTotal() . '<br />'; echo $tesco->getTotal() . '<br />'; echo $morrisons->getTotal() . '<br />'; and echo the value along with the shop name ? Cheers bud Many thanks James. Quote Link to comment Share on other sites More sharing options...
Andy-H Posted November 29, 2009 Share Posted November 29, 2009 Of course, I think my addy is on my profile. If not I will send it to you in a PM. As for finding the lowest value; you can use the min function, although it would require making a small change to the getTotal() method. public function getTotal($sign = true) { ########################################### ###GET TOTAL TO TWO DECIMAL PLACES IN GBP## ########################################### if ($sign === true) return "£" . number_format($this->total, 2); return number_format($this->total, 2); } Then you can use: $lowest = min( $asda->getTotal(false), $tesco->getTotal(false), $morrisons->getTotal(false) ); echo $asda->getTotal() . '<br />'; echo $tesco->getTotal() . '<br />'; echo $morrisons->getTotal() . '<br />'; echo 'Lowest price: £' number_format($lowest, 2) . '<br />'; Quote Link to comment Share on other sites More sharing options...
jamesxg1 Posted November 29, 2009 Author Share Posted November 29, 2009 Of course, I think my addy is on my profile. If not I will send it to you in a PM. As for finding the lowest value; you can use the min function, although it would require making a small change to the getTotal() method. public function getTotal($sign = true) { ########################################### ###GET TOTAL TO TWO DECIMAL PLACES IN GBP## ########################################### if ($sign === true) return "£" . number_format($this->total, 2); return number_format($this->total, 2); } Then you can use: $lowest = min( $asda->getTotal(false), $tesco->getTotal(false), $morrisons->getTotal(false) ); echo $asda->getTotal() . '<br />'; echo $tesco->getTotal() . '<br />'; echo $morrisons->getTotal() . '<br />'; echo 'Lowest price: £' number_format($lowest, 2) . '<br />'; Worked. Thank you so much I have PM'ed you so we should be able to keep in contact. Once again thanks for this mate. Take care, all the best. James. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.