Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 12
  1. #1
    Tham gia
    23-12-2003
    Bài viết
    75
    Like
    0
    Thanked 0 Times in 0 Posts

    Cach phân trang trong PHP

    Chào các bạn, tớ xin giới thiệu một cách đơn giản để phân trang trong PHP.
    Giả sử ta có một CSDL là test với 1 bảng test bao gồm:
    1. Trường id( auto_increment)
    2. Trường name (varchar)
    3. Trường address (varchar)
    Câu lệnh truy vấn để hiển thị từng trang là:
    select * from test limit $s,$p;
    Trong đó $s là số thứ tự đầu tiên của trang thứ n, còn $p là số bản ghi hiển thị trong mỗi trang. Các bạn chú ý là số thứ tự bản ghi bắt đầu từ 0 (chứ không phải là 1)
    Ví dụ: để view trang thứ 1 với số bản ghi là 5 thì câu lệnh là:
    select * from test limit 0,5;
    Đây là code phân trang. Có gì các bạn góp ý cho tớ.
    PHP Code:
    <?php
      
    //connect den server va co so du lieu
      
    mysql_connect("localhost","admin","admin") or die(mysql_error());
      
    mysql_select_db("test") or die(mysql_error());
      
    //-------------------------------------------------
      
    $qr=mysql_query("select * from test");//query den bang co ten la: test trong CSDL
      
    $n_record=mysql_num_rows($qr);//so ban ghi cua bang
      
    $p=5;//so bang ghi trong 1 trang can hien thi
      
      //-------Ham tinh so trang-------------------------
      
    function num_page()
      {
        global 
    $n_record;//lay bien toan cuc
        
    global $p;
        if(
    $n_record%$p==0)
        {
          
    $n_page=$n_record/$p;
          return 
    $n_page;
        }
        else
        {
          
    $n_page=($n_record-($n_record%$p))/$p+1;
          return 
    $n_page;
        }
      }
      
    //-------------------------------------------------
      
    function view_page()
      {
        global 
    $n_record;
        for(
    $i=1;$i<=num_page();$i++)
        {
          echo 
    "<a href='pages.php?n=".$i."'>".$i."</a><";
        }
        echo 
    "<a href='pages.php?n=all'>All</a>";
      }
      
    //-------------------------------------------------
      
    echo "<br>";
      
    $n=$HTTP_GET_VARS***91;'n'***93;;//lay bien n tren trinh duyet
      
    $s=($n-1)*$p//thu tu cua bang ghi tai trang thu n
      
    if ($n!='all')
      {
        
    $qr1=mysql_query("select * from test limit $s,$p") or die (mysql_error());
      }
      else
      {
        
    $qr1=mysql_query("select * from test");
      }
      
    //--------Hien thi bang-----------------------------
      
    view_page();
      echo 
    "<table border=1 width=100%>";
      while(
    $row=mysql_fetch_array($qr1))
      {
        echo 
    "<tr>";
          echo 
    "<td>".$row***91;'id'***93;."</td>";
          echo 
    "<td>".$row***91;'name'***93;."</td>";
          echo 
    "<td>".$row***91;'address'***93;."</td>";
        echo 
    "</tr>";
      }
      echo 
    "</table>";
      
    view_page();
    ?>
    Được sửa bởi bpmtri lúc 15:54 ngày 05-01-2004
    Quote Quote

  2. #2
    Tham gia
    03-12-2003
    Location
    bai rac
    Bài viết
    443
    Like
    0
    Thanked 0 Times in 0 Posts
    có phép chia thì kết quả có thể là float, nên chuyển sang integer thì hay hơn
    PHP Code:
    function num_page() {
       global 
    $n_record;//lay bien toan cuc
       
    global $p;
       
    $n_page = ($n_record%$p) ? ($n_record/$p 1) : ($n_record/$p);
       
    $n_page = (int) ($n_page);
       return 
    $n_page;

    Được sửa bởi bpmtri lúc 15:55 ngày 05-01-2004

  3. #3
    Tham gia
    23-12-2003
    Bài viết
    75
    Like
    0
    Thanked 0 Times in 0 Posts
    Không bao giờ là float bạn ạ. Xem kỹ lại đi
    PHP Code:
    if($n_record%$p==0)
    {
    $n_page=$n_record/$p;
    return 
    $n_page;
    }
    //nếu $n_record chi hết cho $p thì: chia
    -> kết quả là nguyên(vì chia hết)
    else
    {
    $n_page=($n_record-($n_record%$p))/$p+1;
    return 
    $n_page;

    //nếu không thì lấy $n_record trừ đi phần dư của $n_record khi chia cho $p. Kết quả trả về phải chia hết cho $p-> khi chia cho $p kết quả sẽ là nguyên.
    Được sửa bởi bpmtri lúc 15:56 ngày 05-01-2004

  4. #4
    Tham gia
    19-07-2003
    Location
    Biên Hòa
    Bài viết
    499
    Like
    0
    Thanked 1 Time in 1 Post
    $n_page = floor(($n_record+$p-1)/$p);
    cần gì viết nguyên 1 hàm

  5. #5
    Tham gia
    26-02-2007
    Bài viết
    15
    Like
    0
    Thanked 0 Times in 0 Posts
    dùng ceil làm tròn cũng đc mà, mà bài trên bạn làm thế có vẻ hơi phức tạp, đơn gian 1 chút đi.

  6. #6
    Tham gia
    18-11-2008
    Bài viết
    400
    Like
    0
    Thanked 0 Times in 0 Posts
    À, em có một câu hỏi liên quan mong mọi người chỉ giúp!
    Ví dụ ỡ trường hợp ta có 100 kết quả trả về, ta muốn mổi trang chỉ hiễn thị 20 kết quả vị chi ta có 5 trang!
    Trong mổi trang, tương ứng với mổi kết quả ta có một check box hay một nút radio.
    Câu hỏi ở đây đặt ra rà nếu người dùng đầu thoạt đầu đả chọn một số kết quả rồi qua những trang khác chọn tiếp, chọn xong thì quay lại xem, xem xong thì đi chọn tiếp, chừng nào chán thì nhấn submit... Bằng cách nào em lưu trữ được tất cả kết quả mà người ta đả chọn!?
    Giúp em với nha!

  7. #7
    Tham gia
    18-05-2007
    Bài viết
    24
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi nvcnvn View Post
    À, em có một câu hỏi liên quan mong mọi người chỉ giúp!
    Ví dụ ỡ trường hợp ta có 100 kết quả trả về, ta muốn mổi trang chỉ hiễn thị 20 kết quả vị chi ta có 5 trang!
    Trong mổi trang, tương ứng với mổi kết quả ta có một check box hay một nút radio.
    Câu hỏi ở đây đặt ra rà nếu người dùng đầu thoạt đầu đả chọn một số kết quả rồi qua những trang khác chọn tiếp, chọn xong thì quay lại xem, xem xong thì đi chọn tiếp, chừng nào chán thì nhấn submit... Bằng cách nào em lưu trữ được tất cả kết quả mà người ta đã chọn!?
    Giúp em với nha!
    Bạn dùng cookie nhé, kết hợp với javascript nữa.

    http://www.google.com.vn/search?q=ja...ient=firefox-a

  8. #8
    Tham gia
    21-09-2008
    Bài viết
    22
    Like
    0
    Thanked 0 Times in 0 Posts
    Code của bạn có lỗi gì kô mà sao mình chạy nó cứ báo lỗi hoài

  9. #9
    Tham gia
    18-11-2008
    Bài viết
    400
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi uoon View Post
    Bạn dùng cookie nhé, kết hợp với javascript nữa.

    http://www.google.com.vn/search?q=ja...ient=firefox-a
    Cám ơn bạn lắm, nhưng cho mình hỏi thêm, có cách nào khác như là dùng session(phòng trường hợp người dùng không cho phép để lại cookies).
    Nếu có ai bik thì trình bày thuật toán bằng lời giùm mình ha!

  10. #10
    Tham gia
    25-03-2008
    Bài viết
    235
    Like
    0
    Thanked 2 Times in 2 Posts
    Quote Được gửi bởi cathangtu View Post
    Chào các bạn, tớ xin giới thiệu một cách đơn giản để phân trang trong PHP.
    Giả sử ta có một CSDL là test với 1 bảng test bao gồm:
    1. Trường id( auto_increment)
    2. Trường name (varchar)
    3. Trường address (varchar)
    Câu lệnh truy vấn để hiển thị từng trang là:
    select * from test limit $s,$p;
    Trong đó $s là số thứ tự đầu tiên của trang thứ n, còn $p là số bản ghi hiển thị trong mỗi trang. Các bạn chú ý là số thứ tự bản ghi bắt đầu từ 0 (chứ không phải là 1)
    Ví dụ: để view trang thứ 1 với số bản ghi là 5 thì câu lệnh là:
    select * from test limit 0,5;
    Đây là code phân trang. Có gì các bạn góp ý cho tớ.
    PHP Code:
    <?php
      
    //connect den server va co so du lieu
      
    mysql_connect("localhost","admin","admin") or die(mysql_error());
      
    mysql_select_db("test") or die(mysql_error());
      
    //-------------------------------------------------
      
    $qr=mysql_query("select * from test");//query den bang co ten la: test trong CSDL
      
    $n_record=mysql_num_rows($qr);//so ban ghi cua bang
      
    $p=5;//so bang ghi trong 1 trang can hien thi
      
      //-------Ham tinh so trang-------------------------
      
    function num_page()
      {
        global 
    $n_record;//lay bien toan cuc
        
    global $p;
        if(
    $n_record%$p==0)
        {
          
    $n_page=$n_record/$p;
          return 
    $n_page;
        }
        else
        {
          
    $n_page=($n_record-($n_record%$p))/$p+1;
          return 
    $n_page;
        }
      }
      
    //-------------------------------------------------
      
    function view_page()
      {
        global 
    $n_record;
        for(
    $i=1;$i<=num_page();$i++)
        {
          echo 
    "<a href='pages.php?n=".$i."'>".$i."</a><";
        }
        echo 
    "<a href='pages.php?n=all'>All</a>";
      }
      
    //-------------------------------------------------
      
    echo "<br>";
      
    $n=$HTTP_GET_VARS***91;'n'***93;;//lay bien n tren trinh duyet
      
    $s=($n-1)*$p//thu tu cua bang ghi tai trang thu n
      
    if ($n!='all')
      {
        
    $qr1=mysql_query("select * from test limit $s,$p") or die (mysql_error());
      }
      else
      {
        
    $qr1=mysql_query("select * from test");
      }
      
    //--------Hien thi bang-----------------------------
      
    view_page();
      echo 
    "<table border=1 width=100%>";
      while(
    $row=mysql_fetch_array($qr1))
      {
        echo 
    "<tr>";
          echo 
    "<td>".$row***91;'id'***93;."</td>";
          echo 
    "<td>".$row***91;'name'***93;."</td>";
          echo 
    "<td>".$row***91;'address'***93;."</td>";
        echo 
    "</tr>";
      }
      echo 
    "</table>";
      
    view_page();
    ?>
    Có quá nhiều góp ý cho bạn hiền đây:

    - Biến $n_record phải dùng câu query "select count(*) from test" (như bạn @vothanhtamit đã nói)

    - Hàm num_page viết phức tạp quá, chỉ cần dùng $n_page = ceil(count($n_record)/$p) là đủ

    - Việc dùng global $n_record là không ổn, vì trong trường hợp một trang của mình có hai chỗ cần phân trang thì code của bạn không dùng được.

    - Code cần tổ chức lại để dễ nhìn và có tính sử dụng lại.

    - ... vẫn còn nhiều vấn đề khác nữa

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •