Nghiên cứu lập trình với ngôn ngữ Perl. Khái niệm về biến, mảng . . . trong Perl được đưa ra xem xét ở đâ
Trang 1Lời cảm ơn
Lời đầu tiên, tôi xin bày tỏ lòng biết ơn các thầy, các cô Khoacông nghệ thông tin cùng toàn thể các thầy giáo, cô giáo trờng Đạihọc kỹ thuật, những ngời đã trao cho tôi nhiều kiến thức quý báu đểtôi có đợc ngày hôm nay
Xin trân thành cảm ơn thầy Đặng Bá L, thầy Nguyễn Tấn Khôinhững ngời đã trực tiếp hớng dẫn tôi trong suốt thời gian làm đồ án
Đặc biệt xin chân thành cảm ơn các thầy Võ Ngọc Anh, thầy NguyễnTấn Khôi, những ngời đã cho tôi những ý tởng mang tính chiến lợc đểtôi có thể hoàn thành đồ án này
Xin đợc gửi lời cảm ơn bạn bè, những ngời đã giúp đỡ, động viêntôi về tinh thần cũng nh vật chất trong xuốt thời gian qua
Cuối cùng, tôi xin bày tỏ lòng biết ơn gia đình, cha mẹ, anh chị,những ngời đã nuôi nấng, dạy dỗ tôi để tôi có đợc nh ngày hôm nay
Đà Nẵng Ngày 20 Tháng 6 năm 2000 Sinh viên thực hiện
Nguyễn Hoàng Việt
Tóm tắt nội dung đồ án
Đồ án này đợc chia làm 6 chơng:
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Trang 2- Chơng I: Tổng quan về đề tài, giới thiệu các vấn đề sẽ đa ra nghiên cứu trong đềtài Giới thiệu hệ điều hành Linux, công nghệ CGI ứng dung trên Linux, và ngôn ngữPerl cùng với bài toán sẽ đa ra giải quyết.
- Chơng II: Công nghệ CGI: gồm khái niệm, các thành phần của CGI và cách thứclập trình với CGI trong môi trờng Linux Trong chơng này có đa ra một số ví dụ về cácCGI scrips đợc viết bằng ngôn ngữ Perl và C để làm nổi bật tính không phụ thuộc ngônngữ lập trình của CGI
- Chơng III: Nghiên cứu lập trình với ngôn ngữ Perl Khái niệm về biến, mảng trong Perl đợc đa ra xem xét ở đây Đặc biệt là mảng liên hợp (assosiative array - hash )
và một số hàm chuển của Perl trong thao tác với mảng liên hợp
- Chơng IV: Phân tích bài toán quản lý sinh viên tại trờng Đậi học kỹ thuật Đà nẵng.Khảo sát các thành phần của hệ thống, các nguyên tắc quản lý, các đối tợng khai thác
hệ thống Mô hình hoá và giải quyết bài toán bằng ngôn ngữ Perl theo công nghệ CGItrên môi trờng Linux
- Chơng V: Kết quả thực hiện chơng trình
- Chơng VI: Kết luận, nêu những kết quả đạt đợc về lý thuyết, thực tiễn, những hạnchế, tính khả thi và hớng phát triển của đề tài
Trang 3mục lục
mục lục 3
Tổng quan về đề tài 5
I Tình hình sử dụng Linux 5
II CGI và Linux 6
III Ngôn ngữ Perl 6
IV Mục tiêu đồ án 6
CGI 7
I Tổng quan về CGI 7
I.1 CGI là gì ? 9
I.1.1 Khái niệm Gateway 9
I.1.2 Common Gateway Interface 10
I.2 Tại sao dùng CGI ? 11
II Lập trình với CGI 12
II.1 Lựa chọn ngôn ngữ 12
II.1.1 C/C++(Unix, Linux, Windows, Macintosh) 12
II.1.2 Perl (Unix, Linux, Windows, Macintosh) 13
II.1.3 Visual Basic (chỉ dùng trên môi trờng Windows) 13
II.2 Những vấn đề cơ bản trong lập trình CGI 13
II.2.1 Chơng trình ví dụ 13
II.2.2 Outputting CGI 15
II.2.2 Sơ lợc về HTML Forms 17
II.2.2.1 Thẻ FORM 19
II.2.2.2 Trờng text và Password 19
II.2.2.3 Nút Reset và Submit 19
II.2.2.4 Tham chiếu một số tags 19
II.2.3 Input CGI 20
Tóm lại 27
III Cài đặt và chạy chơng trình CGI 28
III.1 Cấu hình Server để chạy CGI 28
III.2 Cài đặt CGI trên server UNIX 29
III.3 Chạy chơng trình CGI 30
Ngôn ngữ Perl 31
I Giới thiệu 31
II Biến trong Perl 32
II.1 Biến vô hớng(Scalar variables) 33
II.2 Khối lệnh và các cấu trúc điều khiển 33
II.3 Phạm vi của biến 35
II.4 Luật trích dẫn 36
III Mảng và mảng liên hợp 38
III.1 Mảng 38
III.2 Mảng liên hợp ( associative array - hashes ) 41
Phân tích và thiết kế hệ thống 43
I Đặt vấn đề 43
I.1 Dẫn nhập 43
I.2 Yêu cầu 43
I.3 Các đối tợng khai thác hệ thống 44
I.3.1 Phòng đào tạo và công tác chính trị 44
I.3.2 Các vị giáo vụ khoa 44
I.3.3 Sinh viên, gia đình sinh viên ( ngời dùng trên mạng) 44
I.3.4 Những thuận lợi và khó khăn 44
a) Thuận lợi 44
b) Khó khăn 44
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Trang 4II Phân tích hệ thống 45
II.1 Khảo sát hệ thống 45
II.2 Sơ đồ dòng dữ liệu 46
II.3 Từ điển dữ liệu 49
II.4 Mô hình thực thể kết hợp 51
II.5 Mô hình nhị nguyên 52
III Xây dựng chơng trình 53
III.1 Chọn công cụ 53
III.2 Xây dựng mô hình Logic dữ liệu 54
III.3 Các thủ tục xử lý trong chơng trình 54
1 Module nhập danh sách lớp mới ( nhapds.cgi ) 54
2 Module tìm kiếm sinh viên ( timkiem.cgi ) 54
3 Module xem danh sách ( xem_danh_sach1.cgi ) 55
4 Module xem điểm ( xem_diem.cgi ) 55
kết quả thực hiện chơng trình 56
I Xây dựng môi trờng hệ thống 56
II Chạy chơng trình 56
Kết luận 60
I Những kết quả đạt đợc 60
I.1 Lý thuyết 60
I.2 Thực tiễn 60
II Tính khả thi 60
III Hạn chế 61
IV Hớng phát triển 61
Tài liệu tham khảo 62
Phụ lục 63
I Module nhapds.cgi 63
II Module xemdanhsach.cgi 65
III Module xemdiem.cgi 67
IV Module timkiem.cgi 69
Chơng I
Tổng quan về đề tài
I Tình hình sử dụng Linux
Linux đợc xem là một hiện tợng trong lĩnh vực hệ điều hành vài năm gần đây Báo chí, các diễn đàn, các phòng nói chuyên trực tuyến trên mạng, chơng trình "Tìm kiếm
t-ơng lai" của VTV3 Đài truyền hình Việt nam Thậm chí cả cht-ơng trình "Khoa học vui" cho trẻ em của VTV1 cũng đều đã có bài đăng tải về Linux
Vậy thì Linux là gì vậy ? Linux là một hệ điều hành giống nh bao hệ điều hành khác Nhng nó có nhiều tính năng mạnh mà không có ở một số hệ khác Chúng ta, chắc
ai cũng đã biết về một hệ điều hành tiền bối - UNIX Khác với các hệ điều hành của Microsoft, UNIX không rễ sử dụng với những ngời mới làm quen, không đợc thân thiện cho lắm, nhng bù vào đó Unix là một hệ điều hành đa nhiệm thực sự, đợc viết ra để hỗ trợ cho nhiều ngời sử dụng, nó tận dụng đợc tối đa nguồn lực khần cứng của máy tính chính vì vậy Unix có thể chạy tốt trên một số máy tính với cấu hình rất hạn chế Khả năng kết nối và điều hành mạng rất tốt, có thể đóng vai trò phục vụ trong hầu hết các
Trang 5ứng dụng Internet hiện nay Unix là một môi trờng lập trình lý tởng cho các nhà lậptrình viên chuyên nghiệp
Linux mang dòng máu của Unix, đợc phát triển bởi Sun MicroSystem Linux có đầy
đủ các tính năng vốn có của Unix và Linux đã thân thiện và dễ sử dụng hơn thông qua
hệ thống X-Window ở các nớc Châu Âu, đặc biệt là Pháp, Linux đợc đặc biệt yêu mến
và sử dụng rộng rãi Điều này cũng dễ giải thích do những tính năng tiến bộ của Linux:tính bảo mật cao, hệ thống kết nối mở, tích hợp nhiều công nghệ mới, nhiều ngôn ngữlập trình đợc bao hàm trong hệ thống
ở nớc ta, Linux đợc biết đến trong vòng khoảng 3 năm trở lại đây Chúng ta đã biết,máy tính đợc sử dụng thực sự rộng rãi ở nớc ta trong khoảng 10 năm nay, thời điểm màcác hệ điều hành của Microsoft đang thống trị - DOS, Windows 3.x Theo truyền thốngthì việc thay đổi một hệ điều hành là chuyện tơng đối khó ở nớc ta, phải đào tạo lại lớpngời sử dụng, phải thay đổi hệ thống phần mềm Hơn nữa Linux không phải dễ sửdụng cũng nh quảnt rị hệ thống Chính vì vậy, hiện nay ở nớc ta Linux chỉ đợc sử dụng
ở trong các môi trờng xí nghiệp mang tính chuyên môn cao, còn với ngời dùng máy
tính PC thì Linux mới chỉ mang tính khái niệm, "có biết nhng cha dùng".
II CGI và Linux
Sự phát triển của Internet đã giúp chúng ta gần nhau hơn trong mọi lĩnh vực, bất kểkhoảng cách và ngày đêm Nhng những Web server trên Internet đa số chỉ phục vụ cácdịch vụ mang tính truyền thông ở mức vĩ mô Các ứng dụng để khai thác cơ sở dữ liệu
để phục vụ trong các bài toán quản lý, quảng cáo, diễn đàn, nói chuyện trực tuyến trênmạng, các dịch vụ tìm kiếm nhanh đều đòi hỏi ngời dùng phải viết chơng trình.CGI (Common Gateway Interface) là một công nghệ giúp mở rộng khả năng củaWeb server để giải quyết các bài toán mang tính đặc thù và có thể vận hành trên mạng.Việc chọn ngôn ngữ cho lập trình CGI ít bị hạn chế do tính mềm dẻo của nó và chỉ cầntuân thủ vài nguyên tắc, chúng ta có thể viết một chơng trình CGI
Chúng ta có thể sử dụng công nghệ CGI để áp dụng cho lập trình trong mọi hệ điềuhành, miễn là hệ điều hành đó có thể kết nối mạng và có một phần mềm Web serverchạy trên đó Linux là một hệ điều hành mạng, có thể đóng vai trò phục vụ trong nhiềudịch vụ đang có hiện nay (WWW, FTP, Telnet, Wais .) Hơn nữa, Linux cung cấpmột Web server nổi tiếng mang tên Apache Server, phiên bản mới nhất 1.1.5 Webserver này hỗ trợ lập trình CGI rất mạnh
III Ngôn ngữ Perl
Perl (Practical Extraction and Reporting Language) có nhiều u điểm của một ngônngữ lập trình có cấu trúc giống nh C , Pascal Song trên thực tế Perl là một ngôn ngữdiễn dịch (Interpreted language) có nhiều u điểm trong lập trình CGI Thao tác xử lýchuỗi mạnh, có khả năng làm việc tốt với các biến môi trờng, dễ lập trình, dễ gỡ rối Hơn nữa Perl đợc tích hợp bên trong Linux
IV Mục tiêu đồ án
Cùng với sự gợi ý của giáo viên hớng dẫn và nhận thức của bản thân về khả năng vàtầm quan trọng của các lĩnh vực đã trình bày ở trên, tôi quyết định chọn h ớng nghiêncứu cho đồ án tốt nghiệp nh sau:
- Hiện thực và cài đặt hệ điều hành Linux
- Nghiên cứu công nghệ CGI
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Trang 6- Lập trình CGI với ngôn ngữ Perl
Cuối cùng để minh họa cho kết quả nghiên cứu, tôi chọn và giải quyết bài toán:
"Quản lý điểm sinh viên trờng Đại học kỹ thuật Đà Nẵng" với ý tởng nh sau:
- Giúp phòng đào tạo quản lý điểm sinh viên của trờng Đại học kỹ thuật
- Giúp cha mẹ sinh viên có thể biết đợc những thông tin về con mình kỳ nào, họcmôn gì, mấy điểm thông qua mạng Internet Góp phần gắn kết mối liên lạc giữa gia
dễ dàng tìm kiếm Chắc hẳn trong chúng ta ai cũng đã biết về Web và bạn cũng nh tôi
có thể đã hơn một lần truy cập vào các site của ngời khác nên giờ đây chúng ta có thểnhận ra rằng những từ viết tắt thoạt nhìn có vẻ đáng ngại nh “HTTP”, “HTML” đơngiản chỉ là những mẫu tự viết tắt của Web hoặc là một phơng thức truyền thông nào đótrên Web
Web đã đợc thừa nhận là phơng tiện thông tin lý tởng qua sự phổ biến rộng rãi trêntoàn cầu và sự không ngừng lớn mạnh của nó Mặc dù đã có một số ý kiến thắc mắc vềnhững tiện ích và những thuộc tính của Web và cũng có một số ý kiến cho rằng việcWeb lớn mạnh và trở nên phổ biến nh vậy chủ yếu nhờ vào sự phát triển của các phơng
tiện "siêu truyền thông" (media hyper), nhng không thể nghi ngờ gì nữa-Web rõ ràng là
một phơng tiện quan trọng trong việc truyền thông tin các loại Không chỉ các loại dịch
vụ thông tin “ tức thời” ( nh tin tức, tin thời tiết, thể thao ) các tài liệu tham khảo cósẵn đợc điện tử hoá mà cả một khối lợng khổng lồ các loại dữ liệu khác cũng tồn tạitrong Web Web thực sự đã trở thành một công cụ hữu dụng về thông tin đại chúng chohàng vạn thậm chí hàng triệu ngời trên khắp thế giới
Tại sao Web lại trở nên duy nhất và đáng giá nh vậy ? Trớc hết, Web là một giaodiện siêu truyền thông cho các loại dữ liệu Hãy xét việc lu trữ thông tin trên một ổ đĩacứng trong một máy tính PC Rõ ràng là dữ liệu đợc lu trữ và truyền đạt một cách tuyếntính giống nh một hệ thống hồ sơ vậy Ví dụ nh chúng ta có một hệ thống các th mục,trong mỗi th mục chứa các tài liệu hoặc các th mục con (Xem hình 1.1) Web sử dụngmột dạng khác biệt để truyền thông tin - đợc gọi là “siêu truyền thông” Một giao diện
siêu văn bản bao gồm một tài liệu và các links Links là các từ mà chúng ta có thể kích
chuột vào để xem các thông tin khác (Xem hình 1.2) Web mở rộng khái niệm “siêuvăn bản” Nó bao gồm các loại thông tin khác nữa nh các bảng biểu, âm thanh, hình
ảnh, video
Trang 7Hầu hết mọi ngời đều cảm thấy tiện lợi khi sử dụng kiểu truyền và phân bổ thôngtin dễ dàng và duy nhất này Từ các vị giáo s ở các trờng đại học muốn truyền dữ liệu
đến các đồng nghiệp cho đến các thơng gia – những ngời muốn cung cấp thông tin vềcông ty của mình cho những ai muốn biết Tuy nhiên, trong nhiều năm qua mọi ngời đãnhận ra rằng việc nhận thông tin cũng quan trọng không kém việc truyền thông tinMặc dù Web cung cấp cho chúng ta một giao diện siêu truyền thông duy nhất, nhngngoài Web ra còn có nhiều phơng thức khác mà hiệu quả cũng không kém Đó là cácdịch vụ mạng nh File Transfer Protocol (FTP) và Gopher – xuất hiện khá lâu trớcWeb Th điện tử là phơng tiện truyền thông đầu tiên trong việc liên lạc và trao đổi thôngtin trên mạng Internet và hầu hết các mạng khác từ khi chúng xuất hiện Tại sao Webtrở nên phổ biến nh vậy ? Rõ ràng là tính năng siêu truyền thông của Web đã tạo nên sựthành công lớn lao ấy, nhng để làm cho Web trở nên có hiệu quả ta phải chú ý đến tínhnăng tơng tác của nó
Nếu không có khả năng nhận thông tin đầu vào từ ngời sử dụng cũng nh khả năngcung cấp thông tin thì Web chỉ là một phơng tiện truyền thông hoàn toàn tĩnh Ngời sửdụng có thể tự do truy cập dữ liệu mà không phải phụ thuộc vào cấu trúc " cứng nhắc"
Trang 8browses Khi Web browse yêu cầu truy cập một địa chỉ Web đã cho sẵn, việc đầu tiên
là Web browse liên lạc với máy tính mang địa chỉ kia trên Internet, rồi gửi yêu cầu đếnphần mềm chạy trong máy chủ Phần mền này sẽ chạy tức thì và tơng ứng với mỗi yêucầu nó sẽ gởi những trả lời thích hợp
Mặc dù các Web Server có thể truyền và nhận dữ liệu nhng chức năng của nó cũnghạn chế Server thờng không hiểu các thông tin đầu vào bổ sung và nó thờng bỏ qua cácthông tin này, trừ khi các nhà thiết kế ra nó đã cài đặt sẵn chơng trình để xử lý đối vớicác thông tin này Để Server có thể giải quyết đợc nhiều thông tin cao cấp hơn là việcchỉ đơn thuần nhận và gửi các file đến các browse, chúng ta phải biết cách mở rộngchức năng của Web Server Ví dụ, Web server không thể tìm ra cơ sở dữ liệu trên cơ sởmột từ khoá mà ngời sử dụng nhập vào, nó chỉ có thể có đợc khả năng đó khi chúng talập trình cho nó
I.1 CGI là gì ?
I.1.1 Khái niệm Gateway
Các Web browser có thể truy cập trực tiếp đợc rất nhiều kiểu thông tin và dịc vụthông tin nhng không có nghĩa là tất cả Chẳng hạn nh Archie và Finger là hai dịch vụkhông đợc hỗ trự trên môi trờng Web, hơn thế nữa không phải tất cả các nguồn thôngtin đều tích hợp với Web, ví dụ nh các tài liệu động hoặc các cơ sở dữ liệu Để giảiquyết nhợc điểm này, hầu hết các Web server đều cung cấp phơng thức để tạo ra cáctrang Web động theo yêu cầu của ngời sử dụng thông qua các cổng giao tiếp (gateway).Các gateway giải quyết các vấn đề này bằng cách cung cấp một cơ cấu mở cho Webserver Một gateway có thể truy nhập đợc các nguồn thông tin không theo dạng chuẩncủa Web (HTML), hoặc là các thông tin nằm bên ngoài Web server Trên thực tế mộtgateway đơn giản chỉ là một kịch bản (Script) đợc ngời lập trình tạo ra, thực chất là mộtchơng trình đợc gọi thực hiện bởi Web server khi cần thiết Thông thờng chúng đợc lutrữ tại một th mục đặc biệt và vị trí của th mục này đợc Web server biết đến và quản lý.Các gateway này phải có thuộc tính khả thi, và tuỳ theo từng hệ điều hành mà thuộctính này có thể khác nhau Chẳng hạn, dới Windows thì chúng phải đợc biết đến nh làcác file “ COM”, “ EXE” hay “ BAT”; hoặc trong UNIX hay LINUX thì cờ khả thi
đối với file đó phải đợc thiết lập
Mỗi khi Web server gọi một URL mà trỏ đến một kịch bản gateway, thì kịch bản đólập tức đợc thực hiện Sau đó, Web server sẽ đợi kịch bản kết thúc và lấy các kết quả trả
về cho ngời sử dụng Các gateway có thể lấy các thông tin đầu vào từ ngời sử dụng vàtrả về các tài liệu dới dạng các form HTML, các URL khác hay là các dạng dữ liệukhác
I.1.2 Common Gateway Interface
CGI là thuật ngữ viết tắt của cụm từ Common Gateway Interface, là một giao diệnchuẩn dùng để trao đổi thông tin giữa các gateway và Web server Các ch ơng trình CGIcho phép quản trị hệ thống tạo ra nhiều ứng dụng tinh vi nhằm chuyên môn hoá và tự
động hoá rất nhiều tác vụ cho ngời dùng: những tiện ích cho phép tìm kiếm CSDL vềthông tin đặc biệt, những tiện ích tìm kiếm theo chỉ mục trên mạng mà chắc chúng ta aicũng đã có lần đợc thởng thức
CGI là một phần của Web Server, có thể giao tiếp với những chơng trình khác chạytrên Server Với CGI, Web Server có thể gọi một chơng trình, trong khi dữ liệu của ngời
sử dụng gởi đến chơng trình Chơng trình sau đó xử lý dữ liệu và Server gởi trả lời củachơng trình về cho Web Browser
Trang 9CGI chỉ là chơng trình với những kiểu đầu vào và vài nguyên tắc nghiêm ngặt trên
đầu ra chơng trình Mọi thứ ở giữa chỉ là chơng trình Dĩ nhiên, có những kỹ thuật dànhriêng đặc biệt cho CGI
Đến đây chúng ta có thể trả lời cho câu hỏi đợc đặt ra ở đầu mục này “CGI là gì ? ”.
CGI là một giao diện giữa các kịch bản do ngời lập trình tạo ra và Web server, giúpchúng ta mở rộng khả năng của Server Về mặt lý thuyết CGI giúp chúng ta mở rộngkhả năng của Server trong việc nhận và phân tích thông tin đầu vào từ phía ngời sử dụng
và trên cơ sở các thông tin đầu vào đó sử lý và kết xuất một dầu ra thích hợp Chúng tahãy xem hình vẽ minh hoạ sau :
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Server machine
Client
machine
1 Browser gửi Form yêu cầu, cùng các thông tin về ch ơng trình CGI
2 Server gọi ch ơng trình CGI theo yêu cầu của Browser
3 Kết quả từ ch ơng trình CGI trả về cho Server
4 Server đem kết quả nhận đ ợc từ CGI trả lời cho Browser
Trang 10I.2 Tại sao dùng CGI ?
Thông thờng, nếu chúng ta muốn mở rộng khả năng của Web server, chính chúng taphải sửa đổi Web server đó Đây thực là cách giải quyết bất lợi vì nó đòi hỏi một kiếnthức chuyên môn cao về lập trình trên mạng thông qua Internet và hiểu biết cặn kẽ vềgiao thức World Wide Web Điều này còn đòi hỏi phải sửa và biên dịch lại mã nguồncủa máy chủ hoặc viết một Custom Server cho mỗi nhiệm vụ Ví dụ, chúng ta muốn mởrộng khả năng của Server để nó hoạt động giống nh một Email gateway để nhận mail từmột Browser và gửi nó đến một Browser khác Chúng ta cần cài mã vào Server để nó cóthể nhận và phân tích thông tin đầu vào từ Browser và gửi nó đến Browser khác thôngqua môi trờng mạng
Với nhiệm vụ nh vậy, trớc tiên phải truy cập đợc và mã nguồn của Server, điều màkhông phải lúc nào cũng có thể làm đợc Thứ hai, điều này thì khó với những ngời bìnhthờng, đó là phải có kiến thức chuyên môn giỏi Thứ ba, đó là những cái mà chúng ta đãcài đặt để mở rộng khả năng của Server chỉ là việc với đợc với Server đó Nếu chúng tamuốn chuyển Web server sang hoạt động ở một nền hệ điều hành khác, thì chúng taphải bắt đầu lại từ đầu và thời gian chuyển đổi mã nguồn để chạy trong một nền hệ điềuhành khác chắc cũng không phải là ít
Khả năng to lớn của CGI là tăng thêm sức mạnh cho Web server CGI mang lại biệnpháp giải quyết đơn giản và gọn ghẽ cho các vấn đề trên Giao thức CGI đ a ra một quichuẩn cho các chơng trình khi kết nối với Web Server Chúng ta có thể lập trình với bất
cứ một ngôn ngữ gì trên một máy tính nào để có thể thực hiện trao đổi thông tin vớiWeb server mà không cần biết nhiều lắm về kiến thức chuyên môn Chơng trình màchúng ta viết ra sẽ hoạt đông đợc với bất kỳ Web server nào có thể hiểu đợc giao thứcCGI Việc truyền thông với CGI đợc thực hiện trên cơ sở các thông tin đầu vào và đầu
ra qui chuẩn, có nghĩa là nếu chúng ta biết viết và đọc dữ liệu bằng các ngôn ngữ lậptrình bình thờng, thì chúng ta có thể viết đợc một ứng dụng cho Web server dựa vàocông nghệ CGI Ngoài việc phân tích thông tin đầu vào và đầu ra việc lập trình các ứngdụng CGI đều giống nh việc lập trình các ứng dụng khác Ví dụ, nếu chúng ta muốnviết một chơng trình đơn giản để hiện dòng chữ “Chào bạn” ở màn hình của Browser,chúng ta chỉ cần dùng một lệnh print của ngôn ngữ của chúng ta đang sử dụng và mộtvài định dạng đợc định nghĩa cho chơng trình CGI để in các thông tin cho thích hợp
II Lập trình với CGI
II.1 Lựa chọn ngôn ngữ
CGI là giao diện chung nên ta có thể sử dụng bất kỳ ngôn ngữ nào cho lập trìnhCGI Một vấn đề rất quan trong mà nhiều ngời đặt ra đó là “ dùng ngôn ngữ nào cho lậptrình CGI thì phù hợp nhất ? ” Đây là một câu hỏi không phải dế trả lời, tất nhiên tuỳtheo mục đích của bài toán có một số ngôn ngữ phù hợp hơn dành cho lập trình CGI.Trớc khi chọn ngôn ngữ lập trình, cần xem kỹ những đặc tính sau:
Có thể hiển thị thông tin ở đầu ra chuẩn (STDOUT)
Nhận thông tin ở đầu vào chuẩn (STDIN)
Khả năng hiểu và cập nhật biến môi trờng
Hầu hết tất cả các ngôn ngữ lập trình và các ngôn ngữ Script ngày nay đều đáp ứng
đợc 3 yêu cầu trên Một vài ngôn ngữ phổ biến thích hợp cho lập trình CGI gồm :AppleScript, C/C++, C shell, Perl, tcl, Và Visual Basic
II.1.1 C/C++(Unix, Linux, Windows, Macintosh)
Trang 11C/C++ là ngôn ngữ thông dụng với các nhà lập trình, một số ngời sử dụng chúngcho lập trình CGI Những ngôn ngữ này đòi hỏi những ngời lập trình có chút ít kinhnghiệm C và C++ ràng buộc những qui tắc nghiêm ngặt về khai báo biến, bộ nhớ, Thêm vào đó, những ngôn ngữ này thiếu tính mở rộng CSDL và những khả năng phùhợp mô hình vốn có, mặc dù những hàm, môdule có thể đợc viết để thực hiện nhữngchức năng này.
Tuy nhiên, C và C++ có thuận lợi lớn là có thể biên dịch ứng dụng CGI tạo tệp thựcthi nhị phân
II.1.2 Perl (Unix, Linux, Windows, Macintosh)
Perl là công cụ thông dụng nhất dùng để lập trình CGI, gồm nhiều đặc điểm mạnh,
và dễ dàng cho những ngời mới bắt đầu lập trình Perl có một số u điểm sau :
Tính linh hoạt cao.
Những phép toán thao tác chuỗi mạnh, nh những chức năng giao tiếp với dữliệu nhị phân
Cấu trúc đơn giản và ngắn gọn
II.1.3 Visual Basic (chỉ dùng trên môi trờng Windows)
Visual Basic dùng trong Windows cũng nh những gì mà AppleScript dùng cho hệ
điều hành Macintosh kể cả lập trình CGI cũng tơng tự Với Visual Basic có thể giao tiếpnhững ứng dụng Windows khác nh những CSDL và bảng tính Vì thế Visual Basic thực
sự là công cụ mạnh cho việc phát triển ứng dụng CGI trên PC, và dễ tiếp cận Tuynhiên, Visual Basic còn thiếu những phép toán thao tác chuỗi
II.2 Những vấn đề cơ bản trong lập trình CGI
Tuy có nhiều vấn đề kỹ thuật bên trong, nhng chúng ta có thể tinh giảm việc lậptrình CGI thành 2 bớc nh sau: Nhận thông tin từ Web browser và hồi đáp thông tin trởlại Thông thờng, browser đợc giới thiệu một Form để nhập dữ liệu Khi nhập xong dữliệu vào Form, browser gửi lên Server và thông tin sẽ đợc chuyển đến chơng trình CGI.CGI sau đó sẽ phải chuyển đổi thông tin này sang dạng nó có thể hiểu đ ợc (giải mãthông tin), xử lý nó và sau đó gửi kết quả lại cho browser – có thể kết quả chỉ là mộtlời chào hay cũng có thể đó là một kết cục của một cuộc tìm kiếm cơ sở dữ liệu nào đó
II.2.1 Chơng trình ví dụ
Chúng ta sẽ bắt đầu với vấn đề lập trình truyền thống Chúng ta muốn viết một
ch-ơng trình hiện dòng chữ “Hello World” lên màn hình của Browser Trớc khi viết chch-ơngtrình này, chúng ta cần phải hiểu thông tin gì mà Browser muốn nhận đợc từ CGI Cũngcần biết thêm về cách để làm thế nào để chạy chơng trình này và phơng thức hoạt độngcủa nó CGI không phụ thuộc vào ngôn ngữ, vì vậy chúng ta có thể thực hiện chơngtrình này bằng bất cứ ngôn ngữ nào mà chúng ta muốn Chúng ta hãy xem chơng trình
“Hello World” viết bằng Perl:
#!/usr/bin/perl
# hello.cgi - My first CGI program
print "Content-Type: text/html\n\n";
print "<html> <head>\n";
print "<title>Hello, world!</title>";
print "</head>\n";
print "<body>\n";
print "<h1>Hello, world!</h1>\n";
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Trang 12print "</body> </html>\n";
Lu trữ chơng trình với tên là hello.cgi và đặt nó vào nơi thích hợp (chúng ta sẽ bàn
về cái gọi là “nơi thích hợp” này sau) Đối với hầu hết mọi ngời th mục thích hợp này
đ-ợc mang tên cgi-bin Bây giờ, gọi thực hiện chơng trình này từ Web server Điều đó cónghĩa là mở một URL
http://hostname/directoryname/hello.cgi
hosrtname: Là tên của Web server, directoryname là tên th mục mà chúng ta đã đặt
hello.cgi (có thể là cgi-bin) ở Web browser sẽ xuất hiện nh sau:
Trớc tiên chúng ta đang sử dụng một lệnh print đơn giản Các ch ơng trình CGIkhông cần bất cứ một chơng trình quản lý file hay một mô tả đặc biệt nào cho đầu ra
Để gửi dữ liệu đến Browser đơn giản ta chỉ việc dùng lệnh print ra stdout Thứ hai,chúng ta hãy chú ý đến nội dung của câu lệnh print đầu tiên (Content-Type: text/html) cáctham số trong câu lệnh này không hiển thị ở màn hình của Web Browser Chúng ta cóthể gửi bất cứ thông tin gì đến Browser ( có thể là một trang HTML, hay là hình ảnhhoặc âm thanh), nhng trớc tiên chúng ta cần thông báo cho Browser biết thông tin gì sắp
đợc gửi đến Dòng lệnh này thông báo cho Browser biết thông tin mà Browser sắp nhận
là một trang HTML Thứ ba, chơng trình của chúng ta đợc đặt tên là hello.cgi Khôngcần thiết phải có phần mở rộng là CGI Mặc dù mã nguồn của nhiều ngôn ngữ có cácphần mở rộng khác nhau, nhng phần mở rộng là CGI không phải là cách biểu thị ngônngữ mà là cách để Server xác định, nhận diện file là một file thực hiện đợc chứ khôngphải là file hình ảnh hay âm thanh, file HTML hay text file
Tóm lại hello.cgi có hai vấn đề chính
* Thông báo cho browser biết loại thông tin sẽ nhận (Content-Type: text/html)
* Thông báo cho browser thông tin để hiên thị (Hello, world!)
Để chứng minh sự độc lập của các chơng trình CGI với ngôn ngữ Chúng ta hãy viếtchơng trình hello.cgi bằng ngôn ngữ C
/* hello.cgi.c - Hello, world CGI */
Trang 13printf("</body> </html>\n");
}
Chó ý r»ng phiªn b¶n hello.cgi viÕt b»ng Perl chung ta ®· sö dông lÖnh
print "Content-Type: text/html\n\n";
Trong khi phiªn b¶n hello.cgi viÕt b»ng C dïng
Qua hai vÝ dô lỊp tr×nh ®¬n gi¶n trªn chóng ta kÕt luỊn vÒ viÖc sö dông ng«n ng÷nµo ®Ó lỊp tr×nh kh«ng ¶nh hịng g× ®Õn Web server vµ Browser MƯc dï mìi ng«n ng÷
cê u vµ khuyÕt ®iÓm riªng trong mĩt vÍn ®Ò nµo ®ê
II.2.2 Outputting CGI
B©y gií chóng ta chóng ta ®· hiÓu rđ h¬n vÒ viÖc truyÒn th«ng tin cho Web browser
Nh chung ta ®· thÍy trong vÝ dô “Hello World”, Web browser nhỊn ®îc hai bĩ d÷ liÖu(Xem h×nh vÏ): 1 header chøa th«ng tin vÒ kiÓu cña th«ng tin ®Ò hiÓn thÞ ( ch¼ng h¹n
nh dßng Content-Type:) vµ th«ng tin thùc sù ( nh÷ng th«ng tin ®îc hiÓn thÞ ị Webbrowser) Hai khỉi th«ng tin nµy ®îc ph©n c¸ch b»ng mĩt dßng trỉng
Header ®îc gôi lµ HTTP header Nê cung cÍp th«ng tin quan trông vÒ lo¹i th«ng tin
mµ Browser s¾p söa nhỊn Cê vµi kiÓu HTTP header kh¸c nhau vµ lo¹i phư biÕn nhÍt lµlo¹i mµ chóng ta ®· sö dông trªn ®©y, header Content-Type
B¶ng liÖt kª c¸c HTTP header cê thÓ sö dông
Content-length Chiều dài của dòng ra Đơn giản là dữ liệu nhị phân
Content-type Kiểu nội dung MIME của dòng ra
Expires Ngày và thời gian khi tài liệu không phù hợp và sẽ
được nạp lại bởi trình duyệt Location Chuyển hướng Server
Pragma Trả tài liệu dấu
Status Trạng thái của yêu cầu
Refresh Client nạp lại tài liệu đã được Refresh
Set-Cookie Client lưu trữ tài liệu đặc biệt, hữu ích trong việc giữ
dữ liệu giữa các yêu cầu NguyÔn Hoµng ViÖt Khoa C«ng nghÖ th«ng tin-§iÖn tö viÔn th«ng
Trang 14Theo sau phần header và dòng trống, chúng ta có thể in những dữ liệu muốn hiển
thị Nếu muốn truyền một trang HTML hãy in các thẻ HTML và dữ liệu ra stdout sau
phần header Có thể gửi hình ảnh, âm thanh, hay các file nhị phân cũng đơn giản bằng
cách in nội dung của chúng ra stdout Sau đây đề cập đến hai header quan trọng nhất.
Tiêu đề Content-Type: header này mô tả kiểu dữ liệu mà chơng trình CGI trả về.
Định dạng thích hợp cho header này là:
Content-Type: subtype/type
Phần subtype/type là một kiểu MIME phù hợp (Multipurpose Internet Mail
Extensions) Dạng MIME phổ biến nhất là kiểu HTML :text/html Bảng dới đây liệt kê
các kiểu MIME phổ biến
Text/html HyperText Markup Language (HTML)
Text/plain Plain text files
Image/gif GIF graphics files
Image/jpeg JPEG compressed graphics files
Audio/basic Sun *.au audio files
Audio/x-wav Windows *.wav files
Chơng trình CGI có thể trả về hầu nh tất cả các loại tài liệu ảo tơng ứng với nhữngloại mà browser có thể quản lý Nó có thể trả về văn bản bình thờng, một HTML file,hình ảnh, âm thanh, PDF file đó chính là lý do mà trong thông tin mà browser gửi
đến server có kèm theo một danh sách "accept type " mà nó có thể quản lý Server l u trữcác thông tin này trong biến môi trờng HTTP_ACCEPT và chơng trình CGI có thể kiểmtra biến môi trờng này để có thể trả về những định dạng file mà browser có thể chấpnhận
Khi trả kết quả về cho browser, chơng trình CGI cần đến tiêu đề Content-Type để
báo cho browser loại dc liêu gì mà nó gửi và để cho browser định dạng và hiển thị dữliệu theo đúng cách
Tiêu đề Content-length: header này chỉ ra kích thớc của dữ liệu đợc trả về Tiêu đề
này đợc áp dụng trong trờng hợp dữ liệu trả về là dữ liệu nhị phân Để hiểu rõ cách sửdụng header này chúng ta hãy xét ví dụ sau đây:
#!/usr/bin/perl
$gif_image=join("/", $ENV{'DOCUMENT_ROOT'}, "icons/tiger.gif");
if(open(IMAGE,"<",$gif_image)){
$no_bytes=(stat($gif_image))[7];
print "Content-Type: image/gif\n";
print "Content-length: $no_bytes\n\n";
print <IMAGE>
}else{
print "Content-Type: text/plain\n\n";
print "Sorry ! I cannot open the file $gif_image";
}
exit (0);
Trong ví dụ trên có hai vấn đề đáng quan tâm Thứ nhất, cần chú ý đến tiêu đềcontent-type là image/gif Điều này báo hiệu cho browser biết một hình ảnh GIF sắp đ-
Trang 15ợc gửi đến, do đó browser biết cách để hiển thị nó Thứ nhì, cần chú ý đến tiêu đềcontent-length Tiêu đề này báo cho server biết kích thớc của dữ liệu của chơng trìnhcần gửi Điều này ngăn ngừa đợc lỗi xảy ra trong khi server thao tác với các tệp nhịphân, bởi vì server sẽ đọc số bytes đợc chỉ định mà không cần biết đâu là ký tự kết thúc.Trong ví dụ này để có đợc content-length hợp lý (cỡ của file tiger.gif) chúng ta đã
sử dụng lệnh stat Lệnh này trả về một mảng gồm 13 thành phần bao gồm thông tin vềfile đợc đa ra trong tham số của lệnh Trong đó thành phần thứ 8 là kích thớc của file(chú ý chỉ số mảng trong Perl bắt đầy từ 0)
II.2.2 Sơ lợc về HTML Forms
Một trong những tính năng nổi bật nhất của CGI là xử lý các Forms Forms là mộtphần của HTML cho phép ngời sử dụng cung cấp thông tin Giao tiếp Forms tạo chotrình duyệt Web một quá trình tơng tác giữa ngời sử dụng và ngời cung cấp
Hình vẽ : Sự tơng tác giữa form và CGI
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Chấp nhận
USER
User yêu cầu form
User điền
T.tin form
Gởi form về cho Client User gởi
form
Gởi đến ứng dụng CGI
Gởi về cho Client
Xử lý dữ liệu
Hiển thị Gởi về cho Client
NETWORK
Application SerVer
Trang 16II.2.2.1 Thẻ FORM
Dòng bắt đầu của một form:
<Form ACTION=”http:/192.0.1.1/cgi-bin/program.cgi” METHOD=”Post”>
Thẻ Form khởi đầu một form Tài liệu có thể chứa nhiều forms, các forms không thểlồng vào nhau, form này không đợc phép đặt trong form kia
Hai thuộc tính trong thẻ <FORM> là ACTION và METHOD rất quan trọng Thuộctính ACTION xác định URL của chơng trình CGI xử lý dữ liệu Không hạn chế phải đặtchơng trình trên Server của bạn, có thể xác định URL trên một Host từ xa nếu chơngtrình cho phép làm điều đó
Thuộc tính METHOD xác định cách thức Server gởi thông tin từ form đến ch ơngtrình CGI POST gởi dữ liệu qua đầu vào chuẩn, trong khi GET gởi thông tin qua cácbiến môi trờng Nếu không có phơng thức nào xác lập, Server sẽ ngầm định là GET Cảhai phơng thức đều có những u điểm và nhợc điểm của nó
II.2.2.2 Trờng text và Password
Hầu hết các phần tử đợc thi hành sử dụng thẻ <INPUT> Thuộc tính TYPE của
<INPUT> xác định kiểu của đầu vào là gì Một số loại khác nhau: nh trờng text,password Sau đây là ví dụ của đầu và text:
Name: <Input Type=”text” Name=”User” Size=40><BR>
Password: <Input Type=”password” Name=”pass” Size=10><BR>
Trờng hợp này trờng text và trờng password đợc tạo ra nhờ sử dụng các đối số
“text”, “password”, trờng password cũng tơng tự nh trờng text nhng chỉ khác là các tự
đánh vào đợc hiển thị dới dạng dấu “*” Nếu bỏ qua thuộc tính TYPE, trờng text sẽ mặc
định
Thuộc tính NAME xác định tên của phần tử đầu vào Nó không hiển thị bởi trìnhduyệt, nhng đợc sử dụng để nhận dữ liệu khi chuyển tới chơng trình CGI Ví dụ, trờngvào có tên Name=”user”, nếu ai đó đánh “the” vào trờng đó, thì phần dữ liệu gởi đếntrình duyệt là: user=the
II.2.2.3 Nút Reset và Submit
Hai kiểu quan trọng của thẻ <INPUT> là Submit và Reset
<Input Type=”submit” Value=”Gởi dữ liệu” >
<Input Type=”reset” Value=”Xoá dữ liệu” >
Hầu hết các forms đều cung cấp hai nút “Submit” và “Reset” Nút “submit” gởi tất
cả thông tin từ form đến chơng trình CGI xác định bởi thuộc tính ACTION Không có
nút này, form sẽ không gởi đợc dữ liệu đến chơng trình CGI Nút “Reset” xoá tất cả
thông tin đánh vào của ngời sử dụng, ngời sử dụng có thể nhấn reset nếu muốn nhập lạidữ liệu
II.2.2.4 Tham chiếu một số tags
Trang 17Sau ®©y giíi thiÖu mĩt danh s¸ch ng¾n c¸c tags Form:
<FORM ACTION=”cgi-bin/pro.exe” METHOD=”Post”> Khịi ®Ìu Form
<Input TYPE=”text” NAME=”name” VALUE=”value” SIZE=size> Tríng text
<Input TYPE=”password” NAME=”name” VALUE=”value”
<Input TYPE=”hidden” NAME=”name” VALUE=”value” Tríng Ỉn
<Input TYPE=”Checkbox” NAME=”name” VALUE=”value” Hĩp kiÓm tta
<Input TYPE=”Radio” NAME=”name” VALUE=”value” Nót Radio
<Select NAME=”name” SIZE=1>
<Option selected >Mĩt
<Option selected >Hai
</Select>
<Input TYPE=”Submit” NAME=”name” VALUE=”value” Nót gịi
<Input TYPE=”Reset” NAME=”name” VALUE=”value” Nót xo¸
II.2.3 Input CGI
Trong vÝ dô “Hello World” chóng ta ®· xem xÐt ị phÌn tríc, ta ®· biÕt c¸ch viÕt mĩtch¬ng tr×nh CGI truyÒn th«ng tin tõ Server ®Õn Browser Trong thùc tÕ th× mĩt ch ¬ngtr×nh CGI chØ xuÍt d÷ liÖu kh«ng th«i th× kh«ng cê nhiÒu vÍn ®Ò l¾m ®Ó bµn Chóng ta
®ang bµn ®Õn mĩt kh¶ n¨ng quan trông cña CGI ®ê lµ: nhỊn th«ng tin tõ Web browser,
®Ưc tÝnh nµy t¹o nªn cho Web kh¶ n¨ng t¬ng t¸c mĩt c¸ch tù nhiªn
Mĩt ch¬ng tr×nh CGI khi ®îc gôi thùc hiÖn nê sÏ nhỊn ®îc hai lo¹i th«ng tin sau:
- Thø nhÍt, c¸c lo¹i th«ng tin kh¸c nhau vÒ browser (browser type, th«ng tin g×browser cê thÓ hiÓn thÞ ?, tªn m¸y tÝnh ị xa, v.v ), th«ng tin vÒ Server ( tªn vµ phiªnb¶n phÌn mÒm Server ®ang ch¹y, cưng, v.v ) vµ vÒ b¶n th©n ch¬ng tr×nh CGI (tªn ch-
¬ng tr×nh vµ ®íng dĨn) Server cung cÍp cho CGI tÍt c¶ c¸c th«ng tin nµy th«ng qua c¸cbiÕn m«i tríng
- Thø nh×, ch¬ng tr×nh CGI cê thÓ nhỊn ®îc nh÷ng th«ng tin mµ ngíi sö dôngnhỊp vµo Nh÷ng th«ng tin nµy, tríc tiªn ®îc browser mĨ ho¸ sau ®ê göi ®i th«ng quac¸c biÕn m«i tríng (ph¬ng trøc GET) hoƯc lµ ®Ìu vµo chuỈn (stdin- ph¬ng thøc POST)
C¸c biÕn m«i tríng
HiÓu biÕt vÒ nh÷ng biÕn m«i tríng cê thÓ sö dông cho ch¬ng tr×nh CGI lµ mĩt
®iÒu rÍt h÷u Ých, gióp cho viÖc hôc lỊp tr×nh CGI vµ lµ c«ng cô gì rỉi rÍt tỉt B¶ng díi
®©y liÖt kª c¸c biÕn m«i tríng kh¶ dông trong lỊp tr×nh CGI Chóng ta cê thÓ viÕt mĩtch¬ng tr×nh in tÍt c¶ c¸c biÕn m«i tríng nµy ra
Biến môi trường Mô tả
GATEWAY_INTERFACE Phiên bản CGI server sử dụng
SERVER_NAME Tªn của Server hoặc địa chỉ IP
SERVER_SOFTWARE Tên và phiên bản của phần mềm Server đang
dùng SERVER_PROTOCOL Tên và phiên bản giao thức thông tin đi cùng
SERVER_PORT Số cổng của Host mà Server đang chạy
REQUEST_METHOD Ph¬ng thức yêu cầu thông tin
PATH_INFO Thông tin đường dẫn phụ trợ đến chương trình
CGI PATH_TRANSLATED Phiên bản biên dịch của đường dẫn cho bởi
biến PATH_INFO SCRIPT_NAME Đường dẫn ảo của Script sẽ được thực thi
DOCUMENT_ROOT Thư mục gỉc cña Web được phục vụ
QUERY_STRING Thông tin truy vấn đến chương trình
NguyÔn Hoµng ViÖt Khoa C«ng nghÖ th«ng tin-§iÖn tö viÔn th«ng
Trang 18REMOTE_HOST Hostname từ xa mµ người sử dụng yêu cầu ®Õn
REMOTE_ADDR Địa chỉ IP từ xa của người sử dụng tạo nên
yêu cầu AUTH_TYPE Phương thức kiÓm tra ®Ưc quyÒn
REMOTE_USER Tên xác nhận người sử dụng
CONTENT_TYPE Kiểu MIME của dữ liệu truy vấn, như
text/html
“text/html” ”
REMOTE_IDENT Người sử dụng tạo yêu cầu Biến này chỉ
được thiết lập nếu cờ identitycheck được phép, và máy client hổ trợ sơ đồ nhận biết (rfc 931)
CONTENT_LENGTH Chiều dài dữ liệu (byte hoặc số ký tự) đến
chương trình cgi thông qua đầu vào chuẩn.
HTTP_FROM Địa chỉ email của người sử dụng tạo yêu
cầu Hầu hết trình duyệt không hổ trợ biến này.
HTTP_ACCEPT Danh sách kiểu MIME kiểu client cập nhật
HTTP_USER_AGENT Trình duyệt client đang dùng phân phát yêu cầu HTTP_REFERER URL của tài liệu chỉ đến trước khi cập nhật
print "<h1>CGI Environment</h1>\n";
foreach $env_var (keys %ENV) {
print "<B>$env_var</B> = $ENV{$env_var}<BR>\n";
Trang 19extern char **environ;
Lợc đồ mã hoá dữ liệu đầu vào
Khi ngời sử dụng gởi (Submit) một form, trớc tiên browser phải mã hoá thông tin
tr-ớc khi gửi nó đến cho Server và sau đó đến chơng trình CGI Khi sử dụng thẻ
<INPUT>, mỗi trờng sẽ đợc đặt một tên tợng trng - có thể xem là một biến, mà giá trịcủa biến này sẽ là nội dung mà ngời sử dụng nhập vào Nh vậy, nếu nh form có nhiềuthẻ <INPUT> thì dữ liệu của form sau khi đợc Submit sẽ là một danh sách các cặp
tênbiến/giátrị Sẽ có sự nhầm lẫn ở đây, làm sao ta phân biệt đợc đâu là biến, đâu là trị
trong danh sách nói trên
Để giải quyết vấn đề này Browser sử dụng cái gọi là URL Encoding Nội dung củaURL Encoding có thể đợc tóm tắt nh sau:
- Phân cách các trờng khác nhau bằng dấu và "&".
- Phân cách tên biến và giá trị của nó bằng dấu "=", với tên biến ở bên trái và giá trị ở bên phải.
- Thay thế các khoảng trống bằng dấu cộng "+".
- Thay thế tất cả các ký tự "không bình thờng" bằng dấu phần trăm (%) theo sau là hai ký số hệ cơ số 16 (mã của ký tự đó).
Các ký tự "không bình thờng" và giá trị ở hệ cơ số 16 của chúng
Character Hexadecimal Value
Trang 20Enter your age: <input type=text name="age"><p>
Enter your email: <input type=text name="email"><p>
Theo thủ tục để mã hóa những cặp này, trớc tiên browser phải thay thế những ký tự
"bất bình thờng" Trong ví dụ này, chỉ có ký tự tự @ và nó đợc thay thế bởi %40 Vàbây giờ chúng ta có:
Trang 21Sự khác nhau giữa GET và POST
Sau khi dữ liệu đầu vào đợc mã hoá, chúng ta có hai cách gửi thông tin đến Webserver và chơng trình CGI đó là thông qua một trong hai phơng thức GET và POST Nhvậy thì điểm khác nhau giữa hai phơng thức này là gì ?
Theo phơng thức GET chuỗi đầu vào đợc truyền đến chơng trình CGI bằng cáchthêm thông tin vào phía sau của URL Ví dụ, để truyền chuỗi đầu vào:
name=Nguyễn+Hoàng+Việt&age=23&email=bcuong%40dng.vnn.vn đến chơngtrình CGI program.cgi, browser phải thêm một dấu "?" vào sau của URL và theo sau làthông tin Nh vậy URL của chúng ta sẽ có dạng nh sau:
http://192.0.1.1/cgi-bin/program.cgi?
name=Nguyễn+Hoàng+Việt&age=23&email=bcuong%40dng.vnn.vn
Tất cả những phần trong URL nằm phía sau dấu "?" đợc lu trữ trong biến môi trờngQUERY_STRING Sau đó chơng trình CGI sẽ phân tích chuỗi này thành dạng nó cóthể hiểu đợc
Phơng thức GET có vài vấn đề cố hữu: Thứ nhất, cỡ của chuỗi đầu vào bị hạn chếbởi kích thớc của biến môi trờng QUERY_STRING Nói chung chúng ta không thể cómột QUERY_STRING lớn hơn 1KB (1024 ký tự) DO đó GET không làm việc đợc vớicác form với khối lợng dữ liệu lớn Thứ nhì, chúng ta sẽ có những URL dài dòng và sấu
xí, dễ gây ra sai xót trong việc nhập URL
Một phơng pháp khác để gởi dữ liệu đến Server đó là sử dụng phơng thức POST.Phơng thức GET truyền dữ liệu thông qua biến môi trờng QUERY_STRING, trong
khi đó POST chuyển nó thông qua stdin POST là phơng thức thờng đợc sử dụng hơn,
đặc biệt là đối với những form chứa nhiều dữ liệu, bởi vì không bị hạn chế về số lợng dữliệu gửi đi Tuy nhiên đối với các form ít dữ liệu thì GET vẫn hay đợc sử dụng, hơn nữaGET là phơng thức ngầm định khi ta không khai báo cụ thể trong tham số METHOD
Để xác định phơng thức nào đang đợc sử dụng, chơng trình CGI kiểm tra biến môitrờng mang tên REQUEST_METHOD, khi chơng trình chạy biến môi trờng này sẽnhận một trong hai giá trị là GET hoặc POST Nếu nhận giá trị là POST thì độ dài củathông tin đợc mã hoá và lu trữ trong biến môi trờng mang tên CONTENT_LENGTH
Thuật toán giải mã
Nh ta đã biết chơng trình CGI nhận đợc dữ liệu là một chuỗi đã đợc mã hoá bởibrowser Để thông tin trở nên có thể sử dụng đợc chơng trình CGI cần giải mã thông tinnhận đợc theo đúng cách Trớc hết, chơng trình cần xác định dữ liệu đợc gởi theo phơngthức nào Điều này có thể thực hiện bởi việc xem giá trị trong biến môi trờngQUERY_METHOD Nếu giá trị chỉ định yêu cầu GET, thì hoặc chuỗi query hoặcthông tin đờng dẫn phụ trợ đợc chứa trong biến môi trờng Mặt khác, nếu là yêu cầuPOST, số bytes xác định bởi biến môi trờng CONTENT_LENGTH phải đợc đọc từ đầuvào chuẩn
Sau đây là thuật toán giải mã:
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Trang 221 Xác định phơng thức yêu cầu(GET hay POST) bởi kiểm tra biến môi
7 Hình thành bảng khoá-trị (key-value) với khoá là chỉ mục.
Chú ý rằng thứ tự của các bớc trong thuật toán là hết sức quan trọng Nếu khôngtuân theo thứ tự này thì kết qủa giải mã sẽ sai, thông tin nhận đợc sẽ bị nhầm lẫn
# Hình thành cặp (key, value) từ mảng @in.
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
# Chuyển %XX từ dạng số hexa thành dạng alphanumeric của chúng
$key =~ s/%( )/pack("c",hex($1))/ge;
$val =~ s/%( )/pack("c",hex($1))/ge;
# tập hợp các key và value thu đợc vào một mảng liên hợp
$in{$key} = "\0" if (defined($in{$key})); # \0 is the multiple separator
Trang 23 Để sử dụng CGI, trớc hết ta viết một chơng trình hoặc Script Perl có thể làngôn ngữ phổ biến cho việc lập trình Ngôn ngữ nh C, C++ hoặc Fortran cóthể sử dụng để cập nhật CGI dễ dàng sau khi biên dịch xong
Tiếp đến, Script hoặc chơng trình biên dịch đợc đặt vào trong một th mục
đặc biệt trên Web Server gọi là /cgi-bin, nó chứa tất cả các chơng trình CGI
và Scripts Nhằm mục đích bảo mật mà các chơng trình đặt trong th mụckhác không chạy đợc Nếu cho phép đặt tự do, thì sẽ khó khăn cho việc bảoquản và thực hiện chúng
Sau khi gởi chơng trình CGI đến th mục cgi-bin, nó liên kết với URL trongHTML trên trang Web
Khi kích URL, Server khởi đầu chơng trình CGI (qua phơng thức GET hoặcPOST), đặt trên Web Server Ví dụ, nếu chức năng của chơng trình CGI làtìm kiếm CSDL, thì chơng trình CGI có thể gởi một form đến Client TừClient, dữ liệu trên form đợc gởi về cho chơng trình CGI nhờ các biến môitrờng STDIN Dữ liệu đợc định dạng bằng cách mã hoá cặp giá trị
Key/Value.
Chơng trình CGI kết nối CSDL và yêu cầu thông tin CSDL gởi dữ liệu đếncho chơng trình CGI Thông tin có thể đợc định dạng dới các dạng khácnhau: Text, Graphics, Sound, Video files, URLs , chơng trình CGI trả kết
quả về cho Server (STDOUT), rồi gởi về cho trình duyệt.
Chơng trình CGI còn định dạng dữ liệu, ví dụ : lấy thông tin và đa vào khuôn dạngcác trang HTMLs, vì vậy ngời sử dụng có thể đọc nó qua trình duyệt Web
Tóm lại, CGI làm việc qua 7 bớc:
Trình duyệt gởi yêu cầu đến Server
Server thu nhận thông tin cung cấp bởi Client
Server gởi thông tin đến chơng trình CGI (CGI Script).
Chơng trình CGI xử lý thông tin và kể cả đọc/ghi dữ liệu bên trong(từ CSDL).
Chơng trình CGI trả kết quả cho Server
Vars
Trang 24III Cài đặt và chạy chơng trình CGI
Trong các phần trớc chúng ta đã bàn về cách thức lập trình với CGI, phần này xemxét về cấu hình Web server để sử dụng CGI, cài đặt và chạy chơng trình Chúng ta sẽxem xét một vài server khác nhau trên các hệ điều hành khác nhau
Tất cả các Server đều yêu cầu khoảng trống cho các tập tin chơng trình và cho cáctài liệu HTML Khu vực cho server đợc gọi là ServerRoot và vùng cho tài liệu đợc gọi
là DocumentRoot Trên hệ thống UNIX, thì ServerRoot thờng là th mục /usr/local/etc/
httpd và DocumentRoot thờng là th mục /usr/local/etc/httpd/htdocs Điều này không
nhất thiết là đúng trên mọi hệ thống, ví dụ nh trên hệ thống LINUX thì ServerRoot lại là/usr/etc/httpd
Khi truy cập file bằng Web browser, hãy chỉ định rõ file trong URL t ơng ứng vớiDocumentRoot Ví dụ, có file /usr/etc/httpd/htdocs/index.html trên hệ thốngmymachine.edu, chúng ta phải truy cập file đó với URL sau:
http://mymachine.edu/index.html
III.1 Cấu hình Server để chạy CGI
Hầu hết các Web server đều đợc tiền cấu hình cho việc sử dụng các chơng trìnhCGI Nhìn chung, Web server đợc thông báo liệu một file có phải là ứng dụng CGI haykhông là qua hai con đờng sau:
- Một th mục đợc chỉ định : Một vài Server cho phép chúng ta chỉ định tất cả
các file nằm trong một th mục đợc chỉ ra là các ứng dụng CGI (thờng th mụcmặc định này có tên là cgi-bin)
- Phần mở rộng : Nhiều Server đợc tiền cấu hình để dịch các file có phần mở
rộng là cgi nh là các ứng dụng CGI
Trong một phạm vi nào đó thì phơng pháp dùng th mục chỉ định là lỗi thời (cácserver cổ nhất đã sử dụng phơng pháp này nh là biện pháp duy nhất để xác định file nào
là tập tin CGI ), nhng nó cũng có một số u điểm riêng nh sau :
- Bảo đảm cho các chơng trình CGI đợc trung tâm hoá, dễ quản lý, ngăn cản sựlộn xộn của các th mục
- Không bị hạn chế bởi bất cứ phần mở rộng nào, vì vậy có thể tự do trong việc
đặt tên file Một số servers hỗ trợ việc chỉ định một vài th mục làm th mục CGI
- Dễ dàng cho việc bảo mật hệ thống Trên hệ thống có nhiều ngời sử dụng thìviệc chỉ định rõ th mục nào là th mục chứa chơng trình CGI rất có lợi cho ngờiquản trị hệ thống Một ngời sử dụng muốn cài đặt chơng trình CGI của họ lênserver thì cần phải thông qua ngời quản trị hệ thống, mã nguồn sẽ đợc kiểm tra
và an ninh hệ thống đợc bảo đảm
Việc xác định chơng trình CGI bằng phân mở rộng của tên file có thể hữu ích dotính linh hoạt của nó Không bị hạn chế hạn chế bởi một th mục đơn lẻ cho chơng trìnhCGI Hầu hết các server đầu đợc cấu hình để có thể nhận dạng chơng trình CGI bằngphàn mở rộng tên file, mặc dù không phải tất cả chúng đều cấu hình theo cách mặc
định này
Trang 25III.2 Cài đặt CGI trên server UNIX
Mặc dù các Web server chạy trên UNIX hầu hết đã đợc cấu hình sẵn, xong cũngcần thực hiện một vài điều để chơng trình CGI hoạt động đợc Nếu chúng ta sử dụngcác ngôn ngữ script nh Perl hoặc Tcl để viết các ứng dụng CGI trên hệ thống UNIX,chúng ta cần chú ý đến dòng đầu tiên trong mỗi script Dòng này chỉ ra đ ờng dẫn tuyệt
đối đến trình thông dịch Ví dụ, một CGI script dùng trình thông dịch Perl nằn trong thmục /usr/bin thì dòng đầu tiên của script phải là:
#!/usr/bin/perl
Theo ngầm định Apache Web servers chạy trên UNIX đợc cấu hình để hiểu rằng tấtcả các file nằm trong th mục cgi-bin là các chơng trình CGI Để thay đổi vị trí th mụccgi-bin chúng ta cần sửa lại file cấu hình srm.conf Định dạng cho cấu hình th mục nàylà
ScriptAlias fakedirectoryname realdirectoryname
ở đây fakedirectoryname là tên th mục giả (/cgi-bin) và realdirectoryname là đờng
dẫn đến nơi chơng trình CGI thực sự đợc lu trữ Chúng ta có thể cấu hình nhiều hơn một
ScriptAlias để có đợc nhiều th mục chứa chơng trình CGI bằng cách thêm các dòng ScriptAlias vào tệp tin này Ví dụ, các chơng trình CGI của chúng ta đợc lu trữ trong th
mục /home/httpd/cgi-bin thì dòng ScriptAlias trong srm.conf có thể nh sau
ScriptAlias /cgi-bin/ /home/httpd/cgi-bin
Để gọi các chơng trình CGI nằm trong th mục này chúng ta sử dụng URL:
http://hostname/cgi-bin/programname
Trong đó hostname là tên máy Web server, programname là tên chơng trình CGI.
Ví dụ chúng ta có chơng trình Hello.cgi trong th mục /home/httpd/cgi-bin và trên Webserver mang tên www.athv.edu thì để gọi chơng trình Hello.cgi chúng ta sử dụng URLsau: http://www.athv.edu/cgi-bin/Hello.cgi
Nếu chúng ta muốn cấu hình cho server nhận biết một file là chơng trình CGI thôngqua phần mở rộng cgi thì chúng ta cần thay đổi hai file cấu hình Đầu tiên, trong filesrm.conf bỏ chú thích ở đầu dòng:
AddType application/x-httpd-cgi cgi
Tiếp theo cần sửa đổi trong file access.conf để CGI có thể thực hiện đợc trong bất
ký th mục nào Để làm điều này thêm tuỳ chọn ExcCGI vào dòng Option nh sau
Option Indexes FollowSymLinks ExecCGI
III.3 Chạy chơng trình CGI
Sau khi mã nguồn của chơng trình CGI đã đợc viết và server đã đợc cấu hình hoànchỉnh thì việc gọi thực hiện một chơng trình là hết sức đơn giản Nếu chơng trình CGIchỉ có đầu ra (nh hello world!) thì ở browser chúng ta chỉ việc nhập vào URL Hầu hếtcác chơng trình CGI đợc gọi thực hiện sau khi một form HTML đợc submit, chúng tacần biết form HTML đó và biết nó gọi thực hiện chơng trình CGI nào trên server
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Trang 26Có 3 cách để vận hành một chơng trình đợc viết bằng ngôn ngữ Perl Nhng dù cáchnào đi nữa thì trình thông dịch Perl sẽ đọc mã nguồn sau đó dịch và đệ trình lên cho lớp
vỏ để đem thực hiện Chơng trình viết theo ngôn ngữ perl là một tập hợp các lệnh, cáckhối lệnh đợc sắp sếp theo một thứ tự nào đó tuỳ công việc cần giải quyết Một lệnhperl kết thúc bằng dấu chấm phảy ";" Những phần nằm sau ký tự # đợc xem nh là chúthích
1 ở dấu nhắc của hệ thống đánh tên trình thông dịch Perl, sau đó nhấn Enter.Khi đó Linux sẽ đợi ngời dùng nhập vào các dòng mã Sau khi mã nguồn của chơngtrình đợc nhập và chúng ta nhấn Ctrl+D để báo cho Perl biết là mã nguồn đến đây là kếtthúc Chơng trình vừa nhập vào sẽ đợc dịch và chạy, kết quả sẽ đợc hiện ngay lên mànhình
Ví dụ:
[athv /root]#perl
print "Hello World !";
Ctrl +D
Trang 27Hello World
[athv /root]#
2 Theo cách này, chơng trình nguồn đợc soạn thảo bằng một trình soạn thảo nào
đó ( có thể là vi, emacs .) và đợc lu trữ dới dạng một file văn bản bình thờng Sau đó
print "Hello $yourname !\n";
Giả sử ta lu trữ chơng trình này với tên là hello.pl và sau khi sử dụng lệnh chmod để
đặt thuộc tính khả thi cho chơng trình, thì để chạy chơng trình chúng ta chỉ việc gõ tênchơng trình ( giả sử ta nhập vào Hoàng Việt)
II Biến trong Perl
Perl có 3 kiểu biến cơ bản: kiểu vô hớng (Scalar), kiểu mảng (Array) và mảng liênhợp (Associative array) Biến vô hớng có thể giữ giá trị của một con số ( có thể là sốnguyên, số thực với dấu chấm động) hoặc một xâu chuỗi (string) Một mảng có thể lutrữ nhiều dữ liệu vô hớng theo một thứ tự liên tiếp, những dữ liệu vô hớng này đợc truycập theo chỉ mục của mảng (chỉ mục bắt đầu từ 0) Mảng liên hợp có cấu trúc giống nhmảng trong việc lu trữ theo thứ tự liên tiếp các xâu chuỗi nhng nó sử dụng một xâuchuỗi khác làm chỉ mục để địa chỉ hoá các phần tử của mảng thay vì một con số
II.1 Biến vô hớng(Scalar variables)
Cú pháp cho một biến vô hớng là:
$variable_name
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Trang 28Dấu "$" đứng trớc một biến vô hớng là bắt buộc Theo sau dấu "$" là qui tắc đặt tênbiến giống nh các ngôn ngữ khác Chú ý rằng, biến trong Perl có thể không cần khaibáo trớc khi sử dụng, tuy nhiên việc khai báo trớc sẽ thuận lợi hơn cho việc gỡ rối và
đọc chơng trình về sau Có thể đặt tên biến trùng nhau, một biến mảng có thể trùng vớitên biến vô hớng hoặc mảng liên hợp, Perl không bắt bẻ chuyện này ( cú pháp của biếnmảng và mảng liên hợp sẽ bàn đến sau)
Để gán giá trị cho các biến vô hớng, chúng ta hãy xem vài ví dụ sau:
Để hiển thị giá trị của một biến chúng ta sử dụng câu lệnh print Vì vậy, để in giá trị của biến $name chúng ta dùng lệnh sau:
print $name;
Giá trị của biến vô hớng $name sẽ đợc in lên màn hình Perl nhận dữ liệu vào từ đầu
vào chuẩn (bàn phím) và xuất dữ liệu ra đầu ra chuẩn (màn hình)
II.2 Khối lệnh và các cấu trúc điều khiển
Theo các ngôn ngữ quen thuộc nh C, Pascal thì chúng ta có thể gọi đây là một lệnhkép, phát biểu kép, hay một thuật ngữ tơng tự nào đó Đơn giản trong Perl, khối lệnh làtập hợp nhiều lệnh (có thể là một khối lệnh khác) nằm gọn trong cặp dấu móc nhọn
"{ và }" Việc định nghĩa và nhận biết các khối lệnh rất quan trọng, đặc biệt khi chúng
ta quan tâm đến tầm vựng của biến trong chơng trình, giá trị của nó trong một thời điểmnào đó cũng nh ảnh hởng của các câu lệnh đến giá trị của biến Thông thờng, chúng tahay gặp các khối lệnh ở các cấu trúc lặp, các cấu trúc điều kiện, các định nghĩa chơngtrình con Tuy nhiên, một khối lệnh nh sau là hoàn toàn hợp lệ:
until(<điều kiện>) { # Ngợc lại với phát biểu while.
thực hiện các mã lệnh ở đây trong khi <điều kiện> sai;
}
do {
thực hiện các lệnh trong khối ít nhất một lần
dựng khi <điều kiện> sai
} while(<điều kiện>);
Trang 29do {
thực hiện các lệnh trong khối ít nhất một lần
dựng khi <điều kiện> đúng
thực hiện các lệnh khi <điều kiện 1> đúng;
} elsif (<điều kiện 2>) {
thực hiện các lệnh khi <điều kiện 2> đúng;
} elsif (<điều kiện N>) {
thực hiện các lệnh khi <điều kiện N> đúng;
} else {
thực hiên các lệnh khi các <điều kiện 1 N> sai;
}
unless (<điều kiện 1>) { # ngợc lại với phát biểu If
thực hiên các lệnh khi các <điều kiện 1> sai;
}
Thông qua các ví dụ trên về cách sử dụng các khối lệnh của Perl, một cách gián tiếpchúng ta đã khảo sát các cấu trúc điều khiển cơ bản của Perl
Điều kiện trong các khối lệnh này là bất kỳ một thứ gì của Perl, từ một biến đến một
biểu thức, miễn là có giá trị trả về là hoặc giá trị đúng (true) hoặc giá trị sai (false) Một giá trị true là một giá trị khác không (non-zero), hoặc một chuỗi không rỗng (non-
empty string).
II.3 Phạm vi của biến
Các khối lệnh có thể đợc khai báo nằm trong các khối lệnh khác để tạo nên các cấutrúc khối lồng nhau(khối lệnh ở đây có thể là một thủ tục, hàm) Biến đợc khai báotrong trong một khối lệnh nào đó thì theo ngầm định thì nó là biến toàn cục đối với toàn
bộ chơng trình Để giới hạn phạm vi của biến trong một khối lệnh, trong một chơng
trình con perl cung cấp cho chúng ta hai hàm là my() và local() Ví dụ chúng ta có thể
khai báo biến trong một khối nh sau: my $variable1 Theo cách này $variable1 chỉ truy
cập đợc trong nội bộ khối lệnh mà biến đợc khai báo, không thể truy cập đợc trong tất
cả các khối con Ngoài ra có thể khai báo: local $variable2( nếu có nhiều biến cần khai
báo chúng ta sử dụng cặp ngoặc đơn và các biến cách nhau bởi dấu phảy ",") Theo
cách này $variable2 có thể truy cập đợc trong khối nó đợc khai báo và tất cả các khối
Trang 30LËp tr×nh CGI b»ng Perl trªn Linux 30
print("firstSub: firstVar = $firstVar\n");
print("firstSub: secondVar = $secondVar\n\n");
secondSub();
print("firstSub: firstVar = $firstVar\n");
print("firstSub: secondVar = $secondVar\n\n");
} sub secondSub{
print("secondSub: firstVar = $firstVar\n");
print("secondSub: secondVar = $secondVar\n\n");
$firstVar = "ccccC";
$secondVar = "DDDDD";
print("secondSub: firstVar = $firstVar\n");
print("secondSub: secondVar = $secondVar\n\n");
}
KÕt qu¶ ch¹y ch¬ng tr×nh firstSub: firstVar = AAAAA firstSub: secondVar = BBBBB secondSub: firstVar = AAAAA Use of uninitialized value at test.pl line 19.
secondSub: secondVar = secondSub: firstVar = ccccC secondSub: secondVar = DDDDD firstSub: firstVar = ccccC
}
}