Đề tài Tìm hiểu về ngôn ngữ kịch bản PHP, hệ quản trị cơ sở dữ liệu MySQL và hệ mã nguồn mở Joomla

Ứng dụng - Các cổng thông tin điện tử hoặc các website doanh nghiệp - Thương mại điện tử trực tuyến - Báo điện tử, tạp chí điện tử - Website của các doanh nghiệp vừa và nhỏ - Website của các cơ quan, tổ chức phi chính phủ - Website các trường học - Website của gia đình hay cá nhân

doc59 trang | Chia sẻ: aloso | Lượt xem: 3192 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Tìm hiểu về ngôn ngữ kịch bản PHP, hệ quản trị cơ sở dữ liệu MySQL và hệ mã nguồn mở Joomla, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
MỤC LỤC LỜI MỞ ĐẦU Ngày nay Thương mại điện tử đã trở thành một ngành kinh tế mũi nhọn trên thế giới và đã xuất hiện nhiều trung tâm thương mại và thị trường chứng khoán lớn trên thế giới. Thương mại điện tử không chỉ mở ra những cơ hội kinh doanh mới, những sản phẩm và dịch vụ mới, những ngành nghề kinh doanh mới mà bản thân nó thực sự là một phương thức kinh doanh mới: Phương thức kinh doanh điện tử. Thương mại điện tử chuyển hoá các chức năng kinh doanh, từ nghiên cứu thị trường và sản xuất sản phẩm đến bán hàng, dịch vụ sau bán hàng từ phương thức kinh doanh truyền thống đến phương thức kinh doanh điện tử. Trong thời gian thực tập vừa qua , em đã học được nhiều điều về việc thiết kế web bằng ngôn ngữ kịch bản PHP hệ quản trị cơ sở dữ liệu MySQL, mã nguồn mở joomla và ứng dụng để xây dựng 1 trang web thương mại điện tử . Bài báo cáo này hi vọng sẽ nói được một phần nào về những việc trên. Vì thời gian và trình độ có hạn nên bài báo cáo thực tập tổng hợp này sẽ không tránh khỏi sai sót. Mong cô thông cảm , châm chước và giúp đỡ em. CHƯƠNG I: MỤC ĐÍCH CỦA ĐỀ TÀI 1.1.Mục đích của đề tài : Xây dựng trang web của công ty công nghệ cổ phần tương lai với địa chỉ là thực hiện các chức năng chính mà công ty yêu cầu như giới thiệu sản phẩm , giao dịch với khách hàng , trao đổi kinh nghiệm giữa các nhân viên trong công ty … 1.2. Giới thiệu về công ty: Tên:Công ty cổ phần công nghệ tương lai . Lĩnh vực : Điện tữ viễn thông Địa chỉ: Tầng 2 & 3 , Nhà 3 tầng , số 2 , Chùa Bộc , Đống Đa , Hà Nội 1.3.Yêu cầu về hướng phát triển trang web: 1.3.1.Cách thức truy cập Mở Internet Exploer Đối với người quản trị :Trên Internet: Địa chỉ Website www.nextjsc.com.vn/ administrator User Name: Password: Màn hình sau khi đăng nhập thành công 1.3.2. Manage WebPage: Quản lý các trang thông tin của web site Trang quản lý WebPage đưa ra thông tin về những trang web hiện có: Page Name: Tên của trang web Home: Trang này có là trang chủ không Visiable: Trang nào được hiển thị Component: Trang này có bao nhiêu module Up/Down: Mỗi trang đều được đánh thứ tự tương đối so với các trang khác. Up/Down được dùng để thay đổi thứ tự đó Check: Nếu muốn xóa trang web nào, check vào check box rồi chọn nút Delete Để chỉnh sửa một trang web: Click vào link của từng tên trang web Menu:Web Page này thuộc về menu nào Show title: Khi web page này được hiển thị, có hiển thị tiêu đề của trang web không Main Img: Có ảnh chính của trang web này không Member Only: Trang này có dành riêng cho member không Set as Home Page: Có đặt trang này là trang chủ không Visiable: Trang này có được hiển thị không WebPage Name: Tên của trang web Title: Tiêu đề của trang web Short Desc: Mô tả ngắn gọn Content: nội dung của trang web. 1.3.3. Quản lý sản phẩm a) Quản lý chủng loại Mỗi chủng loại được đánh một chỉ số xác định vị trí tương đối giữa các chủng loại. Để thay đổi vị trí tương đối của một chủng loại chọn nút up/down tương ứng với chủng loại đó. Để xóa chủng loại chọn check tương ứng rồi click nút Delete Để thêm mới một chủng loại chọn Add Category Để xem / sửa / thêm số sản phẩm có trong chủng loại đó ta chọn vào Product (n): + n: là số sản phẩm có trong chủng loại đó ( có trong category ). Ví dụ: trong dòng sản phẩm Banner: Ảnh đại diện cho chủng loại này. Name: Tên của chủng loại Description: Mô tả của chủng loại Parrent Category: Chủng loại này có là một chủng loại con của chủng loại nào không b) Quản lý sản phẩm - Khi click vào mục product của từng chủng loại, chương trình sẽ hiển thị toàn bộ sản phẩm thuộc chủng loại đó. Thông tin bao gồm: Ảnh sản phẩm Tên sản phẩm Giá Số lượt truy cập Số lượng đặt hàng Để xóa sản phẩm, chọn check rồi click nút delete Để thêm mới sản phẩm click vào Add Product Để chỉnh sửa thông tin 1 sản phẩm click vào ảnh hoặc tên sản phẩm Thông tin về sản phẩm gồm: Image: Ảnh sản phẩm Name: Tên sản phẩm Descriptions: Mô tả ngắn gọn sản phẩm Full Descriptions: Mô tả đầy đủ Price: Giá sản phẩm default để là 0 Supplier: Nhà cung cấp sản phẩm Is Spesical: Có là sản phẩm đặc biệt hay không Category: Thuộc chủng loại nào Images Library: deafault để là 2 - Muốn cập nhật thông tin sản phẩm thì kích chuột chon add product của phần Product màn hình sẽ hiện ra như sau: Image: Ảnh sản phẩm Name: Tên sản phẩm Descriptions: Mô tả ngắn gọn sản phẩm Full Descriptions: Mô tả đầy đủ Price: Giá sản phẩm default để là 0 Supplier: Nhà cung cấp sản phẩm Is Spesical: Có là sản phẩm đặc biệt hay không Category: Thuộc chủng loại nào Images Library: deafault để là 1 hoặc 2 c) Quản lý tin tức 1. Đăng nhập vào vào phần quản lý tin tức: (H1) 2.Muốn cập nhật thêm tin tức mới. Kích chọn News(1) (ảnh minh hoạ H1) Sẽ hiện ra hình ảnh dưới đây Kích chuột vào Add News: Sau khi kích chuột vào Add News màn hình sẽ hiện ra như sau: Trong đó: Mainmg: đương dẫn ảnh tin tức Actived: Có hiển thị nên trang web hay ko(phải kích chuột chọn vào ô vuông thi tin tức mới hiện nên trang web) Library Image Cols: Mặc định để là 2 Subject: tên tiêu đề tin tức Nguồn: nguồn tin tức này lấy từ đâu. Short Desc: Mô tả ngắn gọn tin tức Content: Mô tả đầy đủ tin tức Sau đó thi kích chuột chon Submit 3.Chỉnh sửa nội dung tin tức. Muốn chỉnh sửa nội dung tin tức thì kích chuột vào tin mình cần chỉnh sửa VD: Bạn muốn chỉnh sửa nội dung tin tức “Dự án khu phố chợ Phủ - Bình Giang” Sau khi kich chuột vảo tin “Dự án khu phố chợ Phủ - Bình Giang” thì màn hình sẽ hiện ra một bảng như sau. Trong đó : - Browse: đương dẫn ảnh - Atived: ẩn hay hiện tin này nên trang web hay ko - Subject: Tiêu đề tin tức - ImageDescription: Nguồn ảnh - Nguồn: thông tin này bạn lấy ở đâu - Short Desc: Mô tả ngắn gọn tin tức - Content: Mô tả chi tiết tin tức Có thể tùy y sửa tất cả các mục ở trên hoặc một mục mà mình nuốn chỉnh sủa sau đó ấn vào nut “Submit” CHƯƠNG 2: TÌM HIỂU VỀ NGÔN NGỮ KỊCH BẢN PHP, HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU MYSQL, VÀ HỆ MÃ NGUỒN MỞ JOOMLA 1. Giới thiệu và sử dụng PHP 1.1 - Giới thiệu a) Lịch sử ra đời: Năm 1995, Rasmus Lerdorf tạo ra PHP nhằm giải quyết việc viết lặp đi lặp lại cùng đoạn mã khi tạo các trang. Ban đầu tác giả chỉ có ý định tạo bộ phân giải đơn giản để thay thế các thẻ lệnh trong file HTML bằng các đoạn mã lệnh viết bằng C. Ngôn ngữ 10/2000 03/2002 Tỉ lệ phát triển Thị phần Php(php,php3,phtml) 157,470 7,549,230 4694% 30% Asp 3,166,710 11,958,185 278% 48% Jsp 24,435 413,827 1594% 2% Cfm (ColdFusion) 936,223 4,950,133 429% 20% Theo PC World 7.2002 (117) b) PHP là gì? PHP được viết từ Hypertext Preprocessor, đây là một ngôn ngữ kịch bản mã nguồn mở sử dụng cho mục đích chung, đặc biệt thích hợp cho phát triển Web và có thể nhúng vào HTML. Hiện nay được sử dụng rất rộng rãi. Mã PHP được thực thi ở phía Server, khi trình duyệt của người dùng truy cập một trang web có chứa một đoạn mã PHP thì trình duyệt nhận được trangkết quả đã xử lý từ Web server, người dùng sẽ không thể biết được đoạn mã viết gì. Mã PHP được bao trong cặp dấu hoặc . Tập tin PHP có phần mở rộng là .php hoặc .php3 PHP tương tự JSP và ASP với tập thẻ lệnh dùng cho trang HTML. Điểm đặc biệt là PHP được phát triển hoàn toàn cho nền tảng web, chính vì vậy , mà các ứng dụng viết bằng PHP rất ngắn gọn so với VBScript hay JSP. Đây cũng chính là điểm mạnh của PHP so với Perl. Cú pháp PHP mượn từ nhiều ngôn ngữ khác như C, Java, Perl... PHP có thể giao tiếp với nhiều hệ CSDL như MySQL, MS Access, Sybase, Oracle và cả Microsoft SQL. Không chỉ có khả năng thao tác CSDL, PHP còn có nhiều khả năng khác như IMAP, SNMP, LDAP, XML... PHP chạy trên hầu hết các nền tảng hệ thống. Trình máy chủ phân giải mã lệnh PHP có thể tải về miễn phí từ trang web chính thức của PHP. Có lẽ yếu tố hấp dẫn nhất của PHP là nó hoàn toàn miễn phí. Với máy tính cấu hình vừa phải chạy Linux, cài đặt Apache, PHP và MySQL, bạn sẽ có máy chủ có thể phục vụ được nhiều ứng dụng web tương đối. Toàn bộ chi phí hầu như chỉ là thời gian bạn bỏ ra để cài đặt các phần mềm. PHP được xem là một thay thế cho Perl. PHP không thể làm được nhiều như Perl, thế nhưng chính sự hạn chế này làm cho PHP dễ học và dễ dùng. Nhiều nhà phát triển dùng kết hợp cả hai : Perl dùng cho những tác vụ chạy bên dưới còn PHP dùng cho việc xử lý bề mặt. Komodo của Active State Corp là công cụ miễn phí dùng để phát triển trang PHP. 1.2 - Sử dụng PHP a) Thẻ PHP Có 4 loại khác nhau của thẻ PHP: - Kiểu Short: là thẻ mặc định mà các nhà lập trình PHP thường sử dụng. - Kiểu định dạng XML: thẻ này có thể sử dụng với văn bản dạng XML. - Kiểu Script: trong trường hợp muốn sử dụng PHP như một script tương tự như khai báo Javascript hay VBScript echo “PHP script”; - Kiểu ASP: <% echo “Đây là kiểu ASP”; %> b) Gọi hàm trong PHP Để gọi hàm trong PHP, khai báo tương tự như gọi hàm trong các ngôn ngữ lập trình khác, hầu hết các hàm khi gọi cần truyền tham số và giá trị trả về. VD: Gọi hàm date() <? echo “Hôm nay là: ”.date(“d/m/Y”); ?> c) Truy cập biến Form Thông thường khi cần lấy dữ liệu của người dùng nhập, chúng ta sẽ dùng thẻ form trong trang web nhằm ràng buộc tất cả các thẻ input, selec, textarea... Dữ liệu đến từ script đều là biến PHP, chúng ta có thể nhận biết chúng bằng cách sử dụng dấu $ trước tên biến. Có hai cách để truy cập dữ liệu trên form thông qua biến. - Để lấy giá trị của các thẻ trong form theo dạng POST: $_POST[‘tên_thẻ’] - Để lấy giá trị của các thẻ trong form theo dạng GET: $_GET[‘tên_thẻ’] d) Khai báo biến: PHP Engine không cần yêu cầu khai báo biến trước khi sử dụng, tuy nhiên nên tập thói quen khai báo và khởi tạo giá trị ban đầu cho biến trước khi sử dụng chúng. e) Gán giá trị cho biến Để gán giá trị cho biến, nếu biến đó chưa khai báo trước đó, biến này được coi như vừa khai báo và khởi tạo. Trong trường hợp biến đã khai báo, biến này chỉ thay đổi giá trị. VD: <?php $qtty=20; $price=10; $total=$qtty*$price; echo “Total: $total”; ?> f) Kiểu dữ liệu của biến trong PHP PHP hỗ trợ 5 kiểu dữ liệu - Interger: Sử dụng hầu hết cho giá trị có kiểu dữ liệu là số. - Double: Sử dụng hầu hết cho giá trị có kiểu dữ liệu là số thực. - String: Sử dụng hầu hết cho giá trị có kiểu dữ liệu là chuỗi, ký tự. - Array: Sử dụng hầu hết cho giá trị có kiểu dữ liệu là mảng có các phần tử cùng kiểu dữ liệu. - Object: Sử dụng hầu hết cho giá trị có kiểu dữ liệu là đối tượng của lớp. g) Toán tử trong PHP * Các phép toán số học Toán tử Tên Ví dụ + Cộng $a + $b; - Trừ $a - $b; * Nhân $a*$b; / Chia $a/$b; % Modulo $a%$b; * Các phép toán gán kết hợp Toán tử Sử dụng Tương tự += $a+=$b $a=$a + $b; ++ $a++ $a=$a + 1; -= $a-=$b $a=$a - $b; -- $a-- $a=$a-1; *= $a*=$b $a=$a*$b; /= $a/=$b $a=$a/$b; %= $a%=$b $a=$a%$b; .= $a.=$b $a=$a.$b; * Các phép logic Phép toán Ký hiệu Sử dụng Ý nghĩa ! NOT !$a Phép toán phủ định && AND $a && $b Trả về true nếu cả hai biến có giá trị true. Ngược lại là false || OR $a || $b Trả về true nếu $a hay $b hay cả hai biến có giá trị true and AND $a and $b Trả về true nếu cả hai biến có giá trị true. Ngược lại là false or OR $a or $b Trả về true nếu $a hay $b hay cả hai biến có giá trị true * Các phép toán so sánh Phép toán Sử dụng Ý nghĩa so sánh = = $a= =$b $a bằng $b = = = $a = = = $b $a bằng và cùng kiểu dữ liệu với $b != $a!=$b $a không bằng $b $a$b $a không bằng $b < $a<$b $a nhỏ hơn $b <= $a<=$b $a nhỏ hơn hoặc bằng $b > $a>$b $a lớn hơn $b >= $a>=$b $a lớn hơn hoặc bằng $b h) Kiểm tra biến trong PHP - is_array(): Kiểm tra biến là array hay không. - is_double(): Kiểm tra biến là double hay không. - is_float(): Kiểm tra biến là float hay không. - is_real(): Kiểm tra biến là real hay không. - is_long(): Kiểm tra biến là long hay không. - is_int(): Kiểm tra biến là int hay không. - is_interger(): Kiểm tra biến là integer hay không. - is_string(): Kiểm tra biến là string hay không. - is_object(): Kiểm tra biến là object hay không. - isset(): Nếu biến tồn tại hàm trả về giá trị true, ngược lại trả về false. - empty(): Cho phép kiểm tra biến tồn tại và không rỗng, có chiều dài khác 0 trả về true, ngược lại là false. Để sử dụng tất cả các hàm trên, cần phải truyền vào hàm biến PHP dưới dạng tham số. i) Phát biểu có điều khiển - Phát biểu If: Phát biểu if với một điều kiện, nếu điều kiện là true thì khối lệnh trong phát biểu If sẽ được thực hiện, điều kiện được khai báo trong dấu () VD: $a = 10; $b=6; if($a>$b) echo $a+$b; Khối lệnh trong bất kỳ phát biểu điều khiển nào cũng có thể sử dụng dấu { và }. Có nghĩa là nếu khối lệnh trong phát biểu lớn hơn 1 thì phải sử dụng hai dấu trên. - Phát biểu Else: phát biểu else luôn là trường hợp ngược lại của phát biểu if với một điều kiện, nếu điều kiện là true thì khối lệnh trong phát biểu if sẽ được thực hiện, ngược lại khối lệnh trong phát biểu else sẽ được thực hiện. VD: $a = 10; $b=6; if($a>$b) echo $a+$b; else $b=$a+1; Tương tự như trong trường hợp phát biểu if, nếu khối lệnh trong phát biểu điều khiển else có hơn 1 dòng lệnh thì sẽ phải khai báo sử dụng dấu { và }. - Phát biểu Switch: tương tự như phát biểu if, nhưng trong trường hợpcó nhiều hơn hai tùy chọn cụ thể cho phép quyết định. VD: switch($diem) { case “5”: echo “Điểm trung bình”; break; case “7”: echo “Điểm khá”; break; case “10”: echo “Điểm giỏi”; break; deafault: echo “Nhập lại”; } Nếu đúng điều kiện case, cần khai báo phát biểu break nhằm thoát ra khỏi phát biểu switch. Trong trường hợp không khai báo break trong mỗi phát biểu case, nếu thỏa mãn điều kiện trong case nhưng PHP vẫn tiếp tục thực hiện tiếp các phát biểu case sau đó. - Phát biểu While: phát biểu vòng lặp đơn giản nhất trong PHP là vòng lặp while cho phép bạn thực thi khối lệnh trong while cho đến khi điều kiện của while là true như cú pháp While (điều kiện) { câu lệnh thực hiện; } - Phát biểu do ... while: tương tự như while nhưng kiểm tra điều kiện sau khi thực hiện khối lệnh. do { câu lệnh thực hiện; } while (điều kiện) - Phát biểu vòng lặp for: tương tự như trong phát biểu while, có thể sử dụng vòng lặp for với 1 giới hạn chỉ định. for (giá trị khởi đầu; điều kiện giới hạn; giá trị lặp của vòng lặp for) { khối lệnh thực hiện; } j) Lưu trữ và truy vấn dữ liệu bằng PHP - Mở file bằng PHP: o fopen(tên file, chế độ mở): mở file o fputs(), fwrite(): ghi file o fclose(): Đóng file o feof(): Nhận giá trị true nếu con trỏ ở cuối file o file_exists(): Kiểm tra file có tồn tại o filesize(): kiểm tra dung lượng của file o unlink(): xóa file Chế độ mở file: Mode Diễn giải R Mở dưới dạng Read-Only r+ Mở dưới dạng Read-Write w Mở dưới dạng Write-Only w+ Mở dưới dạng Write-Read. Nếu file này tồn tại, nội dung sẽ bị xóa, nếu không tồn tại chúng sẽ được tạo ra. a Mở dưới dạng append dữ liệu (write), nếu nội dung tồn tại, bắt đầu cuối cùng của nội dung, dữ liệu sẽ được ghi tiếp phần cuối, trong trường hợp file không tồn tại chúng sẽ được tạo ra. a+ Mở dưới dạng append dữ liệu (write & read), nếu nội dung tồn tại, bắt đầu phần đầu của nội dung, dữ liệu sẽ được ghi tiếp phần đầu, trong trường hợp file không tồn tại chúng sẽ được tạo ra. - Thiết lập kết nối cơ sở dữ liệu Để kết nối cơ sở dữ liệu MySQL, cần cung cấp tên Server hay IP (có thể là localhost) của máy chứa cơ sở dữ liệu MySQL, Username và Password để đăng nhập làm việc trên cơ sở dữ liệu được mở. - Thiết lập kết nối: Int mysql_pcconnect(“serverbname”, “username”, “password”); if(!$db) { echo “Không kết nối được với CSDL”); } hoặc $link = mysql_connect(“servername”, “username”, “password”) or die(“Không kết nối được với CSDL”); - Mở một CSDL: mysql_select_db(“database name”); hoặc mysql_select_db(“database name”, $link); - Đóng kết nối cơ sở dữ liệu: mysql_close(database_connection); - Truy vấn cơ sở dữ liệu: Int mysql_query(string sql); Int mysql_query(string sql, [int db_connect]); Int mysql_query(string database, string sql, [int db_connect]); - Số lượng mẩu tin: mysql_num_rows(); Cho biết số lượng mẩu tin câu truy vấn trả về - Truy vấn dữ liệu: Int mysql_fetch_array($result); Mysql_fetch_object($result); - Dung lượng của tập mẩu tin: int mysql_free_result(int $result); 2. Giới thiệu MySQL 2.1 - MySQL là gì? MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở dành cho máy tính cá nhân. MySQL còn đang trên đà phát triển, nhưng các lệnh cơ bản của SQL có thể thử nghiệm được trên cơ sở dữ liệu MySQL. MySQL là cơ sở dữ liệu được sử dụng cho các ứng dụng Web có quy mô vừa và nhỏ. Tuy không phải là một cơ sở dữ liệu lớn nhưng chúng cũng có trình giao diện trên Windows hay Linux, cho phép người dùng có thể thao tác các hành động liên quan đến cơ sở dữ liệu. Cũng giống như các hệ cơ sở dữ liệu khác, khi làm việc với cơ sở dữ liệu MySQL bạn đăng ký kết nối, tạo cơ sở dữ liệu, quản lý người dùng, phân quyền sử dụng, thiết kế đối tượng Table của cơ sở dữ liệu và xử lý dữ liệu. 2.2 - Nơi cung cấp MySQL? Có thể download tại website www.mysql.com qua mạng Internet phần mềm hệ quản trị cơ sở dữ liệu server/client đến các phần mềm tiện nghi và các phần mềm giao diện đẹp mắt và tiện dụng. 2.3 – Các kiểu dữ liệu trong cơ sở dữ liệu MySQL a) Loại dữ liệu numeric Loại Range Bytes Diễn giải Tinyint -127 ->128 hay 0..255 1 Số nguyên rất nhỏ Smallint -32768 -> 32767 hay 0..65535 2 Số nguyên nhỏ Mediumint -8388608 -> 838860 hay 0..16777215 3 Số nguyên vừa Int -231 -> 231 hay 0..232-1 4 Số nguyên Bigint -263 -> 263 hay 0..264-1 8 Số nguyên lớn Float phụ thuộc số thập phân Số thập phân dạng Single hay Double Float(M,D) ±1.175494351E-38 ±3.40282346638 4 Số thập phân dạng Single Double(M,D) ±1.7976931348623157308 ±2.2250738585072014E-308 8 Số thập phân dạng Double Float(M[,D]) Số chấm động lưu dưới dạng char b) Loại dữ liệu Date and Time Loại Range Diễn giải Date 1000-01-01 Date trình bày dưới dạng YYYY-mm- dd Time 00:00:00 23:59:59 Time trình bày dưới dạng hh:mm:ss DateTime 1000-01-01 00:00:00 9999-12-31 23:59:59 Date và Time trình bày dưới dạng YYY-mm-dd hh:mm:ss TimeStamp[(M)] 1970-01-01 00:00:00 TimeStamp trình bày dưới dạng YYYY-mm-dd hh:mm:ss Year[(2|4)] 1970-2069 1901-2155 Year trình bày dưới dạng 2 số hay 4 số Trình bày đại diện của TimeStamp Loại Hiển thị TimeStamp YYYYMMDDHHMMSS TimeStamp(14) YYYYMMDDHHMMSS TimeStamp(12) YYMMDDHHMMSS TimeStamp(10) YYMMDDHHMM TimeStamp(8) YYYYMMDD TimeStamp(6) YYMMDD TimeStamp(4) YYMM TimeStamp(2) YY (y = năm, m = tháng, d = ngày) c) Loại dữ liệu String Loại Range Diễn giải Char 1-255 ký tự Chiều dài của chuỗi lớn nhất 255 ký tự Varchar 1-255 ký tự Chiều dài của chuỗi lớn nhất 255 ký tự Tinyblob 28-1 Khai báo cho Field chứa kiểu đối tượng nhị phân cỡ 255 ký tự Tinytext 28-1 Khai báo cho Field chứa kiểu chuỗi cỡ 255 ký tự Blob 216-1 Khai báo cho Field chứa kiểu blob cỡ 65535 ký tự Text 216-1 Khai báo cho Field chứa kiểu chuỗi dạng văn bản cỡ 65535 ký tự Mediumblob 224-1 Khai báo cho Field chứa kiểu blob vừa khoảng 16777215 ký tự Mediumtext 224-1 Khai báo cho Field chứa kiểu chuỗi dạng văn bản vừa khoảng 16777215 ký tự Longblob 232-1 Khai báo cho Field chứa kiểu blob lớn khoảng 4294967295 ký tự Longtext 232-1 Khai báo cho Field chứa kiểu blob vừa khoảng 4294967295 ký tự 2.4 – Phát biểu SQL Tạo cơ sở dữ liệu: Create Database Create Phát biểu SQL thao tác dữ liệu - SELECT (truy vấn mẩu tin) - INSERT (Thêm mẩu tin) - UPDATE (Cập nhật dữ liệu) - DELETE (Xóa mẩu tin) a) Phát biểu Select Select From Where [Group by ] [Having ] [Order by ] [Limit fromNumber | To Number] b) Phát biểu Insert Insert into [] Values (data_values) c) Phát biểu Update Update Set =, [=] [where ] d) Phát biểu Delete Delete from Where Một số hàm thông dụng trong MySQL Hàm AVG: Hàm trả về giá trị bình quân của cột hay trường trong câu truy vấn VD: select AVG(Amount) From tblOrder Hàm MIN: Hàm trả về giá trị nhỏ nhất của cột hay trường trong câu truy vấn VD: select MIN(Amount) From tblOrder Hàm MAX: Hàm trả về giá trị lớn nhất của cột hay trường trong câu truy vấn VD: select MAX(Amount) From tblOrder Hàm Count: Hàm trả về số lượng mẩu tin trong câu truy vấn VD: select Count(*) From tblOrder Hàm Sum: Hàm trả về tống các giá trị của trường, cột trong câu truy vấn VD: select SUM(Amount) From tblOrder Hàm CurDate(): hàm trả về ngày, tháng, năm hiện hành của hệ thống VD: select curdate() as ‘Ngay hien tai’ Hàm CurTime(): Hàm trả về giờ phút giây hiện hành của hệ thống VD: select curtime() as ‘Thoi gian’ 3.Giới thiệu về Joomla Joomla! là một hệ quản trị nội dung mã nguồn mở. Joomla! được viết bằng ngôn ngữ PHP và kết nối tới cơ sở dữ liệu MySQL, cho phép người sử dụng có thể dễ dàng xuất bản các nội dung của họ lên Internet hoặc Intranet. Joomla! có các đặc tính cơ bản là: bộ đệm trang (page caching) để tăng tốc độ hiển thị, lập chỉ mục, đọc tin RSS (RSS feeds), trang dùng để in, bản tin nhanh, blog, diễn đàn, bình chọn, lịch biểu, tìm kiếm trong site và hỗ trợ đa ngôn ngữ. Joomla! được phát âm theo tiếng Swahili như là jumla nghĩa là "đồng tâm hiệp lực". Joomla! được sử dụng ở khắp mọi nơi trên thế giới, từ những website cá nhân cho tới những hệ thống website doanh nghiệp có tính phức tạp cao, cung cấp nhiều dịch vụ và ứng dụng. Joomla! có thể dễ dàng cài đặt, dễ dàng quản lý và có độ tin cậy cao. Joomla! có mã nguồn mở do đó việc sử dụng Joomla! là hoàn toàn miễn phí cho tất cả mọi người trên thế giới. 3.1.Lịch sử Joomla! là "sản phẩm anh em" với Mambo giữa tập đoàn Miro của Úc (hãng đang nắm giữ Mambo), với phần đông những người phát triển nòng cốt. Ban đầu công ty Miro của Úc (tiếng Anh: Miro Software Solutions) đã phát triển Mambo theo dạng ứng dụng mã nguồn đóng. Đến tháng 4 năm 2001, công ty đã thông qua một chính sách bản quyền kép, nghĩa là phát hành Mambo theo cả giấy phép GPL. Mọi thứ vẫn tiến triển bình thường cho đến trước khi xảy ra tranh chấp về mặt pháp lý vào năm 2003. Vụ việc dẫn tới ý tưởng Mambo cần phải được bảo vệ bởi một tổ chức phi lợi nhuận. Nhưng những nhà phát triển không hài lòng về cơ cấu của Quỹ tài trợ Mambo. Andrew Eddie, người lãnh đạo nhóm phát triển, trong một lá thư gửi cộng đồng, đã chia sẻ những lo lắng của mình về Quỹ tài trợ Mambo và mối quan hệ của nó tới cộng đồng. Ông viết: "...Chúng tôi cho rằng tương lai của Mambo nên được quản lý, điều chỉnh bởi những yêu cầu của người sử dụng và khả năng của những nhà phát triển. Trong khi đó, Quỹ tài trợ Mambo lại được thiết kế nhằm trao quyền điều khiển cho Miro, một thiết kế ngăn cản sự hợp tác giữa Quỹ tài trợ và cộng đồng...". Bởi vậy vào ngày 17 tháng 8 năm 2005, toàn bộ đội phát triển nòng cốt của Mambo đã rời khỏi dự án trong khi đang làm việc với phiên bản 4.5.3. Nhờ sự trợ giúp của Trung tâm Luật Tự do Phần mềm (Software Freedom Law Center - SFLC), 20 thành viên nòng cốt cũ của Mambo đã thành lập một tổ chức phi lợi nhuận khác lấy tên là Open Source Matters, để hỗ trợ về mặt tổ chức, pháp lý và kinh phí cho dự án mã nguồn mở còn chưa được đặt tên của họ. Cùng lúc đó, nhóm phát triển cũng lập một website lấy tên OpenSourceMatters để phân phối thông tin tới những người sử dụng, những người phát triển, những người thiết kế và cộng đồng Joomla nói chung. Người đứng đầu dự án chính là Andrew Eddie, còn được biết đến với tên gọi "Sếp trưởng" Ngay ngày hôm sau, 1000 người đã gia nhập diễn đàn OpenSourceMatters, hầu hết các bài viết cho diễn đàn đều khuyến khích và đồng tình với hành động của Nhóm Phát triển. Tin trên đã nhanh chóng được đăng tải trên các tạp chí newsforge.com, eweek.com và ZDnet.com. Trong một thông báo của Eddie 2 tuần sau đó, các nhóm đã được tổ chức lại và cộng đồng Joomla! tiếp tục tăng trưởng. Tới ngày 1 tháng 9 năm 2005 tên mới của dự án đã được thông báo cho khoảng 3000 người theo dõi đội Phát triển và đến ngày 16 tháng 9 thì họ cho ra đời Joomla! 1.0. 3.2.Các phiên bản Hiện Joomla! có 2 dòng phiên bản chính: * Joomla! 1.0.x: Phiên bản thế hệ 1 (ổn định) o Phiên bản phát hành đầu tiên: Joomla! 1.0.0 (ngày 15 tháng 9 năm 2005) o Phiên bản phát hành mới nhất: Joomla! 1.0.15 (ngày 22 tháng 2 năm 2008) * Joomla! 1.5.x: Phiên bản thế hệ 2 (ổn định) o Các phiên bản cũ (giai đoạn phát triển): Joomla! 1.5 beta, Joomla! 1.5 RC1, Joomla! 1.5 RC2, Joomla! 1.5 RC3, Joomla! 1.5 RC4 o Phiên bản phát hành mới nhất: Joomla! 1.5.1 (ngày 10 tháng 2 năm 2008 3.3. Ứng dụng - Các cổng thông tin điện tử hoặc các website doanh nghiệp - Thương mại điện tử trực tuyến - Báo điện tử, tạp chí điện tử - Website của các doanh nghiệp vừa và nhỏ - Website của các cơ quan, tổ chức phi chính phủ - Website các trường học - Website của gia đình hay cá nhân CHƯƠNG 3: PHÂN TÍCH HỆ THỐNG Phân tích hệ thống theo nghĩa chung nhất là khảo sát nhận diện và phân định các thành phần của một phức hợp và chỉ ra các mối liên hệ giữa chúng. Theo nghĩa hẹp phân tích hệ thống là giai đoạn 2, đi sâu vào các thành phần của hệ thống. Phân tích hệ thống bao gồm việc phân tích về chức năng xử lý và phân tích về dữ liệu (dữ liệu là đối tượng xử lý) Phân tích hệ thống về xử lý Website giới thiệu sản phẩm Phục vụ khách hàng ( Default ) Phục vụ quản trị ( Administrator ) Tìm kiếm sản phẩm theo yêu cầu Xem theo nhóm sản phẩm Xem thông tin chi tiết từng sản phẩm Quản lý người dùng Quản lý sản phẩm Thống kê về danh mục sản phẩm hiện có Biểu đồ phân cấp chức năng Yêu cầu tìm kiếm Yêu cầu xem thống kê Website giới thiệu sản phẩm công ty KHÁCH HÀNG Nhân viên Xem thông tin Đáp ứng yêu cầu Kết quả thống kê Đáp ứng yêu cầu Kết quả tìm kiếm Yêu cầu cập nhật Biểu đồ mức dữ liệu khung cảnh Yêu cầu xem thông tin Khách hàng Phục vụ khách hàng Phục vụ quản trị Nhân viên Đáp ứng yêu cầu Kết quả tìm kiếm Yêu cầu tìm kiếm Người sử dụng Mặt hàng Loại hàng Đơn vị tính Cập nhật NSD Cập nhật mặt hàng Cập nhật loại hàng Cập nhật đơn vị tính Yêu cầu cập nhật Yêu cầu thống kê Đáp ứng yêu cầu Kết quả thống kê Mô hình quan hệ thực thể liên kết CHƯƠNG 4: THIẾT KẾ CƠ SỞ DỮ LIỆU -Tạo bảng tbl_news -Tạo bảng tbl_kind_news -Tạo bảng tbl_group_news -Tạo bảng tbl_image_news -Tạo bảng tbl_prod_soft_list -Tạo bảng tbl_software CHƯƠNG 5 : GIAO DIỆN CHƯƠNG TRÌNH Trang chủ Trang thông tin sản phẩm Forum của trang web Phần kiểm tra số người view Phần thăm dò ý kiến Giao diện đăng nhập CHƯƠNG 6 : VIẾT CODE 1.Code phần điều khiển module admin <?php class Admin_IndexController extends Zend_Controller_Action { function init() { Zend_Loader::loadClass('Album'); $this->view->baseUrl = $this->_request->getBaseUrl(); $this->view->Moduleadmin= "Module Admin"; } function indexAction() { $this->view->title = "My Albums"; $album = new Album(); $this->view->albums = $album->fetchAll(); } function addAction() { $this->view->addTest = "Test"; $this->view->title = "Add New Album"; if ($this->_request->isPost()) { Zend_Loader::loadClass('Zend_Filter_StripTags'); $filter = new Zend_Filter_StripTags(); $artist = $filter->filter($this->_request->getPost('artist')); $artist = trim($artist); $title = trim($filter->filter($this->_request->getPost('title'))); if ($artist != '' && $title != '') { $data = array( 'artist' => $artist, 'title' => $title, ); $album = new Album(); $album->insert($data); $this->_redirect('/'); return; } else{ echo "artist and title can't be blank"; } } // set up an "empty" album $album = new Album(); $this->view->album = $album->createRow(); // additional view fields required by form $this->view->action = 'add'; $this->view->buttonText = 'Add'; } function editAction() { $this->view->title = "Edit Album"; $album = new Album(); if ($this->_request->isPost()) { Zend_Loader::loadClass('Zend_Filter_StripTags'); $filter = new Zend_Filter_StripTags(); $id = (int)$this->_request->getPost('id'); $artist = $filter->filter($this->_request->getPost('artist')); $artist = trim($artist); $title = trim($filter->filter($this->_request->getPost('title'))); if ($id !== false) { if ($artist != '' && $title != '') { $data = array( artist' => $artist, 'title' => $title, ); $where = 'id = ' . $id; $album->update($data, $where); $this->_redirect('/'); return; } else { $this->view->album = $album->fetchRow('id='.$id); } } } else { // album id should be $params['id'] $id = (int)$this->_request->getParam('id', 0); if ($id > 0) { $this->view->album = $album->fetchRow('id='.$id); } } // additional view fields required by form $this->view->action = 'edit'; $this->view->buttonText = 'Update'; } function deleteAction() { $this->view->title = "Delete Album"; $album = new Album(); if ($this->_request->isPost()) { Zend_Loader::loadClass('Zend_Filter_Alpha'); $filter = new Zend_Filter_Alpha(); $id = (int)$this->_request->getPost('id'); $del = $filter->filter($this->_request->getPost('del')); if ($del == 'Yes' && $id > 0) { $where = 'id = ' . $id; $rows_affected = $album->delete($where); } } else { $id = (int)$this->_request->getParam('id'); if ($id > 0) { // only render if we have an id and can find the album. $this->view->album = $album->fetchRow('id='.$id); if ($this->view->album->id > 0) { // render template automatically return; } } } // redirect back to the album list unless we have rendered the view $this->_redirect('/'); } Code module sản phẩm <?php class CategoryNewsDAO extends Zend_Db_Table { protected $_name; //Contructor function CategoryNewsDAO() { $table = new TableName(); $table->setTableName('tbl_category_news'); $this->_name = $table->getTableName(); } //List all root cate function listAllRoot() { try{ global $db; $db->setFetchMode(Zend_Db::FETCH_OBJ); $sql = "SELECT * FROM ".$this->_name." WHERE nood_id = 0 AND disp = 1 ORDER BY `order` ASC "; $result = $db->fetchAll($sql); return $result; } catch (Zend_Exception $ex) { global $logger; $logger->log('Class: CategoryNews, function: listAll '.$ex->getMessage(), Zend_Log::INFO); throw new ApplicationException(400); } } //List all sub cate function listAllSub($rootId) { try{ global $db; $db->setFetchMode(Zend_Db::FETCH_OBJ); $sql = " SELECT * FROM ".$this->_name." WHERE nood_id=? AND disp = 1 "." ORDER BY `order` ASC"; $where = array($rootId); $result = $db->fetchAll($sql, $where); return $result; } catch (Zend_Exception $ex) { global $logger; $logger->log('Class: CategoryNews, function: listAll '.$ex->getMessage(), Zend_Log::INFO); throw new ApplicationException(400); } } //List all sub cate function getCateById($cId) { try{ global $db; $db->setFetchMode(Zend_Db::FETCH_OBJ); $sql = " SELECT * FROM ".$this->_name." WHERE cid=? AND disp = 1"; $where = array($cId); $result = $db->fetchRow($sql, $where); return $result; } catch (Zend_Exception $ex) { global $logger; $logger->log('Class: CategoryNews, function: listAll '.$ex->getMessage(), Zend_Log::INFO); throw new ApplicationException(400); } } function deleteDBByCId($cid){ try{ global $db, $logger; $db->setFetchMode(Zend_Db::FETCH_OBJ); $where = "cid='$cid'"; return $db->delete($this->_name, $where); } catch (Zend_Exception $ex) { // $logger->log('Class: CmsCatTitle, function: deleteCategoryByCatId '.$ex->getMessage(), Zend_Log::INFO); // throw new ApplicationException(400); } } function insertDB($data=array()){ try{ global $db; return $db->insert($this->_name, $data); } catch (Zend_Exception $ex) { } } function updateDB($data=array(), $cid){ try{ global $db; $db->setFetchMode(Zend_Db::FETCH_OBJ); $where = " cid=$cid "; return $db->update($this->_name, $data, $where); } catch (Zend_Exception $ex) { // $logger->log('Class: CmsCatTitle, function: updateCateTitle '.$ex->getMessage(), Zend_Log::INFO); // throw new ApplicationException(400); } } } Code phần điều khiển module người dùng : <?php class IndexController extends Zend_Controller_Action { function init() { Zend_Loader::loadClass('Album'); Zend_Loader::LoadClass('CategoryProductDAO'); $this->view->baseUrl = $this->_request->getBaseUrl(); $this->view->default= "default"; //banner image $this->view->banner_img = "banner/index_banner.swf"; $this->view->banner_img_type ="swf"; } function indexAction() { $this->view->title = "My Albums"; $album = new Album(); $this->view->albums = $album->fetchAll(); $cat = new CategoryProductDAO(); $this->view->cat = $cat->listAllRoot(); $this->view->catid = $cat->listAllSub(2); } function addAction() { $this->view->addTest = "Test"; $this->view->title = "Add New Album"; if ($this->_request->isPost()) { Zend_Loader::loadClass('Zend_Filter_StripTags'); $filter = new Zend_Filter_StripTags(); $artist = $filter->filter($this->_request->getPost('artist')); $artist = trim($artist); $title = trim($filter->filter($this->_request->getPost('title'))); if ($artist != '' && $title != '') { $data = array( 'artist' => $artist, 'title' => $title, ); $album = new Album(); $album->insert($data); $this->_redirect('/'); return; } else{ echo "artist and title can't be blank"; } } // set up an "empty" album $album = new Album(); $this->view->album = $album->createRow(); // additional view fields required by form $this->view->action = 'add'; $this->view->buttonText = 'Add'; } function editAction() { $this->view->title = "Edit Album"; $album = new Album(); if ($this->_request->isPost()) { Zend_Loader::loadClass('Zend_Filter_StripTags'); $filter = new Zend_Filter_StripTags(); $id = (int)$this->_request->getPost('id'); $artist = $filter->filter($this->_request->getPost('artist')); $artist = trim($artist); $title = trim($filter->filter($this->_request->getPost('title'))); if ($id !== false) { if ($artist != '' && $title != '') { $data = array( 'artist' => $artist, 'title' => $title, ); $where = 'id = ' . $id; $album->update($data, $where); $this->_redirect('/'); //update data and turn back to index page. return; } else { $this->view->album = $album->fetchRow('id='.$id); echo "is Post"; } } } else { // album id should be $params['id'] $id = (int)$this->_request->getParam('id', 0); if ($id > 0) { $this->view->album = $album->fetchRow('id='.$id); } echo "isn't post"; } // additional view fields required by form $this->view->action = 'edit'; $this->view->buttonText = 'Update'; } function deleteAction() { $this->view->title = "Delete Album"; $album = new Album(); if ($this->_request->isPost()) { Zend_Loader::loadClass('Zend_Filter_Alpha'); $filter = new Zend_Filter_Alpha(); $id = (int)$this->_request->getPost('id'); $del = $filter->filter($this->_request->getPost('del')); if ($del == 'Yes' && $id > 0) { $where = 'id = ' . $id; $rows_affected = $album->delete($where); } } else { $id = (int)$this->_request->getParam('id'); if ($id > 0) { // only render if we have an id and can find the album. $this->view->album = $album->fetchRow('id='.$id); if ($this->view->album->id > 0) { // render template automatically return; } } } // redirect back to the album list unless we have rendered the view $this->_redirect('/'); } } Code phần điều khiển module sản phẩm : <?php class productsController extends Zend_Controller_Action { function init() { Zend_Loader:: loadClass('CategoryProductDAO'); Zend_Loader:: loadClass('NewsDAO'); $language = new Zend_Session_Namespace('languages'); $lang = $language->language; $this->view->lang = $lang; $this->view->baseUrl = $this->_request->getBaseUrl(); $this->view->title = "Products"; //banner image $this->view->banner_img = "banner/product_banner"; $this->view->banner_img_type = "swf"; } function indexAction() { $this->view->title = "Product"; $cat = new CategoryProductDAO(); $prod = new NewsDAO(); $prod->set_isProduct(1); //get CatId if ($this->_request->isPost()) { echo "is Post"; Zend_Loader::loadClass('Zend_Filter_StripTags'); $filter = new Zend_Filter_StripTags(); $CatId = (int) $this->_request->getPost('id'); } else { $CatId = (int)$this->_request->getParam('id',$cat->get1stCat(0)); } //Store CatId to show //$this->view->CatId = $CatId; $CurrCat = $cat->getCurrCat($CatId); $this->view->CurrCat = $CurrCat; /* * leftmenu */ $rootCat = $cat->listAllRoot(); $subCat = array(); $this->view->rootCat = $rootCat; foreach ($rootCat as $val) { $result = array(); $result = $cat->listAllSub($val->id); $subCat += array ($val->id => $result); } $this->view->CatMenu = $subCat; /** * main content * [SubCategory List] * [Category Navigation] * [Product List] */ if (is_null($CatId) || (int)$CatId == 0) { //$CatId = the first Category $CatId = $cat->get1stCat(0); } // List all subcat of this category $subCurCat = $cat->listAllSub($CatId); $this->view->subCurCat = $subCurCat; //total products in each subcats $subCatProd = array(); foreach ($subCurCat as $val) { $newItem = array ($val->id => $prod->getCatTotalProds($val->id)); // echo $val->id."=>".$prod->getCatTotalProds($val->id).""; $subCatProd +=$newItem; } //print_r($subCatProd); $this->view->subCurCatProd = $subCatProd; //Category Navigation $CatNavi = $cat->getCatNavigation($CatId); $this->view->CatNavi = $CatNavi; //Product List $prodList = $prod->getAllbyCatId($CatId); $this->view->prodList = $prodList; //show subcategory of CatId. $this->view->action = "index"; } function detailAction() { $cat = new CategoryProductDAO(); $prod = new NewsDAO(); $prod->set_isProduct(1); $this->view->title = "Detail"; if ($this->_request->isPost()) { echo "is Post"; Zend_Loader::loadClass('Zend_Filter_StripTags'); $filter = new Zend_Filter_StripTags(); $CatId = (int) $this->_request->getPost('catid'); $ProdId = (int) $this->_request->getPost('id'); // echo "is posted"; } else { $CatId = (int)$this->_request->getParam('catid'); $ProdId = (int)$this->_request->getParam('id'); // echo "isn't posted"; } // echo 'cattegory id ='. $CatId .'& product id = '. $ProdId; /* * leftmenu */ $rootCat = $cat->listAllRoot(); $subCat = array(); $this->view->rootCat = $rootCat; foreach ($rootCat as $val) { $result = array(); $result = $cat->listAllSub($val->id); $subCat += array ($val->id => $result); } $this->view->CatMenu = $subCat; /** * main content * [SubCategory List] * [Category Navigation] * [Product List] */ //echo $CatId; if (is_null($CatId) || (int)$CatId == 0 || (int)$ProdId == 0 || is_null($ProdId)) { //$CatId = the first Category $CatId = array();//$cat->get1stCat(0); //echo "sdf"; // echo $CatId; // List all subcat of this category $subCurCat = array();//$cat->listAllSub($CatId); $this->view->subCurCat = $subCurCat; //Category Navigation $CatNavi = array();//$cat->getCatNavigation($CatId); $this->view->CatNavi = $CatNavi; //Product List $prodList = array();//$prod->getAllbyCatId($CatId); $this->view->prodList = $prodList; $prodDetail = array(); $this->view->prodDetail = $prodDetail; } else { // List all subcat of this category $subCurCat = $cat->listAllSub($CatId); $this->view->subCurCat = $subCurCat; //total products in each subcats $subCatProd = array(); foreach ($subCurCat as $val) { $newItem = array ($prod->getCatTotalProds($val->id) => $val); $subCatProd +=$newItem; } $this->view->subCurCatProd = $subCatProd; //Category Navigation $CatNavi = $cat->getCatNavigation($CatId); $this->view->CatNavi = $CatNavi; //Product List $prodList = $prod->getAllbyCatId($CatId); $this->view->prodList = $prodList; $prodDetail = $prod->getNewsById($ProdId); $this->view->prodDetail = $prodDetail; } $this->view->action = "detail"; } function selectAction () { $this->view_title="SEelct"; } Code phần module view cho default : render('header.phtml'); ?> escape($this->title); ?> baseUrl ?>/index/add">Add new album baseUrl;?>/news">index baseUrl;?>/products">products Title Artist   <?php foreach ($this->cat as $val) { echo $val->name.''; } ?> <?php foreach ($this->catid as $val) { echo $val->name.''; } ?> albums as $album) : ?> escape($album->title);?> escape($album->artist);?> baseUrl ?>/index/edit/id/id;?>">Edit baseUrl ?>/index/delete/id/id;?>">Delete render('footer.phtml'); ?> TÀI LIỆU THAM KHẢO Các website: 1.. 2.. 3. Tài liệu 1. MySQL /PHP Database Applications 2. Building website with Joomla 3. Xây dựng ứng dụng web bằng PHP & MySQL (Phạm Hữu Khang) 4. Hướng dẫn thiết kế trang web tương tác bằng Javascript (Nguyễn Trường Sinh)

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

  • doc11123.doc