10/10/2018, 09:54

Sửa hộ em code phân trang

- Chào các bác Pro, em mới học php và đang làm cái phân trang đơn giản, em lấy code trên diễn đàn mình, tuy code dài nhưng dễ hiểu vì nó nói trình tự, tuy nhiên em cũng làm giống hệt thế, em chỉ copy pase nhưng không hiểu sao nó báo lỗi ở dòng while khi mình cho lặp để lấy CSDL ra hiển thị
- Đây là code các bác xem sai chỗ nào nói hộ em nhé, nó chỉ sai chỗ while thôi.Thanks

<?php

$qr=mysql_query("select * from th");//query den bang co ten la: th 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='themCSDL.php?n=".$i."'>".$i."</a>";
}
echo "<a href='themCSDL.php?n=all'>All</a>";
}
//-------------------------------------------------
echo "<br>";
$n=$_POST['n'];//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 th limit $s,$p");
}
else
{
$qr1=mysql_query("select * from th");
}
//--------Hien thi bang-----------------------------
view_page();
echo "<table border='1' width='100%'>";
while($row=mysql_fetch_array($qr1))
{
$ten=$row["ten"];
$ma=$row["ma"];
echo "<tr>";
echo "<td>$ten</td>";
echo "<td>$ma</td>";
echo "</tr>";

}
echo "</table>";
view_page();
?>
/////////////////////

đây là đoạn mà nó báo lỗi không hiển thị ra được
while($row=mysql_fetch_array($qr1))
{
$ten=$row["ten"];
$ma=$row["ma"];
echo "<tr>";
echo "<td>$ten</td>";
echo "<td>$ma</td>";
echo "</tr>";

}
hoangcn02 viết 12:08 ngày 10/10/2018
Nó in ra lỗi gì? Bỏ lên đây mọi người xem thử
Có thể là chạy sai câu sql hoặc dl rỗng roài
1n1 viết 11:54 ngày 10/10/2018
có khả năng là chưa có dữ liệu đấy chứ, cú pháp lệnh thấy ổn mà
thuyduongcd viết 12:02 ngày 10/10/2018
chỗ này không ổn
Code:
$n_page=($n_record-($n_record%$p))/$p+1;
thanhit_humg viết 12:03 ngày 10/10/2018
Cảm ơn các bác đã tham gia ý kiến cho em
Tất cả CSDL đã có hết, nói chung cái cơ bản đấy chắc các bác không phải lo
Đây là câu báo lỗi khi em chạy trên trình duyệt, em thấy code như thế là đúng, nhưng không hiểu sao lại thế, mong các bác giúp đỡ.


Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\www\tenma\themCSDL.php on line 100

Dòng 100 là dòng mà em bắt đầu khi báo lệnh while()

[=========> Bổ sung bài viết <=========]

Mong bác thuyduongcd nói rõ hơn hộ em chỗ nó lỗi
$n_page=($n_record-($n_record%$p))/$p+1;
được không ạ, em thấy chỗ đó vẫn ổn chứ nhỉ, nó in ra được số trang mình mong muốn "123All" rồi, em nghĩ ở đây nó chỉ sai chỗ là lấy CSDL ra trình duyệt mà thôi, các lệnh khác em nghĩ là tốt rồi.Vì nó chỉ báo sai cái chổ lệnh while()
Mong bác chỉ giáo thêm
thuyduongcd viết 12:04 ngày 10/10/2018
Code:
$n_page=($n_record-($n_record%$p))/$p+1;
Giả sử DB có 15 record ($n_record=15)
Khi đó $n_page=(15-(15%5))/5 +1 = 4
Trong khi thực tế chỉ có 3 trang thôi. => trang 4 không có mẫu tin nào
Vậy nếu hiển thị trang 4 thì sẽ không truy vấn được mẫu tin nào cả ($qrl=null). Vì vậy khi gọi hàm này mysql_fetch_array() với tham số $qrl (ở dòng thứ 100)sẽ sinh ra lỗi như trên.

Khắc phục: Thay dòng đó bằng cái này:
Code:
$n_page=ceil($n_record/$p)
thanhit_humg viết 12:07 ngày 10/10/2018
Em thay code của bác rồi nhưng vẫn không được bác thuyduongcd à. nó vẫn thế.
theo em bác tính như trên cũng không đúng, nếu sai thì đây phải sai cái chỗ không đưa nó về int thì đúng hơn.
nếu như bác nói Giả sử DB có 15 record ($n_record=15)
Khi đó $n_page=(15-(15%5))/5 +1 = 3,4
cái này không thể bằng 4 được, nếu đúng ra theo em nghĩ nên ép thành kiểu int thì nó sẽ được là 3, em đã ép kiểu và cho echo ra $n_page=3, như vậy mới đúng.
Nhưng vấn đề là nó vẫn chưa chạy được.
Mong bác giúp để thêm.
thuyduongcd viết 12:05 ngày 10/10/2018
% là phép chia lấy phần dư. Như biểu thức trên 15-(15%5)/5+1
15%5=0. Vậy thì kết quả là 4 chứ sao lại 3,4?

Còn muốn sửa lỗi thì phải debug từng bước
Chẳng hạn như chỗ này:
Code:
$qr1=mysql_query("select * from th limit $s,$p");
nên thay nó bằng
Code:
//$qr1=mysql_query("select * from th limit $s,$p");
$sql="select * from th limit $s,$p";
ẹcho $sql;
Mục đích là cho nó echo cái câu sql ra, sau đó copy cái câu này paste vô phpmyadmin thực thi xem kết quả ra có đúng ý không. Thử với nhiều giá trị n khác nhau xem câu sql nó ra thế nào
thanhit_humg viết 12:02 ngày 10/10/2018
Em cảm ơn bác thuyduongcd rất nhiều, cảm ơn bác đã tham gia vào bài của em!
Em sửa lại được rồi, em sửa trong dòng $n=$_POST['n']; cho nó là GET mới đúng, nó lấy qua url, ở đây POST không được
Còn câu lệnh bác nói là đúng nhưng ở đây em nhầm, nó có thêm 1 trang nữa đó là ALL, vì vậy nó mới có 4 trang
Cảm ơn bác nhiều nhé, chúc bác thành công và hạnh phúc trong con đường đi làm "Thiên sứ PHP"
Bài liên quan
0