這次的練習是使用php實作購物車,購物紀錄使用session,資料庫使用mysql,php連線使用PDO
下面的程式碼只是提出某些主要的function,其他使用文字做說明
1. 資料庫連線include檔
//資料庫連線資料 define('user','root'); define('password','XXX'); define('dbname','test');
2. 資料庫連線class(繼承用)
class Mysql { private $dbname = dbname; //使用prepare執行查詢,並回傳結果 public function executePrepareSelect($sql, $param) { $db = new PDO("mysql:host=localhost;dbname=$this->dbname", user, password); try { $stmt = $db->prepare($sql); if (count($param) > 0) { foreach ($param as $key => $val) { $this->bindParameters($stmt, $key, $val); } } $stmt->execute(); $db = null; } catch (PDOException $e) { $e->getMessage(); return false; } return $stmt->fetchAll(); } //用來bind參數 private function bindParameters($stmt, $key, $value) { if (is_int($value)) { $stmt->bindParam(':' . $key, $value, PDO::PARAM_INT); } else if (is_bool($value)) { $stmt->bindParam(':' . $key, $value, PDO::PARAM_BOOL); } else if (is_string($value)) { $stmt->bindParam(':' . $key, $value, PDO::PARAM_STR); } else { $stmt->bindParam(':' . $key, $value); } } }
Mysql類別主要用來隔離出資料庫select、insert等等所需要的方法,加速其他功能的開發
3. 商品class
class Product extends Mysql { //使用商品編號查詢商品 function getProductById($pid) { $param = array("id" => $pid); $sql = $this->createPrepareSelectStatement($param); $result = $this->executePrepareSelect($sql, $param); if ($result) return $result[0]; else return "error"; } //新增商品 function insertProduct($name, $price, $caption) { $param = array("ProductName"=>$name,"Price"=>$price,"Caption"=>$caption); $sql = $this->createPrepareInsertStatement($param); if($this->executePrepareInsert($sql, $param)){ return true; }else{ return false; } } }
雖然商品類別應該代表一個商品,為了簡便就不把商品單獨做出一個類別,商品類別目的在於提供商品的查詢、新增等方法,直接繼承Mysql類別加速開發,createXXXStatement方法只是給予需求的參數就可以產出sql新增或查詢語法
4. 購物車類別
class ShopCar { private $items = array(); //購買的商品 private $count; //新增商品的旗標 private $total; //總價 //加入商品 public function addItem($pid, $num) { try { for ($i = 0; $i < $num; $i++) { $this->items[$this->count] = $pid; $this->count++; } $this->total = $this->setTotal(); return true; } catch (Exception $e) { echo $e->getMessage(); return false; } } //刪除物品 public function deleteItem($pid){ for($i=0;$iitems);$i++){ if($this->items[$i] == $pid){ unset($this->items[$i]); } } } //產出購買物品列表 public function getAllItems(){ $tmp = array(); foreach($this->items as $item){ if(empty($tmp[$item])){ $tmp[$item] = 1; }else{ $tmp[$item]++; } } $pending = " "; $pending .= "
'; return $pending; } }"; foreach($tmp as $key=>$value){ $p = new Product(); $item = $p->getProductById($key); $name = $item["ProductName"]; $price = $item["Price"]; $sumPrice = intval($value) * intval($item["Price"]); $caption = $item["Caption"]; $pending .= " 編號 名稱 數量 單價 總價 說明 "; } $pending .= ' $key $name $value $price $sumPrice $caption
代表一輛購物車的類別,使用一個陣列(items)記錄使用者購買的商品ID,需要各種資訊如目前購買總價、商品列表都從陣列中提出ID再做查詢,減少新增或刪除商品時的資料庫讀取次數
5. ajax處理商品頁面
if (!isset($_SESSION['car'])) { die("error"); } $car = $_SESSION['car']; if (strval($_GET['type']) == "add") { //加入商品 if (empty($_GET['pid'])) { print "pid not set"; exit(); } $success = array(); if ($car->addItem(intval($_GET['pid']), intval($_GET['num']))) { $success[0] = "product " . $_GET['pname'] . " add success"; $success[1] = strval($car->getTotal()); print json_encode($success); } else { $success[0] = "error"; print json_encode($success); } } else if (strval($_GET['type']) == "reset") { //重製購物車 $success = array(); if ($car->resetCar()) { $success[0] = "reset success"; $success[1] = strval($car->getTotal()); print json_encode($success); } else { $success[0] = "reset fail"; print json_encode($success); } }
負責處理ajax傳來的指令,使用type區分要求的動作,add是加入商品、reset是重製購物車,結果回傳部分使用json
6. javascript傳送function
function ajaxProduct(targetUrl,GETdata,resultArea,money){ //targetUrl -> ajax傳送的頁面 //GETdata -> 傳送ajax的參數,使用GET方式傳送 //resultArea -> 顯示結果狀態的區塊 //money -> 顯示目前的總價的區塊 $.ajax({ url:targetUrl, data:GETdata, dataType:"json", error:function(xhr,status,thrown){ $(resultArea).html(status); }, success:function(result,status,xhr){ $(resultArea).html(result[0]); $(money).html(result[1]); } }); }
最後一個就是負責傳送與接收ajax指令的function,這裡使用到jQuery的ajax功能,比較方便跟快速
沒有留言:
張貼留言