Hướng dẫn viết một website PHP căn bản từ A-Z (p1)

Hướng dẫn viết một website PHP căn bản từ A-Z (p1)

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. Tuy nhiên trước khi bạn đọc bài này mình khuyên bạn nên đọc 2 phần về lập trình PHP cơ bản trên web mình để hiểu về PHP trước đã nhé.

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.
    • Mình bổ sung thêm một trường là thubnail nhé, để lưu đường dẫn hình ảnh đại diện. Mình quên mất.

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:

<?php
   $action = isset($_GET['action']) ? $_GET['action'] : false;
?>

biến này được lấy ở đâu?, chính là trên URL của browser. Bạn thử gõ vào đường dẫn: http://localhost/hocphp/?action=post. Sau đó thêm đoạn echo trong file index.php như sau:

echo $action;

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.

<?php
  $action = isset($_GET['action']) ? $_GET['action'] : false;

   $path = 'site/action/'.$action.'.php';
   if(file_exists($path))
  {
     require($path);
  }
  elseif($action == false){
     require('site/action/home.php');
 }
 else{
    require('site/action/404.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 http://localhost/hocphp/?action=post 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é.

<?php
   function get_input($key){
      return isset($_GET[$key]) ? $_GET[$key] : false;
   }
   function post_input($key){
      return isset($_POST[$key]) ? $_POST[$key] : false;
   }
?>

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

<?php
   define ('SYSPATH','sys/'); //tạo ra một hằng để lưu cố định đường dẫn đến mục sys.
   require (SYSPATH.'site.php'); // require vào site.php trong thư mục sys.
 
   $action = get_input('action'); // lấy biến action sử dụng hàm get_input trong site.php
 
   $path = 'site/action/'.$action.'.php';
   if(file_exists($path))
   {
      require($path);
   }
   elseif($action == false){
      require('site/action/home.php');
   }
   else{
      require('site/action/404.php');
   }
?>

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. Bây giờ bạn tiếp tục mở file site.php và viết các hàm như sau:

 function head()
 {
   require('site/widget/header.php');
 }

 function footer()
 {
   require('site/widget/footer.php');
 }

 function content($name)
 {
   require('site/widget/'.$name.'-content.php');
 }

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. Bây giờ bạn có thể mở file home.php ở file action và gõ đoạn sau vào.

<?php 
   head();
   content('home');
   footer();
?>

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.

Bổ sung: tuy nhiên bây giờ nếu bạn truy cập thẳng vào các file như thế này “http://localhost/hocphp/site/action/cat.php” sẽ sinh ra lỗi ngay. lý do là hằng SYSPATH mình khai báo ở file index.php, nhưng  khi truy cập thẳng thì nó không thông qua file này và hằng SYSPATH không được khởi tạo. Để khắc phục điều này trong file action và widget mình sẽ thêm đoạn này vào đầu.

if (!defined ('SYSPATH')) header("Location:../../index.php");

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.

Xem tiếp phần 2 tại đây: Hướng dẫn viết một website PHP căn bản từ A-Z (p2)

Các bài liên quan

Tuấn ĐC

Tuấn ĐC

Tôi thích tự do, làm những gì mình thích, thích đi nhiều nơi và học được nhiều thứ.

Liên hết bài viết: ""