Hướng dẫn làm web bán hàng bằng code php

Hướng dẫn làm web bán hàng bằng code php

Mặc dù các CMS mã nguồn mở như WordPress, Joomla,… đã trở nên phát triển và giúp việc xây dựng website trở nên chuyên nghiệp hơn. Tuy nhiên vai trò của việc lập trình thuần vẫn rất quan trọng. Khi mã nguồn có nhiều người dùng thì cấu trúc của nó cũng có thể nhiều người biết đến khiến tính bảo mật website trở nên kém hơn. Đó là lý do mà rất ít các trang báo lớn hay các trang thương mại lớn họ không sử dụng CMS. Trong bài viết này mình sẽ chia sẻ với bạn cách viết một trang web bằng ngôn ngữ PHP.

Tạo database và cấu trúc folder

Trong hướng dẫn này mình chỉ hướng dẫn tạo ra một trang web đơn giản. Vì thế nên  CSDL mình sẽ tạo ra 3 bảng đơn giản như sau:

Bảng user: lưu trữ thông tin đăng nhập của người dùng

Với bảng trên mình sẽ tạo ra 4 trường lần lượt là:

  • id_user: có kiểu int, thuộc tính tự tăng AUTO_INC…và nó là trường khóa chính.
  •  username: sẽ lưu tài khoản đăng nhập của người dùng. Mình để đại kiểu text, bạn có thể để kiểu varchar vì nó thường không chứa dấu và ký tự giới hạn.
  • pass: thì dùng để lưu mật khẩu và mình cũng để tương tự trường username.
  • name: trường để lưu tên của user.

Bảng category: Lưu trữ các danh mục của bài viết

Mình sẽ tạo 4 trường cho bảng này như sau:

  •  id_cat: có kiểu int, thuộc tính tự tăng AUTO_INC…và nó là trường khóa chính.
  • name_cat: lưu tên của danh mục, có kiểu text.
  • slug_cat: lưu lại tên không dấu, không khoảng cách của danh mục để làm đường dẫn thân thiện sau này.
  • status: đánh dấu trạng thái của danh mục, dùng kiểu tinyint.

Bảng post: Lưu các thông tin về một bài đăng.

Các trường của bảng này như sau:

  • id_post: có kiểu int, thuộc tính tự tăng AUTO_INC…và nó là trường khóa chính.
  •  id_cat: id của danh mục. Thật ra thiết kế như thế này chưa hoàn toàn đúng, vì một bài đăng có thể ở trong nhiều danh mục, nên quan hệ của nó là N-N tuy nhiên ở đây mình chỉ thiết kết cơ bản kiểu 1 bài đăng chỉ có 1 danh mục thôi.
  • id_user: id của user tạo bài post.
  • title: tiêu đề của bài post
  • description: mô tả của bài post
  • content: nội dung của bài post
  • slug_post: tương tự slug_cat.
  • status: trạng thái của bài post
  • date: ngày đăng bài post.

Như vậy mình đã có Database rồi. Các bảng này mình thiết kế đơn giản, không theo chuẩn và mình cũng không phân tích kỹ. Nếu các bạn làm một dự án nghiêm túc mình khuyên các bạn nên bỏ thời gian để nghiên cứu kỹ về CSDL vì nó ảnh hưởng rất nhiều sau này. Và bây giờ chúng ta sẽ tiến hành xây dựng cấu trúc folder cho website.

Cấu trúc này thường không giống với những gì bạn đã học ở trường vì ở đây mình muốn mọi Request của người dùng chỉ thông qua một file duy nhất là index.php. Điều này cũng thông dụng với hầu hết các CMS hiện nay.

Mục admin tạm thời chưa quan tâm, bạn cứ xem nó như một website khác đi. Mục public là mục mình sẽ chứa toàn bộ các file như css, js, img,… nói chung là những file mà người dùng có thể truy cập trực tiếp. Mục site sẽ chứa những file xử lý như các action, database, widget,…..

Các mũi tên màu đỏ chỉ các yêu cầu của người dùng. Khi họ đưa ra một yêu cầu đến 1 action nào đó nó sẽ gọi đến các widget để hoàn thành giao diện và trả lại cho file index hiển thị (đường màu xanh).

 Tạo các action trong PHP:

Đầu tiên mình cần lấy biến action trong file index. Bạn mở file index và code như sau:

kết quả bạn nhận được sẽ là một từ post. Bây giờ chúng ta đã biết được chúng ta cần xử lý một action post. Code đoạn sau vào file index.php.

Đầu tiên mình sẽ tạo ra một biến $path để lưu đường dẫn đến cái file action cần xử lý. Sau đó thì mình sẽ kiểm tra xem file đó có tồn tại hay không. Và mình sẽ sử dụng hàm require để require file đó vào. Cũng với đường dẫn  bạn mở file post.php trong thư mục action và thêm vào dòng bất kỳ, F5 lại bạn sẽ thấy kết quả.

Tương tự như vậy, nếu gọi ?action=cat thì nó sẽ gọi vào file cat.php. Và nếu không có biến action thì mặc định nó sẽ require action home. Bạn có thể thêm một file 404.php trong action để thay thế cho cái echo nếu action tìm là không thấy.

Thông thường thì hàm isset($_GET[‘action’]) ? $_GET[‘action’] : false; sẽ được sử dụng rất nhiều nên mình sẽ tạo ra một hàm và chỉ truyền key vào thôi. Bây giờ bạn mở file site.php trong thư mục sys ra và code đoạn sau vào, Mình tạo luôn cả việc lấy biến post nhé.

Cuối cùng bạn chỉnh sửa lại file index như thế này

Các mục ở trên mình đã chú thích lại rồi đấy. Tiếp theo mình sẽ đưa các Widget vào các action.  Công việc này cũng đơn giản như việc viết theme cho WordPress vậy.

Các hàm này đơn giản chỉ là require vào các widget tương ứng, trong hàm content mình cần truyền tên content để xác định là content nào

Vậy là xong trang chủ. bạn muốn design cho nó thì mở từng widget lên để chỉnh sửa nhé, Nó tương tự như cắt html cho theme WordPress vậy.

Nó sẽ đưa về trang index nếu hằng syspath chưa tồn tại. Thật ra bạn không cần thêm vào các file widget đâu. Như vậy chúng ta có được một cấu trúc folder rồi. Bây giờ mình sẽ làm việc với CSDL để lấy dữ liệu lên các action và widget.

Hàm lấy danh sách dữ liệu:

Để tiện cho việc lấy một loạt dữ liệu, mình sẽ tạo một hàm lấy danh sách dữ liệu với đoạn code như sau:

  • Đây là hàm bắt buộc truyền tham số. Tham số ở đây là một câu
  • Đầu tiên là sử dụng hàm openconnect; để mở kết nối đến database.
  • Sử dụng mysqli_query để truy vấn dữ liệu và lưu vào biến $result.
  • Hoàn thành truy vấn thì dùng hàm closeconnect; để đóng kết nối.
  • Dùng hàm if kiểm tra thử nếu biến $result lỗi có thể cho dừng.
  • Tiếp theo khai báo một biến $list là một kiểu mảng.
  • Sử dụng hàm lặp while để đưa các kết quả từng dòng của $result về một biến. $row. fetch_assoc là một lệnh để mình lấy ra một mảng đa chiều, nó là một đối tượng.
  • Từng dòng một sẽ được insert vào mảng $list.
  • Sử dụng hàm mysqli_free_resul để giải phóng bộ nhớ.
  • Cuối cùng là trả về danh sách đó là biến $list.

 Hàm lấy 1 dòng dữ liệu:

Ngoài việc lấy ra một tệp danh sách thì mình cũng sẽ tạo ra một hàm để lấy 1 dòng dữ liệu. Mặc dù có thể dùng chung hàm. nhưng mà mình đưa ra như thế này để hàm lặp đỡ phải sử dụng nhiều do truy vấn 1 dòng thường rất phổ biến.

Không khác gì với hàm ở trên nên minh không giải thích lại. ở đây bạn chỉ cần thay cái hàm lặp thành một biến $row và nhét dữ liệu vào, sau đó là return nó về là đủ.

Hàm thêm dữ liệu:

Đây là hàm chắc chắn sẽ viết rồi. hàm này mình đã tối ưu rất kỹ bao gồm việc bảo vệ cho đoạn query tránh bị lỗi hoặc cố tình gây phá hoại bằng phương pháp SQL Injection. Hàm này được code như sau.

  • Đầu tiên bạn khởi tạo hàm insert_data và cho phép truyền vào hai tham số là tên bảng (biến $table) và dữ liệu là một mãng (biến $data).
  • Trước khi thao tác với CSDL bạn nên mở kết nối đến nó. Mình sẽ gọi hàm mở kết nối đã viết. openconnect
  • Tiếp theo bạn cũng gọi biến $conn vào, nhưng nhớ thêm global.
  • Mình sẽ tạo ra hai biến là $field và $values để lưu giá trị lặp trong biến $table.
  • Bây giờ thì sẽ lặp cái $data để lấy ra các $key và $val. Biến mảng mình truyền vào là một mảng liên hợp.
  • Trong hàm lặp mình sẽ nối các $key lại và được ngăn cách bởi dấu “,” đưa vào biến $field. các cái $val sẽ được nối lại và cũng được ngăn cách bởi đấu “,” đưa vào biến $values. Ở đây mình sử dụng hàm mysqli_real_escape_string để khử đi các ký tự gây nhầm lẫn trong câu lệnh SQL. Đây là điểm mấu chốt của việc chống SQL Injection.
  • Tiếp theo tạo một biến $cmd để lưu chuỗi lệnh cmd được nối vào từ các thông tin đã lưu trên. Hàm trim trên là để loại bỏ đi dấu “,” dư ở mỗi biến lúc trên mình nối.
  • Đưa biến chuỗi $cmd vào lệnh mysqli_query để thực thi và trả về kết quả.
  • Cuối cùng là gọi hàm closeconnect  để đóng kết nối sau khi thực thi.

Hàm sửa dữ liệu:

Điều kiện truyền vào ở hàm sửa nhiều hơn rất nhiều so với hàm thêm, bở hàm cần xác định được đối tượng cần sửa. Để dễ hiểu các bạn hãy xem hàm sau.

  • Với hàm này bạn sẽ cần truyền thêm hai tham số vào là $idfield và $idvalue ngoài $table và $data. Mình sẽ giải thích kỹ hơn ở phần test các hàm.
  • Mình sẽ không nói đến các phần lặp lại. Ở đây mình tạo ra một biến $set và dùng hàm lặp tương tự bên trên để ghép các $key và $val thành chuỗi đưa vào biến $set
  • .Tiếp theo tạo biến $cmd và chèn các biến vào đúng cú pháp của một câu Update. Ở câu này có một điều kiện where và bạn hãy đưa $idfield và $idvalue vào.
  • Các phần cuối này tương tự câu ở trên.

Hàm xóa dữ liệu:

Đây là hàm cuối cùng trong các hàm thực thi dữ liệu, và nó cũng là hàm ngắn ngọ nhất. Code của hàm như sau:

  • Ở hàm này mình chỉ cần vào $table, $idfield và $idvalue.
  • Nhìn code trên bạn sẽ hiểu vì nó có tất cả những cái hàm trên nên mình không giải thích thêm về hàm này

Hàm đếm dữ liệu:

Đây là hàm mình bổ sung thêm để lấy số liệu hàng trả về. Số này sẽ được dùng để phân trang sau này.

  • Hàm này mình đưa vào câu lệnh select count (biến $cmd) và biến ($counts) là tên trường AS mình đặt trong câu cmd. Mình sẽ giải thích kỹ hơn trong phần sau.

Kiểm tra thử các hàm:

Khi viết xong hàm, bạn nên test nó để biết chắn chắn nó hoạt động nhé. Bây giờ mở file home.php trong thư mục action lên và tiến hành code để test từng đoạn như sau. Lưu ý là bạn phải kết nối đến CSDL rồi nhé. Nếu chưa được thì bạn xem lại phần 1.

Bạn cần require cái file data.php vào để kết nối CSDL.

Kiểm tra lấy 1 dòng dữ liệu

Câu này đơn giản là gọi hàm select_row và truyền vào một câu lệnh select và gán hàm này cho biến $list để lấy dữ liệu. Thật ra đây là câu lệnh mình demo thôi. Thường thì bạn phải có where để lấy chính xác hơn. Câu này chỉ trả về một hàng dữ liệu đầu tiên.

Để hiển thị cấu trúc của biến $list đang lưu, mình sử dụng lệnh var_dump.

Hàm lấy danh sách dữ liệu tương tự nên mình không kiểm tra nữa

Kiểm tra hàm them dữ liệu:

Đầu tiên cần tạo ra biến $data để lưu mãng dữ liệu bao gồm trường bạn cần insert và giá trị của trường đó.

Tiếp theo thì chỉ việc sẻ dụng nó như hàm trên, chỉ khác là bạn cần truyền vào tên bảng trong csdl và biến dữ liệu $data.

Kiểm tra hàm sửa dữ liệu:

Tương tự hàm thêm dữ liệu, hàm này mình chỉ cần truyền thêm vào hàm tên trường khóa chính và id cần sửa.

Kiểm tra hàm xóa dữ liệu:

Hàm này rất đơn giản, bạn chỉ cần truyền vào tên bảng (user), tên trường id (id_user) và id cần xóa là được.

Kiểm tra hàm lấy số dòng dữ liệu:

Hàm này bạn cần truyền vào một câu lệnh Select count(*). As là bạn đặt tên cho trường này. Giả sử mình đặt num thì biến truyền bên kia mình sẽ truyền là num.

vietseo

Comments are closed.
0917212969