PDA

View Full Version : Hỏi về giỏ hàng ASP



Emotion
11-10-2002, 19:44
Mình đang làm một cái giỏ hàng bằng ASP .....nhưng kẹt ở chỗ thống kê giỏ hàng . Ví dụ : ông A lần đầu chọn mặt hàng thứ 1 , thông tin được lưu vào ( vd như số lượng , số tiền ) , sau đó ông ta tiếp tục chọn các mặt hàng khác ..cuối cùng ông ta quay trở lại mặt hàng 1 và chọn lần nữa .....Như vậy trong bảng thống kê giỏ hàng hiện tới hai lần mặt hàng 1 .Vậy cho hỏi có cách nào lưu lại trong section để khi ông này chọn hai lần mặt hàng 1 nhưng trong thống kê chỉ có hiển thị một lần thôi và được cộng dồn về số lượng và số tiền

White_Rose
11-10-2002, 20:14
Bạn sử dụng key đi.
Chẳng hạn:
If Len(Request.Cookies("giohang")("a"))=0 then
'chưa có hàng, tạo mwói
else
'có hàng rồi -> tăng lên
end if

blackface
12-10-2002, 08:42
hề hề, làm giỏ hàng đâu cần tới ASP, làm Javascript lưu vào cookies có nhanh hơn không?

artnet
12-10-2002, 23:21
Xin gợi ý một giải thuật khác:

Bạn chạy một câu Query dò tìm xem mặt hàng đã có trong giỏ hàng chưa???
Nếu mặt hàng chưa có trong giỏ hàng -> create new recordset
Nếu mặt hàng đã có trong giỏ hàng -> edit recordset và chỉ sửa chữa phần số lượng (số lượng + 1)

chúc bạn thành công
--=[artnet]=--

DTB
14-10-2002, 01:06
Thay vì liệt kê đơn giản thì hãy dùng câu lệnh SQL để SUM số luợng :

SELECT SUM(soluong),.... FROM.... WHERE.... GROUP BY ma_hang

Emotion
14-10-2002, 01:22
mình lấy dữ liệu từ access mà . ASP thì chỉ biết sơ sơ thôi ...có bạn nào giúp mình bằng cách sử dụng section không ?

White_Rose
14-10-2002, 12:59
Mình nghĩ buộc phải dùng cookie bởi vì người chọn không hẳn đã là thành viên. Mà nhiều người có thể chọn ở 1 thời điểm. Nếu không dùng cookie thì cũng phải lưu lại IP, nếu không thì ai biết đồ nào là của ai?

Nếu bạn dùng biến Session (không phải là section) thì cũng như cookie thôi. chẳng hạn lựa chọn lấy được thông qua Request.Form("mathang") thì:

Select case Request.Form("mathang")
case "hangA":
If Len(Session("hangA")=0 then
'chưa có hàng, tạo mới
Session("hangA")=1
else
'có hàng rồi -> tăng lên
Session("hangA") = Session("hangA") + 1
end if
case "hangB":
If Len(Session("hangB")=0 then
Session("hangB")=1
else
Session("hangB") = Session("hangB") + 1
end if
end select

DTB
15-10-2002, 04:13
White_Rose có những diểm không đúng là:

Khi người ta mua hàng, dù người đó có là thành viên hay không, thì ta cần phải biết họ tên, địa chỉ, số tài khoản ... của người đó (chứ không phải là cần biết IP). Sau đó, khi người ta đã chuyển tiền cho mình thì mình sẽ mang hàng đi giao. Nếu tiền đã chuyển mà địa chỉ không tìm ra để giao hàng (hóa đơn chưa được ký nhận hàng) thì số tiền đó là khỏan nợ mà sau này ta phải chuyển trả lại cho người ta. Biết IP cũng đâu có tìm ra địa chỉ.

Cookie thường dùng để lưu lại các thông tin như: người đó thường vào mục nào, lần gần nhất họ ghé qua trang web của ta là khi nào, lần đàu tiên là khi nào...Còn Session dùng để lưu các thông tin qua nhiều trang ASP nhưng là trong cùng 1 phiên làm việc. Trường hợp giỏ hàng hoặc login thì dùng Session là thích hợp hơn.

Không dùng Select Case trong truờng hợp này được. Vì như đoạn code của White_Rose thì có nghĩa là: mỗi lần chọn 1 mặt hàng thì tăng số lượng của nó lên 1 đơn vị -----> thường thì ta dùng 1 Form cho phép người mua chọn mỗi lần 5-10 mặt hàng và với số lượng không hạn chế.

Không dùng Select Case được vì nếu đây là siêu thị với vài chục ngàn mặt hàng thì làm sao liệt kê ra trong 1 file ASP được. Đoạn code của White_Rose chỉ có 2 mặt hàng thôi. Ngoài ra các mặt hàng chắc chắn sẽ thay đổi, nhất là linh kiện máy tính và thời trang phụ nữ. Cho dù có liệt kê ra được thì cũng phải thường xuyên viết lại và upload lên server lại.

Tóm lại: nguyên do là tại Emotion không trình bày kỹ ý tưởng của mình, đã làm tới đâu, đã làm như thế nào ...

Lẽ ra Emotion nên trình bày thế này:

Giả sử 1 siêu thị được chia thành nhiều quầy hàng, mỗi quầy có khoảng 10-15 mặt hàng (để thuận tiện download thông tin về tính năng kỹ thuật, giá cả, hình ảnh ... của các mặt hàng đó). Người mua vào 1 trang web (tương ứng với 1 quầy hàng) và có thể chọn mua 1 hoặc vài mặt hàng. Lưu ý là thực ra chỉ có 1 trang ASP, giống như forum này, khi có nhiều bài viết thì nó được chia ra nhiều trang, mỗi trang 15 bài viết. Trên trang web có 1 Form để người mua chọn...

Theo tôi thì:

Có 2 cách thiết kế:

- Chia trang web thành 2 Frame, frame chính dặt cái Form, frame phụ hiển thị thông tin về các mặt hàng mà khi người mua click vào sẽ dùng 1 đoạn cilent script ghi lại mã hàng và số lượng cho cái Form ở frame chính.

- Không chia frame mà mỗi trang đều có form để có thể chọn mua 1 hoặc vài mặt hàng. Khi chọn xong ở nhóm mặt hàng đó (1 quầy hàng) thì sẽ gửi lên server mã hàng và số lượng để cộng dồn vào các chọn lựa trước đó.

Trường hợp thứ nhất: xử lý việc cộng dồn bằng cilent script.

Trường hợp thứ hai: Có thể có các cách: nối tất cả các mã hàng và số lượng của tất cả các lần chọn vào thành 1 chuỗi ký tự và gán vào biến Session (sau đó sẽ xử lý chuỗi để cộng các mặt hàng giống nhau), hoặc là đặt một mảng (array) vào biến Session để lưu lại các mã hàng và số lượng, hoặc là ghi mã hàng và số lượng vào 1 table như là các record.

Việc xử lý chuỗi khá phức tạp vì ta cần dùng các biến tạm thời và duyệt qua chúng nhiều lần để cộng các mặt hàng trùng nhau.

Xử lý mảng trong Session còn phức tạp hơn vì mỗi lần thay đổi giá trị hoặc số phần tử của mảng phải nhớ gán ngược lại cho Session (ASP là như vậy đấy!!!).

Ghi vào table thì phải xử lý xóa đi sau khi người ta đặt mua hàng xong, Việc này không dễ, chẳng hạn khi người ta bị cúp điện ngang xương hoặc disconnect mà hông thèm logout ...

Hổng lẽ tui phải trình bày chi tiết của các cách khác nhau?

Hãy cho biết trang web của bạn nó ra làm sao, cái form nó như thế nào, thống kê giỏ hàng bằng lệnh cụ thể gì....có như vậy may ra mới biết được tại sao bạn không cộng dồn các mặt hàng lại được.

Emotion
15-10-2002, 13:42
Trong trang Web có 1 form chỉ khách hàng lựa chọn , nhưng chỉ là phần đăng kí để xác nhận là mình mua . Tất cả các mặt hàng mà khách đã lựa chọn đều được lưu vào 1 trang ASP ( trang này không hiển thị trong I.E ) . Khi thống kê giỏ hàng thì dữ liệu được lấy từ trang này mà ra . Mình không làm cái vụ thành viên , nên cần phải quan tâm đến nó . Data được lấy ra hiển thị trong IE dưới dạng table , khi thống kê giỏ hàng cũng vậy , nên mới có chuyện 2 mặt hàng cùng chọn nhưng trong 2 dòng thống kê lại có một mặt hàng giống nhau . Ý của mình là muốn gộp 2 dòng đó lại thàng một và được cộng dồn về số tiền và số lượng

DTB
17-10-2002, 00:44
.... Tất cả các mặt hàng mà khách đã lựa chọn đều được lưu vào 1 trang ASP ( trang này không hiển thị trong I.E ) . Khi thống kê giỏ hàng thì dữ liệu được lấy từ trang này mà ra ......

Hông hiểu gì cả!
Làm sao mà lưu vào trang ASP được.
Lưu vào biến nhớ, mảng, collection hay là lưu vào file .txt hay là lưu vào database ?

Tốt hơn hết bạn hãy gửi kèm lên đây đoạn code mà bạn cho là không cộng được đó.

Emotion
17-10-2002, 00:57
Muốn điên với bác TDB luôn , các mặt hàng đều có mã số , tiền , hình ảnh .....khi nhấp chuột vào hình ảnh thì liên kiết đó sẽ kéo được lưu các tham số vào trang Web không hiển thị trong I.E . Cho mình cái YM đi rồi mình gửi bài đó cho ....Không phải là mình không biết cộng mà mình không biết cộng nó như thế nào

White_Rose
17-10-2002, 02:08
Sao không upload lên đây???

Emotion
17-10-2002, 02:12
Đây bài mình muốn làm đây ..........chay flie hanghoathi.1.asp nhe
tên DSN : qlhh

DTB
18-10-2002, 02:39
Về phương án thì có 2 phương án:
- Cộng dồn ngay khi người mua chọn các mặt hàng trong từng nhóm. Sẽ phải kiểm tra trước để xem mặt hàng đó đã từng được chọn chưa. Nếu chưa thì thêm vào. Nếu đã có thì chỉ cộng thêm số lượng.
- Chỉ cộng khi cần. Khi người mua chọn mua thì ta chỉ nhắm mắt mà thêm vào như đó là 1 mặt hàng mới. Chỉ khi người mua nhấn "BUY" hoặc "VIEW CART" khi đó ta mới xử lý để cộng dồn lại.

Cách làm cụ thể thì tùy theo cách mà ta sử dụng để lưu thông tin (trong mảng, hoặc trong 1 bộ các biến như của Emotion làm, hoặc trong 1 file .txt, hoặc trong database...).

Phương án 2 chỉ thuận tiện khi ta lưu các chọn lựa vào database bởi vì ta có thể dùng 1 lệnh duy nhất là:
SELECT mh, SUM(sl) AS soluong, ... FROM...WHERE...GROUP BY mh
thay cho lệnh SELECT * ....

Trong trường hợp lưu các chọn lựa vào bộ các biến Session như bạn đã làm thì phương án 1 tiện hơn.
Ví dụ 1 người đã chọn mua 2 lít "NuocMam" và 10 gói "MiTom" thì khi đó ta có giá trị của các biến là:
Session("h")=2 ------->số mặt hàng đã chọn mua
Session("mh1")="NuocMam"
Session("sl1")=2
Session("mh2")="MiTom"
Session("sl2")=10
Nếu người đó mua thêm 5 gói mì, lúc đó ta sẽ duyệt qua xem mã hàng "MiTom" đã có hay chưa. Ta làm sao cho các biến sẽ có giá trị là:
Session("h")=2 ------->số mặt hàng đã chọn mua
Session("mh1")="NuocMam"
Session("sl1")=2
Session("mh2")="MiTom"
Session("sl2")=15

****Nếu với phương án 2 thì các biến sẽ là:
Session("h")=3 ------->số mặt hàng đã chọn mua
Session("mh1")="NuocMam"
Session("sl1")=2
Session("mh2")="MiTom"
Session("sl2")=10
Session("mh3")="MiTom"
Session("sl3")=5
********************


Trong hanghoathi5.asp sửa lại là:

<body>
<%
smh=session("list")
i=1

while i<=smh
c="C"+cstr(i)
j=request.form(c)

if (j="ON") then
'session("h") la tong so mat hang duoc danh dau chon mua va da khoi tao trong global


'-------------------------- Duyệt qua tất cả các session("mh"+***)
check=0
FOR k=1 TO session("h")
IF session("mh"+cstr(k))=session("m"+cstr(i)) THEN
'--------ghi nhớ session mã hàng thứ mấy đã có mã hàng trùng lắp
check=k
EXIT FOR
END IF
NEXT
IF check <> 0 THEN
'-------- Chỉ cộng thêm số lượng
session("sl"+cstr(check)) = session("sl"+cstr(check)) + request.form("T"+cstr(i))
ELSE
'-------- làm bình thường
session("h")=session("h")+1
session("mh"+cstr(session("h")))=session("m"+cstr(i))
session("sl"+cstr(session("h")))=request.form("T"+cstr(i))
session("hinh"+cstr(session("h")))=session("h"+cstr(i))
session("ten"+cstr(session("h")))=session("t"+cstr(i))
session("gia"+cstr(session("h")))=session("g"+cstr(i))
END IF
end if

i=i+1

wend
session("listchon")=session("h")

'Tro ve hanghoathi1.asp

response.write("<script language=javascript> location.href='hanghoathi1.asp';</script>")


%>

</body>

Emotion
18-10-2002, 23:16
Rất cám ơn sự giúp đỡ tận tình của DTB ( database..??? ) .

okano2857
14-11-2002, 16:55
Theo mình, Tại sao bạn không chịu sử dụng theo kiểu danh sách
Danh sách đó sẽ lưu giống như là nối chuỗi lại với nhau. Mỗi sản phẩm khi user chọn sẽ được nối với nhau kèm theo một ký tự đặc biệt trước nó để phân biệt thông tin của từng sản phẩm.
Trong thông tin của từng sản phẩm có lưu trữ về mã sản phẩm đó.
Danh sách đó sẽ được lưu trong một biến Session. Khi User chọn một món hàng thì bạn sẽ lấy mã của từng sản phẩm bạn lưu trong danh sách so với mã sp mà user chọn . nếu trùng thì tự động tăng số lượng của sp đó lên ngược lại thì nối sp đó vào.
Bạn nghĩ thế nào. Đó chỉ là cách xử lý của mình.

sangls
24-05-2011, 23:13
ban nào có giỏ hàng này cho mình với,help me