Đề tài Đưa một cửa hàng lên mạng internet

Khi một khách hàng nhấn vào nút Checkout trong giỏ đi chợ thì hai điều phải xảy ra: Đầu tiên, tất cả các mục hàng trong giỏ đi chợ phải được chuyển đến bảng Orders. Thứ hai, các mục hàng phải được loại bỏ khỏi giỏ đi chợ. Đây là một ví dụ hoàn hảo về giao dịch.

Trong một giao dịch, một chuỗi các bước sẽ thành công hay thất bại toàn bộ. Một ví dụ mẫu về chuyển tiền từ một tài khoản đến một tài khoản khác (việc chuyển tiền sử dụng một máy rút tiền tự động). Nếu một khách hàng chuyển tiền từ tài khoản vãng lai của họ đến tài khoản tiết kiệm của họ thì hai điều phải xảy ra: Tài khoản vãng lai của họ phải bị ghi nợ một số tiền nào đó và tài khoản tiết kiệm của họ cũng phải được ghi có cùng số tiền như vậy. Tuy nhiên nếu bước đầu tiên hoàn thành nhưng bước thứ hai không hoàn thành thì số tiền đó sẽ biến mất mà không bao giờ được tìm thấy lại.

Việc sử dụng giao dịch sẽ giải quyết được vấn đề này. Nếu bất kỳ bước nào trong một giao dịch thất bại thì tất cả các bước khác cũng bị huỷ bỏ (roll back). Vì thế, nếu máy rút tiền của ta bị sự cố vào lúc sau khi nó ghi nợ cho tài khoản vãng lai của khách hàng thì số tiền của họ sẽ không bị mất. Tất cả các bước trong giao dịch sẽ bị huỷ bỏ và số tiền này sẽ được ghi lại trong tài khoản vãng lai của khách hàng. Có ba phương pháp khác nhau về sử dụng các giao dịch với một trang ASP. Ta có thể tạo các trang ASP có khả năng giao dịch, tạo các giao dịch ADO, hoặc sử dụng các giao dịch cơ sở dữ liệu.

 

doc54 trang | Chia sẻ: maiphuongdc | Lượt xem: 1721 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Đưa một cửa hàng lên mạng internet, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ạnh thông tin về tình trạng của một đơn đặt hàng. Khi các khách hàng thêm những mục hàng vào trong giỏ đi chợ của họ thì một trang đăng ký sẽ xuất hiện yêu cầu khách hàng đăng nhập. Nếu đây là lần đầu tiên một khách hàng sử dụng cửa hàng thì họ được yêu cầu nhập vào thông tin đăng ký trong đó có username và password của họ. Sau khi các khách hàng đã đăng ký một lần họ có thể truy xuất giỏ đi chợ của họ trong thời gian tới chỉ bằng cách nhập vào username và password hoặc tự động nếu trình duyệt có hỗ trợ cookie. Sau khi một người dùng đăng nhập vào, mục hàng được khách hàng chọn thêm vào trong giỏ đi chợ sẽ được thêm vào trong bảng Cart. Các mục hàng sẽ được duy trì thường trực trong giỏ đi chợ. Cuối cùng, khi các khách hàng đã sẵn sàng hoàn thành đơn đặt hàng của họ, họ có thể nhấp vào nút Checkout (thanh toán) trong giỏ đi chợ của họ. Khi khách hàng nhấp vào nút Checkout, tất cả các mục hàng sẽ được chuyển từ bảng Cart đến bảng Orders và các mục hàng trong bảng Cart của người khách này sẽ bị xoá. Các bảng Users, Cart, Orders sẽ được sử dụng tuần tự. Tạo bảng Users User_id Autonumber Nó chứa một con số duy nhất (unique) được tạo tự động cho mỗi khách hàng. User_username Text Chứa tên mà khách hàng sử dụng để đăng nhập vào cửa hàng trực tuyến. Mỗi người dùng có một username duy nhất. User_password Number Chứa password bí mật mà một khách hàng sử dụng để truy xuất giỏ đi chợ của mình. User_email Text Địa chỉ email của khác hàng, nó luôn là thông tin tốt trong trường hợp ta cần liên hệ với họ. User_street Text Địa chỉ đường của khách hàng, VD: 15 Lò Sũ User_city Text Thành phố nơi khách hàng sống, VD: Hà Nội. User_zip Number Mã số vùng điện thoại, VD: 4. User_state Text Mã bang gồm 2 chữ cái, VD: CA. User_cctype Text Loại thẻ tín dụng mà khách hàng muốn sử dụng để mua hàng, VD: VISA, MasterCard. User_ccnumber Number Số thẻ tín dụng của khách hàng. User_ccexpires Date/Time Ngày tháng hết hạn thẻ tín dụng của khách. User_ccname Text Tên của khách hàng trong thẻ tín dụng. Tạo bảng Cart Cart_id Autonumber Chứa một con số duy nhất cho mỗi giỏ đi chợ Cart_userID Number Một trường kiểu số liên kết một giỏ đi chợ với một khách hàng cụ thể. Cart_productID Number Một trường kiểu số chứa ID của sản phẩm được chứa trong giỏ đi chợ. Cart_quantity Number Một trường kiểu số chứa số lượng của mục hàng mà khách hàng đã chọn. Bảng orders OrderID Autonumber Chứa số chỉ định duy nhất (unique) mỗi đơn đặt hàng sản phẩm. Order_productID Number Đại diện mã số sản phẩm của mục hàng. Order_quantity Number Đại diện số lượng của các mục hàng được đặt. Order_userID Autonumber Chứa mã số duy nhất (unique ID) của người dùng thực hiện việc đặt hàng. Order_entrydate Date/Time Đại diện ngày tháng thực hiện đơn đặt hàng Order_status Number Đại diện tình trạng của đơn đặt hàng. Order_shipdate Date/Time Ngày tháng giao sản phẩm. 1.2 §¡NG Ký NG¦êI Sö DôNG Để các khách hàng có thể thêm các mục hàng vào trong giỏ đi chợ của họ, trước tiên họ phải đăng ký. Thay vì nhập thông tin địa chỉ và thông tin chi trả mỗi lần một mục hàng mới được mua, khách hàng có thể nhập thông tin này một lần. Sau khi thông tin này được nhập vào một lần. Sau khi thông tin này được nhập vào một lần, nó có thể được truy xuất tự động từ cơ sở dữ liệu bất cứ khi nào khách hàng mua thêm các mục hàng khác. Một lợi ích khác đối với việc yêu cầu các khách hàng đăng ký đó là nó cho phép các khách hàng duy trì một giỏ đi chợ qua nhiều lần truy cập đến website. Ví dụ, một khách hàng có thể thêm hai mục hàng vào giỏ đi chợ, nhưng có thể đợi hai ngày để cân nhắc việc mua hàng trước khi nhấn vào nút Checkout. Việc tạo một giỏ đi chợ thường trực mà không yêu cầu khách hàng nhập vào thông tin đăng ký để một giỏ đi chợ có thể được so khớp với một người dùng là không thể được. Tạo trang Cart.asp Khi một khách hàng nhấn vào nút Add to Cart (thêm vào giỏ đi chợ) trong một trang trình bày sản phẩm, họ sẽ được đưa đến trang cart.asp buộc khách hàng phải đăng ký và đăng nhập trước khi xuất giỏ đi chợ. Trang Cart.asp <% ' Get Product ID productID = TRIM(Request("pid")) ' Get Login Information username = TRIM(Request("username")) password = TRIM(Request("password")) register = TRIM(Request("register")) error = TRIM(Request("error")) ' Open Database Connection Set Con = Server.CreateObject("ADODB.Connection") Con.Open "accessDSN" ' Check For New Registration IF register "" AND error = "" THEN ' AddUser END IF ' Get UserID userID = checkpassword(username,password,Con) IF userID > 0 THEN %> Khi một khách hàng đến trang Cart.asp một trong hai điều sẽ sảy ra: Nếu username và password của khách hàng có thể được gọi ra từ tập hợp Request thì trang addCart.asp sẽ được hiển thị. Nếu không thì trang đăng ký sẽ được hiển thị. Nói một cách khác, khách hàng chỉ có thể xem được trang addCart.asp nếu khách hàng đã nhập vào các thông tin đăng ký. Trang Register.asp Trang Register.asp chứa hai form HTML cho phép một khách hàng đăng nhập với một username và password đã có hoặc đăng ký như một khách hàng mới. Sau khi một khách hàng hoàn thành cả hai form HTML, khách hàng được gởi trở về trang đính kèm trang Register.asp. Ví dụ: Nếu trang Register.asp được hiển thị bởi vì khách hàng đang cố gắng truy xuất giỏ đi chợ, thì thông tin đăng nhập hoặc thông tin đăng ký được gởi đến Cart.asp. Các hàm đăng ký: Hầu hết các công việc đăng ký và kiểm chứng thông tin đăng nhập của các khách hàng diễn ra trong file Storefuncs.asp. File Storefuncs.asp chứa các hàm và thủ tục kiểm chứng thông tin đăng nhập của một khách hàng và thông tin đăng ký mới vào cơ sở dữ liệu. Khi một khách hàng mới nhập vào thông tin đăng ký thì thủ tục addUser sẽ được gọi. Thủ tục này truy xuất tất cả các trường trong form đăng ký, kiểm chứng tài liệu trong trường, thêm thông tin vào bảng Users và thêm các cookies chứa username và password vào trình duyệt của khách hàng. Thủ tục addUser SUB addUser ' Get Registration Fields newusername=TRIM(Request("newusername")) newpassword=TRIM(Request("newpassword")) email=TRIM(Request("email")) street=TRIM(Request("street")) city=TRIM(Request("city")) state=TRIM(Request("state")) zip=TRIM(Request("zip")) cctype=TRIM(Request("cctype")) ccnumber=TRIM(Request("ccnumber")) ccexpires=TRIM(Request("ccexpires")) ccname=TRIM(Request("ccname")) ' Check For Required Fields backpage=Request.ServerVariables("SCRIPT_NAME") IF newusername = "" THEN errorForm "You must enter a username.", backpage END IF IF newpassword = "" THEN errorForm "You must enter a password.", backpage END IF IF email = "" THEN errorForm "You must enter your email address.", backpage END IF IF street = "" THEN errorForm "You must enter your street.", backpage END IF IF city = "" THEN errorForm "You must enter your city.", backpage END IF IF state = "" THEN errorForm "You must enter your state.", backpage END IF IF zip = "" THEN errorForm "You must enter your zip code.", backpage END IF IF ccnumber = "" THEN errorForm "You must enter your credit card number.", backpage END IF IF ccexpires = "" THEN errorForm "You must enter your credit card expiration date.", backpage END IF IF ccname = "" THEN errorForm "You must enter the name that appears on your credit card.", backpage END IF ' Check for Necessary Field Values IF invalidEmail(email) THEN errorForm "You did not enter a valid credit email card address.", backpage END IF IF NOT validCCNumber(ccnumber) THEN errorForm "You did not enter a valid credit email card number.", backpage END IF IF NOT isDate(ccExpires) THEN errorForm "You did not enter a valid credit email card expiration date.", backpage END IF ' Check whether username already registered IF alreadyUser(newusername) THEN errorForm "Please choose a differen username.", backpage END IF ' Add New User to Database sqlString="INSERT INTO user("user_username,user_password, user_email,user_street,user_city,user_state,user_zip,user_ccnumber, user_cctype,user_ccexpires,user_ccname") VALUES(" '"&fixQuotes(username)&"','"&fixQuotes(newpassword)&"', '"&fixQuotes(email)&"','"&fixQuotes(street)&"','"&fixQuotes(city)&"','"&fixQuotes(state)&"','"&fixQuotes(zip)&"','"&fixQuotes(ccnumber)&"','"&cctype&"','"&ccexpires&"','"&fixQuotes(ccname)&"' ")" Con.Execute sqlString 'User the new username and password username = newusername password = newpassword ' Add Cookies addCookie "username", username addCookie "password", password END SUB Thủ tục addUser thực hiện một số chức năng quan trọng vì thế ta cần xem xét chi tiết về cách làm việc. Dữ liệu mà khách hàng nhập vào trong các trường địa chỉ email, số thẻ tín dụng và ngày hết hạn thẻ tín dụng được kiểm chứng. Địa chỉ email được kiểm chứng bằng một hàm có tên là invalidEmail(), hàm này chỉ kiểm tra xem địa chỉ email mà khách hàng nhập vào có chứa dấu chấm và chữ @ hay không ? FUNCTION invalidEmail(mail) IF INSTR(email, "@") = 0 OR INSTR(email, ".") = 0 THEN invalidEmail = TRUE ELSE invalidEmail = FALSE END IF END FUNCTION Ngày hết hạn thẻ tín dụng mà khách hàng nhập vào cũng được kiểm chứng, nếu khách hàng không nhập vào ngày tháng hợp lệ, thì thủ tục errorForm sẽ được gọi để khách hàng có thể sửa sai. Số thẻ tín dụng mà khách hàng nhập vào được kiểm chứng bằng phép kiểm tra Luhn. Tất cả các thẻ tín dụng chính như VISA, MasterCard, American Express và Discover Cards đều có một ký số cho phép ta kiểm tra số thẻ tín dụng có hợp lệ hay không. Tất nhiên, phép kiểm tra Luhn không thể sử dụng để xác định xem một khách hàng có thực sự còn tiền trong tài khoản thẻ tín dụng hay không? Tuy nhiên việc sử dụng phép kiểm tra Luhn là một cách thức tốt để loại bỏ những số thẻ không hợp lệ. Phép kiểm tra Luhn được thực hiện trong hàm validCCNumber() FUNCTION validCCNumber(ccnumber) ccnumber=cleanCCNum(ccnumber) IF ccnumber = "" THEN validCCNumber = FALSE ELSE isEven = FALSE digits="" FOR i=Len(ccnumber) TO 1 STEP -1 IF isEven THEN digits = digits & CINT(MID(ccnumber,i,1)) * 2 ELSE digits = digits & CINT(MID(ccnumber,i,1)) END IF isEven = (Not isEven) NEXT checkSum = 0 FOR i=1 TO Len(digits) STEP 1 checkSum = checkSum + CINT(MID(digits,i,1)) NEXT validCCNumber=((checkSum Mod 10) = 0) END IF END FUNCTION Hàm validCCnumber() kiểm tra xem một số thẻ tín dụng có hợp lệ hay không bằng cách gấp đôi mọi số ký khác, bắt đầu từ ký số cuối cùng và cộng các con số kết quả lại với nhau. Nếu kết quả đó chia hết cho 10 thì số thẻ tín dụng này sẽ qua được cuộc kiểm tra. Điều đầu tiên mà hàm validCCCNumber làm là gọi một hàm khác tên là cleanCCNum. Hàm cleanCCNum() loại bỏ bất kỳ ký tự nào không phải là số trong thẻ tín dụng. Việc những người dùng nhập vào một số thẻ tín dụng có cả khoảng trống và dấu gạch ngang là rất phổ biến. Để kiểm chứng con số này, trước tiên ta phải trích ra những ký tự này. Hàm cleanCCNum. FUNCTION cleanCCNum (ccnumber) FOR i=1 TO Len(ccnumber) IF isNumeric(MID(ccnumber,i,1)) THEN cleanCCNumber=cleanCCNumber & MID(ccnumber,i,1) END IF NEXT END FUNCTION Hàm cleanCCNum() chỉ duyệt qua từng ký tự trong số thẻ tín dụng bằng cách sử dụng hàm MID(). Nếu một ký tự không phải là số thì ký tự này sẽ được bỏ qua. Nếu không thì nó sẽ được thêm ngược vào số thẻ tín dụng. Sau khi các trường trong form được kiểm chứng trong thủ tục addUser, hàm alreadyUser() được gọi để kiểm tra xem có ai đó đã đăng ký sử dụng username mà khách hàng đã nhập vào hay không. Khi hàm này được gọi chúng ta cần kiểm tra xem username này đã tồn tại hay chưa để chúng ta có thể đảm bảo là tất cả các username trong bảng Users đều duy nhất (unique). FUNCTION alreadyUser (theUsername) SqlString = "SELECT user_username FROM users WHERE user_username='"&fixQuotes(theUsername)&"' " SET RS = Con.Execute(sqlString) IF RS.EOF THEN alreadyUser = FALSE ELSE AlreadyUser = TRUE END IF RS.Close END FUNCTION Hàm alreadyUser xây dựng một câu lệnh Select của SQL để kiểm tra xem username có tồn tại trong cơ sở dữ liệu hay không. Câu lệnh SQL này được sử dụng để mở một Recordset tên là RS. Nếu RS rỗng (được kiểm tra với thuộc tính EOF của đối tượng Recordset). Chúng ta biết rằng người dùng này không tồn tại trong bảng Users. Hai cookie chứa username và password được thêm vào trình duyệt của khách hàng. Điều này được thực hiện để khách hàng không phải đăng nhập mỗi lần khách hàng muốn truy xuất giỏ đi chợ hoặc xem thông tin về tài khoản. Các cookie được thêm vào bằng một thủ tục addCookie. Thủ tục addCookie SUB addCookie(theName, the Value) Response.Cookie(theName) = theValue Response.Cookie(theName).Expires = "December 31, 2002" Response.Cookie(theName).Path = "/" Response.Cookie(theName).Secure = FALSE END SUB Thêm một cookie vào trình duyệt của một khách hàng bằng cách sử dụng tập hợp Cookie của đối tượng Response. Cookie này được thiết lập ngày hết hạn là ngày 31 tháng 12 năm 2002. Nếu ta không thiết lập thuộc tính Expires thì cookie sẽ tự động hết hạn sau khi khách hàng rời khỏi website hoặc đóng trình duyệt. Thực tế là không có sự đảm bảo là cookie sẽ tồn tại cho đến ngày 31 tháng 12 năm 2002, một file cookie có thể chứa chỉ một số lượng thông tin hạn chế, vì thế username và password có thể bị xoá bỏ khỏi cookie từ trước đó. Nếu các cookie bị mất thì vấn đề này cũng không hề gì. Người dùng chỉ cần đăng nhập lại và các cookie sẽ được tự động thêm lại. Xử lý các lỗi trong form một cách tế nhị Thủ tục addUser trong những phần trước đã sử dụng nhiều đến một thủ tục khác có tên là errorForm. Thủ tục errorForm hiển thị một thông báo lỗi và yêu cầu người dùng trở về trang trước để xoá lỗi. Trang errorForm có một đặc điểm khá thú vị khi người dùng nhấn vào nút tên là Return thì tất cả dữ liệu ban đầu mà người dùng nhập vào trong form HTML sẽ được truyền ngược về cho form. Bởi vì thông tin được truyền ngược về cho form nên người dùng không cần phải bắt đầu điền lại các trường trong form. Thủ tục errorForm SUB errorFORM(errorMSG, backpage) %> Problem There was a problem with the information you entered: "> <% Reponse.End END SUB Thủ tục errorForm chấp nhận hai tham số: errorMSG và backpage. Tham số errorMSG chứa nội dụng của thông báo lỗi sẽ được hiển thị, tham số backpage chứa đường dẫn của form ban đầu. Các trường ẩn trong form được tạo với thủ tục formFields. Thủ tục formFields SUB formFields FOR each item in Request.Form %> "> <% NEXT END SUB Thủ tục formFields duyệt qua tất cả các mục được chứa trong tập hợp Form của đối tượng Request. Mỗi mục trong tập hợp form được làm thành một trường ẩn. Khi người dùng nhấn vào nút Return thì những trường ẩn này được truyền ngược lại cho form HTML ban đầu để chúng có thể được hiển thị lại. 1.3 Sö DôNG SECURE SOCKETS LAYER Khi một khách hàng điền vào form đăng ký họ phải nhập vào thông tin thẻ tín dụng. Khi form đăng ký được đệ trình thì thông tin thẻ tín dụng được truyền qua Internet dưới dạng văn bản thuần tuý thì điều này rất nguy hiểm. Bất cứ khi nào thông tin di chuyển đi trên Internet nó phải trải qua vài kết nối trực tiếp. Về mặt lý thuyết, một cá nhân với những dự tính không trong sáng có thể trộm thông tin này khi nó trên đường đến đích. Để bảo vệ thông tin thẻ tín dụng của khách hàng ta phải sử dụng Secure Sockets Layer (SSL). SSL là một công nghệ được phát triển đầu tiên bởi Netscape. Nó cho phép ta truyền thông tin qua Internet một cách an toàn. SSL cung cấp một giải pháp kỹ thuật cho ba vấn đề bảo mật riêng biệt: mã hoá, xác thực và đồng nhất dữ liệu. Khi thông tin được truyền sử dụng SSL, thông tin sẽ được mã hoá. Thậm chí nếu một người nào đó lấy trộm thông tin khi nó di chuyển từ trình duyệt của một khách hàng đến Web Server của ta thì dữ liệu này cũng không thể sử dụng được. SSL mã hoá thông tin khi thông tin này di chuyển qua lại giữa một Web Server và một trình duyệt Web bằng cách mã hoá thông tin với một thuật toán mã hoá được biết đến công khai và một khoá mã hoá phiên làm việc bí mật. Số lượng các bit trong khoá phiên làm việc xác định sức mạnh của việc mã hoá. Hiện tại có hai loại kích thước khoá chuẩn: 40 bits và 128 bits. Mặc dù có những trường hợp các thông điệp được mã hoá với khoá 40 bits bị xâm nhập nhưng khoá 128 bits được xem là không thể giải được với công nghệ hiện đại. SSL cũng có thể được sử dụng để xác thực một Web Server. Về mặt lý thuyết, một cá nhân ác tâm nào đó cũng có thể lừa một khách hàng tin rằng một Website khác là Website của ta. Sau đó cá nhân ác tâm này có thể trộm số thẻ tín dụng khi các khách hàng đệ trình thông tin đến Website lừa đảo. Tuy nhiên, khi ta sử dụng SSL trên Web Server của ta thì ta được yêu cầu cài đặt một server certificate, server certificate này ngăn chặn những Website khác không cho chúng giả mạo Website của ta. Một server certificate chứa thông tin về Website của ta, tổ chức của ta và nơi phát hành certificate. Cuối cùng, SSL bảo vệ sự đồng nhất của dữ liệu khi nó được truyền qua Internet. Về mặt lý thuyết, một người với những dự tính đáng ngờ có thể lục lọi dữ liệu khi nó được truyền qua lại giữa một Web Server và một trình duyệt Web. SSL bảo vệ sự đồng nhất của dữ liệu bằng cách đính kèm một mã xác thực thông điệp (MAC) với dữ liệu khi nó được truyền tải. Nói một cách khác, khi ta sử dụng SSL, ta biết rằng thông điệp nhận được là giống hệt với thông điệp được gởi đi. Ngoài ra, nếu ta yêu cầu những thông tin bí mật như số thẻ tín dụng từ khách hàng của ta thì ta phải có trách nhiệm bảo vệ thông tin này. Giải pháp duy nhất thường được sử dụng cho vấn đề này là sử dụng SSL. 2. X¢Y DùNG GIá §I CHî Có hai phương pháp để thêm một giỏ đi chợ vào cửa hàng trực tuyến: Sử dụng các biến session và sử dụng một bảng trong cơ sở dữ liệu. Có một khuyết điểm chính đối với phương pháp tạo giỏ đi chợ khi sử dụng các biến session đó là các biến session phụ thuộc vào cookie mà không phải tất cả các trình duyệt đều hỗ trợ cookie, mặt khác các biến session bị mang tiếng là không đáng tin cậy. Khi một vị khách lần đầu tiên đến tham quan một Website có sử dụng các biến session thì Web Server sẽ thêm một cookie vào trình duyệt của vị khách này để theo dõi vị khách khi người này chuyển từ trang này sang trang khác. Khi một biến session được tạo, cookie này được sử dụng để kết hợp biến này với người sử dụng thích hợp. Nếu vì một lý do nào đó mà cookie không thể được tạo trên trình duyệt của người dùng thì các biến session sẽ không hoạt động. Một vấn đề quan trọng khác với việc sử dụng các biến session là chúng sẽ hết hạn sau một khoảng thời gian được định trước. Theo mặc định, một phiên làm việc (session) của người dùng sẽ kết thúc sau 20 phút không hoạt động. Sau khi một phiên làm việc đã hết hạn, tất cả các biến session liên quan đến phiên đó sẽ tự động bị xoá khỏi bộ nhớ. Sö dông b¶ng trong c¥ së d÷ liÖu §Ó t¹o giá §i chî Khi một khách hàng nhấn vào nút Add To Cart trong một trang trình bày sản phẩm thì sản phẩm mà khách hàng lựa chọn sẽ được thêm vào một bảng được chứa trong một biến session có tên là cart. Khi khách hàng tiếp tục tham quan cửa hàng, những mục hàng mới có thể được thêm vào giỏ đi chợ hoặc những mục hàng hiện có (đã chọn) có thể bị bỏ đi. Khi khách hàng kết thúc việc mua sắm, khách hàng có thể nhấn vào nút Checkout để thực sự mua những mặt hàng được chứa trong giỏ đi chợ. Trang addCart.asp <% ' Get ProuctID productID=TRIM(Request("pid")) ' Add Item to cart IF productID "" THEN sqlString="SELECT cart_id FROM cart WHERE cart_userID = '&userID&' AND cart_productID = &productID" SER RS=Con.Execute(sqlString) IF RS.EOF THEN sqlString="INSERT INTO cart(cart_userID,cart_productID, cart_quantity) VALUE(userID&,product_ID&,1)" ELSE sqlString="UPDATE cart SET cart_quantity = cart_quantity + 1 WHERE cart_ID = &RS("cart_ID")" END IF RS.Close SET RS = Nothing Con.Execute sqlString END IF 'Update Shopping Cart Quantities IF Request("updateQ") "" THEN SET RS = Server.CreateObject("ADODB.Recordset") RS.ActiveConnection = Con RS.CursorType = adOpenDynamic RS.LockType = adLockOptimistic sqlString = "SELECT cart_id, cart_quantity FROM cart WHERE cart_userID = &userID" RS.Open sqlString WHITE NOT RS.EOF newQ = TRIM(Request("qp"&RS("cart_ID"))) deleteProduct = TRIM(Request("pd"&RS("cart_ID"))) IF newQ = "" OR newQ = "0" OR deleteProduct "" THEN RS.Delete ELSE IF isNumeric(newQ) THEN RS("cart_quantity") = newQ END IF END IF RS.MoveNext WEND %> Shopping Cart 's shopping cart: <% ' Get the shopping cart sqlString = "SELECT cart_id, product_name, product_price, cartquantity FROM cart, products WHERE cart_userID = '&userID&' AND cart_productID = product_id ORDER BY cart_id DESC" SET = Con.Execute(sqlString) IF RS.EOF THEN %> You do not have any items in your shopping cart <% ELSE orderTotal = 0 %> "> "> Product Price Quantity <% WHILE NOT RS.EOF orderTotal = orderTotal + (RS("product_price")*RS("cart_quantity")) %> " type="text" size=4 value=""> " type="checkbox" value="1">Delete <% RS.MoveNext WEND %> Order Total: "> "> Trang addCart.asp có ba phần mã chính, phần đầu thêm một mục hàng mới vào giỏ đi chợ phần này được thực thi sau khi khách hàng nhấp vào nút Add To Cart trên trang Product.asp. Kế tiếp là cập nhật số lượng của các sản phẩm trong giỏ đi chợ. Một khách hàng có thể thay đổi số lượng của mỗi mục hàng được chọn bằng cách nhập vào những giá trị mới trong form HTML hiển thị giỏ đi chợ và nhấp vào nút Update Cart. Ngoài ra, một khách hàng có thể loại bỏ hoàn toàn một mục hàng bằng cách thiết lập số lượng của nó là zero hoặc để trống phần này. Giá trị của hộp chọn Delete được gọi ra và mục hàng này sẽ bị loại bỏ khỏi giỏ đi chợ khi trường này có một giá trị. Phần này được thực thi sau khi khách hàng nhấp vào nút Update Cart trên giỏ đi chợ. Cuối cùng là phần chính được sử dụng để thực sự hiển thị giỏ đi chợ. Điều này được thực hiện bằng cách gọi ra tất cả các mẩu tin được chứa trong bảng Cart có liên quan đến một khách hàng cụ thể. Mỗi mục hàng trong giỏ đi chợ sẽ được hiển thị từng cái một. Về mặt lý thuyết, giỏ đi chợ này là thường trực, một khách hàng thêm một số mục hàng vào giỏ đi chợ, đi nghỉ mát dài hạn ở Cửa Lò, quay trở về cửa hàng trực tuyến này và các sẽ vẫn còn nằm trong giỏ đi chợ. Hơn nữa, giỏ đi chợ này không phụ thuộc vào những thuộc tính của trình duyệt của người dùng, không có một cookie nào được sử dụng. 3. THANH TO¸N 3.1 T×M HIÓU VÒ GIAO DÞCH (TRANSACTION) Khi một khách hàng nhấn vào nút Checkout trong giỏ đi chợ thì hai điều phải xảy ra: Đầu tiên, tất cả các mục hàng trong giỏ đi chợ phải được chuyển đến bảng Orders. Thứ hai, các mục hàng phải được loại bỏ khỏi giỏ đi chợ. Đây là một ví dụ hoàn hảo về giao dịch. Trong một giao dịch, một chuỗi các bước sẽ thành công hay thất bại toàn bộ. Một ví dụ mẫu về chuyển tiền từ một tài khoản đến một tài khoản khác (việc chuyển tiền sử dụng một máy rút tiền tự động). Nếu một khách hàng chuyển tiền từ tài khoản vãng lai của họ đến tài khoản tiết kiệm của họ thì hai điều phải xảy ra: Tài khoản vãng lai của họ phải bị ghi nợ một số tiền nào đó và tài khoản tiết kiệm của họ cũng phải được ghi có cùng số tiền như vậy. Tuy nhiên nếu bước đầu tiên hoàn thành nhưng bước thứ hai không hoàn thành thì số tiền đó sẽ biến mất mà không bao giờ được tìm thấy lại. Việc sử dụng giao dịch sẽ giải quyết được vấn đề này. Nếu bất kỳ bước nào trong một giao dịch thất bại thì tất cả các bước khác cũng bị huỷ bỏ (roll back). Vì thế, nếu máy rút tiền của ta bị sự cố vào lúc sau khi nó ghi nợ cho tài khoản vãng lai của khách hàng thì số tiền của họ sẽ không bị mất. Tất cả các bước trong giao dịch sẽ bị huỷ bỏ và số tiền này sẽ được ghi lại trong tài khoản vãng lai của khách hàng. Có ba phương pháp khác nhau về sử dụng các giao dịch với một trang ASP. Ta có thể tạo các trang ASP có khả năng giao dịch, tạo các giao dịch ADO, hoặc sử dụng các giao dịch cơ sở dữ liệu. Các giao dịch trong trang ASP Trong một trang ASP có khả năng giao dịch, những thay đổi được thực hiện trong trang được tự động huỷ bỏ nếu một lỗi xuất hiện hoặc giao dịch được huỷ bỏ một cách tường minh. Sử dụng Microsoft Transaction Server để quản lý các giao dịch trong một trang ASP. điều quan trọng cần phải tìm hiểu là Microsoft Transaction Server. Các giao dịch ADO Các giao dịch ASP áp dụng cho toàn bộ một trang ASP. Nếu muốn xử lý chỉ những thao tác cơ sở dữ liệu trong một giao dịch thì ta có thể sử dụng các giao dịch ADO. Đối tượng Connection của ADO có ba phương thức – BeginTrans(), CommitTrans() và RollbackTrans() cho phép ta quản lý các giao dịch. Để bắt đầu một giao dịch mới gọi phương thức CommitTrans(). Cuối cùng, để huỷ bỏ một giao dịch và bắt đầu lại ta gọi phương thức rollbackTrans(). Script giao dịch ADO sử dụng những phương thức này khi cập nhật hai bảng trong cơ sở dữ liệu. Giao dịch ADO <% Set Con = Server.Create

Các file đính kèm theo tài liệu này:

  • docThuongmaidientu-54.doc
Tài liệu liên quan