首頁 >php教程 >php手册 >PHP实现的购物车类实例

PHP实现的购物车类实例

WBOY
WBOY原創
2016-06-13 09:01:231051瀏覽

PHP实现的购物车类实例

 本文实例讲述了PHP实现的购物车类。分享给大家供大家参考。具体分析如下:

该购物车类是基于CodeIgniter的购物车类仿写实现的。

购物车基本功能如下:

1) 将物品加入购物车
2) 从购物车中删除物品
3) 更新购物车物品信息 【+1/-1】
4) 对购物车物品进行统计
1. 总项目
2. 总数量
3. 总金额
5) 对购物单项物品的数量及金额进行统计
6) 清空购物车

1. cart.php文件:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322



/**

*

* @author quanshuidingdang

*/

class Cart {

//物品id及名称规则,调试信息控制

private $product_id_rule = '\.a-z0-9-_'; //小写字母 | 数字 | ._-

private $product_name_rule = '\.\:a-z0-9-_';//小写字母 | 数字 | ._-:

private $debug = TRUE;

//购物车

private $_cart_contents = array();

/**

* 构造函数

*

* @param array

*/

public function __construct() {

//是否第一次使用?

if(isset($_SESSION['cart_contents'])) {

$this->_cart_contents = $_SESSION['cart_contents'];

} else {

$this->_cart_contents['cart_total'] = 0;

$this->_cart_contents['total_items'] = 0;

}

if($this->debug === TRUE) {

//$this->_log("cart_create_success");

}

}

/**

* 将物品加入购物车

*

* @access public

* @param array 一维或多维数组,必须包含键值名:

id -> 物品ID标识,

qty -> 数量(quantity),

price -> 单价(price),

name -> 物品姓名

* @return bool

*/

public function insert($items = array()) {

//输入物品参数异常

if( ! is_array($items) OR count($items) == 0) {

if($this->debug === TRUE) {

$this->_log("cart_no_items_insert");

}

return FALSE;

}

//物品参数处理

$save_cart = FALSE;

if(isset($items['id'])) {

if($this->_insert($items) === TRUE) {

$save_cart = TRUE;

}

} else {

foreach($items as $val) {

if(is_array($val) AND isset($val['id'])) {

if($this->_insert($val) == TRUE) {

$save_cart = TRUE;

}

}

}

}

//当插入成功后保存数据到session

if($save_cart) {

$this->_save_cart();

return TRUE;

}

return FALSE;

}

/**

* 更新购物车物品信息

*

* @access public

* @param array

* @return bool

*/

public function update($items = array()) {

//输入物品参数异常

if( !is_array($items) OR count($items) == 0) {

if($this->debug === TRUE) {

$this->_log("cart_no_items_insert");

}

return FALSE;

}

//物品参数处理

$save_cart = FALSE;

if(isset($items['rowid']) AND isset($items['qty'])) {

if($this->_update($items) === TRUE) {

$save_cart = TRUE;

}

} else {

foreach($items as $val) {

if(is_array($val) AND isset($val['rowid']) AND isset($val['qty'])) {

if($this->_update($val) === TRUE) {

$save_cart = TRUE;

}

}

}

}

//当更新成功后保存数据到session

if($save_cart) {

$this->_save_cart();

return TRUE;

}

return FALSE;

}

/**

* 获取购物车物品总金额

*

* @return int

*/

public function total() {

return $this->_cart_contents['cart_total'];

}

/**

* 获取购物车物品种类

*

* @return int

*/

public function total_items() {

return $this->_cart_contents['total_items'];

}

/**

* 获取购物车

*

* @return array

*/

public function contents() {

return $this->_cart_contents;

}

/**

* 获取购物车物品options

*

* @param string

* @return array

*/

public function options($rowid = '') {

if($this->has_options($rowid)) {

return $this->_cart_contents[$rowid]['options'];

} else {

return array();

}

}

/**

* 清空购物车

*

*/

public function destroy() {

unset($this->_cart_contents);

$this->_cart_contents['cart_total'] = 0;

$this->_cart_contents['total_items'] = 0;

unset($_SESSION['cart_contents']);

}

/**

* 判断购物车物品是否有options选项

*

* @param string

* @return bool

*/

private function has_options($rowid = '') {

if( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0) {

return FALSE;

}

return TRUE;

}

/**

* 插入数据

*

* @access private

* @param array

* @return bool

*/

private function _insert($items = array()) {

//输入物品参数异常

if( ! is_array($items) OR count($items) == 0) {

if($this->debug === TRUE) {

$this->_log("cart_no_data_insert");

}

return FALSE;

}

//如果物品参数无效(无id/qty/price/name)

if( ! isset($items['id']) OR ! isset($items['qty']) OR ! isset($items['price']) OR ! isset($items['name'])) {

if($this->debug === TRUE) {

$this->_log("cart_items_data_invalid");

}

return FALSE;

}

//去除物品数量左零及非数字字符

$items['qty'] = trim(preg_replace('/([^0-9])/i', '', $items['qty']));

$items['qty'] = trim(preg_replace('/^([0]+)/i', '', $items['qty']));

//如果物品数量为0,或非数字,则我们对购物车不做任何处理!

if( ! is_numeric($items['qty']) OR $items['qty'] == 0) {

if($this->debug === TRUE) {

$this->_log("cart_items_data(qty)_invalid");

}

return FALSE;

}

//物品ID正则判断

if( ! preg_match('/^['.$this->product_id_rule.']+$/i', $items['id'])) {

if($this->debug === TRUE) {

$this->_log("cart_items_data(id)_invalid");

}

return FALSE;

}

//物品名称正则判断

if( ! preg_match('/^['.$this->product_name_rule.']+$/i', $items['name'])) {

if($this->debug === TRUE) {

$this->_log("cart_items_data(name)_invalid");

}

return FALSE;

}

//去除物品单价左零及非数字(带小数点)字符

$items['price'] = trim(preg_replace('/([^0-9\.])/i', '', $items['price']));

$items['price'] = trim(preg_replace('/^([0]+)/i', '', $items['price']));

//如果物品单价非数字

if( ! is_numeric($items['price'])) {

if($this->debug === TRUE) {

$this->_log("cart_items_data(price)_invalid");

}

return FALSE;

}

//生成物品的唯一id

if(isset($items['options']) AND count($items['options']) >0) {

$rowid = md5($items['id'].implode('', $items['options']));

} else {

$rowid = md5($items['id']);

}

//加入物品到购物车

unset($this->_cart_contents[$rowid]);

$this->_cart_contents[$rowid]['rowid'] = $rowid;

foreach($items as $key => $val) {

$this->_cart_contents[$rowid][$key] = $val;

}

return TRUE;

}

/**

* 更新购物车物品信息(私有)

*

* @access private

* @param array

* @return bool

*/

private function _update($items = array()) {

//输入物品参数异常

if( ! isset($items['rowid']) OR ! isset($items['qty']) OR ! isset($this->_cart_contents[$items['rowid']])) {

if($this->debug == TRUE) {

$this->_log("cart_items_data_invalid");

}

return FALSE;

}

//去除物品数量左零及非数字字符

$items['qty'] = preg_replace('/([^0-9])/i', '', $items['qty']);

$items['qty'] = preg_replace('/^([0]+)/i', '', $items['qty']);

//如果物品数量非数字,对购物车不做任何处理!

if( ! is_numeric($items['qty'])) {

if($this->debug === TRUE) {

$this->_log("cart_items_data(qty)_invalid");

}

return FALSE;

}

//如果购物车物品数量与需要更新的物品数量一致,则不需要更新

if($this->_cart_contents[$items['rowid']]['qty'] == $items['qty']) {

if($this->debug === TRUE) {

$this->_log("cart_items_data(qty)_equal");

}

return FALSE;

}

//如果需要更新的物品数量等于0,表示不需要这件物品,从购物车种清除

//否则修改购物车物品数量等于输入的物品数量

if($items['qty'] == 0) {

unset($this->_cart_contents[$items['rowid']]);

} else {

$this->_cart_contents[$items['rowid']]['qty'] = $items['qty'];

}

return TRUE;

}

/**

* 保存购物车数据到session

*

* @access private

* @return bool

*/

private function _save_cart() {

//首先清除购物车总物品种类及总金额

unset($this->_cart_contents['total_items']);

unset($this->_cart_contents['cart_total']);

//然后遍历数组统计物品种类及总金额

$total = 0;

foreach($this->_cart_contents as $key => $val) {

if( ! is_array($val) OR ! isset($val['price']) OR ! isset($val['qty'])) {

continue;

}

$total += ($val['price'] * $val['qty']);

//每种物品的总金额

$this->_cart_contents[$key]['subtotal'] = ($val['price'] * $val['qty']);

}

//设置购物车总物品种类及总金额

$this->_cart_contents['total_items'] = count($this->_cart_contents);

$this->_cart_contents['cart_total'] = $total;

//如果购物车的元素个数少于等于2,说明购物车为空

if(count($this->_cart_contents)

unset($_SESSION['cart_contents']);

return FALSE;

}

//保存购物车数据到session

$_SESSION['cart_contents'] = $this->_cart_contents;

return TRUE;

}

/**

* 日志记录

*

* @access private

* @param string

* @return bool

*/

private function _log($msg) {

return @file_put_contents('cart_err.log', $msg, FILE_APPEND);

}

}

/*End of file cart.php*/

/*Location /htdocs/cart.php*/

2. cart_demo.php文件如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33



session_start();

require_once('cart.php');

$items = array(

0 => array(

'id' => 'sp001',

'qty' => 20,

'price' => '10.50',

'name' => 'a002',

'options' => array(

'made' => 'china',

'company' => 'bgi'

)

),

1 => array(

'id' => 'sp002',

'qty' => 1,

'price' => '3.50',

'name' => 'b002'

)

);

$arr = array(

'rowid' => '86dbb7cb58a667558b4bbb1f60330028',

'qty' => 21

);

$cart = new Cart();

$cart->insert($items);

//var_dump($cart->contents());

$cart->update($arr);

var_dump($cart->contents());

//$cart->destroy();

//var_dump($_SESSION['cart_contents']);

/*end of php*/

希望本文所述对大家的php程序设计有所帮助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn