PDA

View Full Version : آموزش: صفحه بندی در php



danial.saeedi
پنج شنبه 07 آذر 1392, 11:14 صبح
سلام من از pdo استفاده می کنم.
می خوام یک صفحه بندی برای مطالبم درست کنم اما نمی دونم از چه الگوریتمی استفاده کنم.
و درضمن یک سوال دیگه: می خواستم دکمه های صفحه ی مثلا 1 و 2 رو هم داشته باشه.:لبخند:

Izadshahri
پنج شنبه 07 آذر 1392, 19:45 عصر
صفحه بندی در PHP (http://www.phptik.com/%d8%b5%d9%81%d8%ad%d9%87-%d8%a8%d9%86%d8%af%db%8c-%d8%af%d8%b1-php/)



هاست Anti DDoS (http://central-hosting.com/)

smksmk
پنج شنبه 07 آذر 1392, 21:27 عصر
سلام ، شما شماره صفحه رو به صورت get میگیری از آدرس بار و ازش استفاده میکنی به این صورت



if (!isset($_GET['my_page_number']) || empty($_GET['my_page_number']))

$pagenum = 1;


$pagenum = $_GET['my_page_number'];
$resultperpage = 2;
if ($pagenum < 1) { $pagenum = 1; }
$from = ($pagenum - 1) * $resultperpage;



if اول که چک میکنه اگه id نبود یا اگه بود و خالی بود ! شماره صفحه پیش فرض 1 باشه .
اگه هم ست شده بود که بگیره بزاره توی pagenum
بعد هم اگه کوچکتر از یک وارد کرده بود طرف که همون 1 باشه .
خوب تعداد نتایج در صفحه هم که با resultperpage مشخص شده یا مشخص میکنی .
حالا تعداد نتایج باید از صفر شروع کنه در پایگاه داده و بخونه تا تعدادی که میخای در نتایج باشه و قبلاً مشخص کردی .

خوب اصل کار در بالا مشخص شد . حالا باید شماره صفحات رو پرینت کنی . آخرین صفحه

$last = ceil($rows/$resultperpage);
که $rows تعداد کل نتایج جدولت بود که میخای صفحه بندیش کنی .
شرایطی مثل

if ($pagenum > $last)
{ $pagenum = $last; }
که اگه شماره صفحه بزرگتر از آخرین صفحه وارد شد بشه همون آخرین نه بیشتر و 100 تا شرط دیگه هم برای امنیت و این چیزا خودت باید اضافه کنی تا کامل بشه کدت . موفق باشی .

qartalonline
پنج شنبه 07 آذر 1392, 22:29 عصر
از کد زیر استفاده کنید. تقریبا کامله. البته از نظر امنیتی باید روش کار کنید.
استفاده کنید در صورت نیاز توضیح میدم.


$pdo = new PDO('mysql:dbname='. DB_DATABASE. ';host='.DB_HOST ,DB_USER ,DB_PASSWORD ,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

$row_count_q = $pdo->prepare('SELECT `post`.* FROM post');
$row_count_q->execute();
$row_count = $row_count_q->rowCount(); // get all rows|posts

$item_count = 5; // count post in one page
$current_page = $_GET['page_id']; // get current page id
$link = '?page_id=:id:'; // paging link format

$start = ( ($row_count / $item_count) - $current_page) * $item_count;
$end = $start + $item_count;






$result = $pdo->prepare('SELECT `post`.* FROM post WHERE (id>' .$start. ' AND id<=' .$end. ') ORDER BY `post`.`id` DESC');
$result->execute();

/*
* echo post|content
*/

echo paging($row_count, $item_count, $current_page, $link);







function paging($total, $limit, $current_page, $link=':id:', $distance=3){

$total_page = $total / $limit;

if (is_float($total_page)) $total_page = ceil($total_page);

$result = '<li><a title="'.$current_page.'" href="'.str_replace(':id:', $current_page, $link).'" class="disabled">'.$current_page.'</a></li>'.PHP_EOL;

for ($i = $current_page+1; $i <= $current_page+$distance; $i++)
if ($i <= $total_page)
$result .= '<li><a title="'.$i.'" href="'.str_replace(':id:', $i, $link).'">'.$i.'</a></li>'.PHP_EOL;

for ($i = $current_page-1; $i >= $current_page-$distance; $i--)
if ($i >= 1)
$result = '<li><a title="'.$i.'" href="'.str_replace(':id:', $i, $link).'">'.$i.'</a></li>'.PHP_EOL.$result;

if ($current_page-$distance > 2)
$result = '<li> ... </li>'.PHP_EOL.$result;

if ($current_page+$distance < $total_page-1)
$result = $result.'<li> ... </li>'.PHP_EOL;

if ($current_page > 1) {
$previous = $current_page - 1;
$result = '<li><a title="'.$previous.'" href="'.str_replace(':id:', $previous, $link).'">&lsaquo;</a></li>'.PHP_EOL.$result;
}

if ($current_page < $total_page) {
$next = $current_page + 1;
$result = $result.'<li><a title="'.$next.'" href="'.str_replace(':id:', $next, $link).'">&rsaquo;</a></li>'.PHP_EOL;
}

if ($current_page-$distance > 1)
$result = '<li><a title="1" href="'.str_replace(':id:', '1', $link).'">&laquo; اولی</a></li>'.PHP_EOL.$result;

if ($current_page+$distance < $total_page)
$result = $result.'<li><a title="'.$total_page.'" href="'.str_replace(':id:', $total_page, $link).'">آخری &raquo;</a></li>'.PHP_EOL;

return '<div class="paging"><ul>'.PHP_EOL.$result.'</ul>'.PHP_EOL.'<div>تعداد کل صفحات : <strong>'.$total_page.'</strong> صفحه</div>'.PHP_EOL.'</div>';
}

saeed-71
جمعه 13 تیر 1393, 20:05 عصر
سلام.کجای امنیتش مشکل داره؟

qartalonline
جمعه 13 تیر 1393, 20:22 عصر
متغییر $_GET['page_id'] بصورت مستقیم و بدون اعمال فیلتر استفاده شده.

saeed-71
جمعه 13 تیر 1393, 22:41 عصر
چرا از لیمیت استفاده نکردید؟
نمیشه از لیمیت استفاده کرد؟

این قسمتو میگم


id>' .$start. ' AND id<=' .$end. '

qartalonline
جمعه 13 تیر 1393, 22:58 عصر
میشه استفاده کرد ولی سرعت این کوئری بیشتره.

saeed-71
جمعه 13 تیر 1393, 23:19 عصر
اخه اگه مثلا بین دو تا ایدی یه پست حذف شده باشه چی؟
اگه قرار باشه 10 تا نشون بده اونوقت 9 تا نشون میده؟
این کد من کجاش مشکل داره که تشخیص میده چنتا پست باید چاپ بشه اما چیزی چاپ نمیشه فقط paging چاپ میشه




$flag = '1';
$payment = '1';
$edit = '0';
$row_count_q = $connect->prepare('SELECT * FROM `carinfo` WHERE(`flag`=:flag AND `edit`=:edit AND `payment`=:payment ) ORDER BY `id` DESC');
$row_count_q->execute(array(
":flag"=>$flag,
":payment"=>$payment,
":edit"=>$edit
));
echo $row_count = $row_count_q->rowCount(); // get all rows|posts


$item_count = 5; // count post in one page
$current_page = $_GET['page_id']; // get current page id
$link = '?page_id=:id:'; // paging link format

$start = ( ($row_count / $item_count) - $current_page) * $item_count;
$end = $start + $item_count;


echo paging($row_count, $item_count, $current_page, $link);

$flag = '1';
$payment = '1';
$edit = '0';
$sql = $connect->prepare("SELECT * FROM `carinfo` WHERE(`flag`=:flag AND `edit`=:edit AND `payment`=:payment AND `id`>' .$start. ' AND `id`<=' .$end. '
) ORDER BY `id` DESC");
$sql->execute(array(
":flag"=>$flag,
":payment"=>$payment,
":edit"=>$edit
));
foreach($sql as $rows){
$id = $rows['id'];
چاپ اطلاعات ...

120788
ارور undifined page_id قابل حله.فقط اینو نمیفهمم که چرا چیزی در ادامه چاپ نمیشه و فقط پیجینگ نمای داده میشه

qartalonline
شنبه 14 تیر 1393, 00:08 صبح
آره حق با شماست فکر ID های پاک شده یا برخی شرایط خاص رو نکرده بودم.

باید بعد از اینکه execute کردید fetch بکنید خروجی رو.

$sql->execute(array(":flag"=>$flag,":payment"=>$payment,":edit"=>$edit));$rows = $sql->fetchAll(PDO::FETCH_ASSOC); foreach($rows as $row){$id = $row['id']; چاپ اطلاعات ...

saeed-71
شنبه 14 تیر 1393, 00:30 صبح
خوب همون کد بالا رو نمیشه با لیمیت مثال بزنید لطفا؟
عزیز چرا fetchAll کردید؟
مگه با foreach نمیشه اطلاعات رو خوند؟بدون چیجینک من با foreach اطلاعات رو چاپ میکنم.

با لیمیت اینجوری شد.تو صفحه ای که پیج ایدش میشه یک درست عمل میکنه.
مشکل تو محاسبه $start و $end هستش عزیز


$flag = '1';
$payment = '1';
$edit = '0';
$row_count_q = $connect->prepare('SELECT * FROM `carinfo` WHERE(`flag`=:flag AND `edit`=:edit AND `payment`=:payment ) ORDER BY `id` DESC');
$row_count_q->execute(array(
":flag"=>$flag,
":payment"=>$payment,
":edit"=>$edit
));
echo '<br>'.$row_count = $row_count_q->rowCount(); // get all rows|posts



$item_count = 5; // count post in one page
if(isset($_GET['page_id'])){ $current_page = check_Get($_GET['page_id']); }else{
$current_page = '';} // get current page id
$link = '?page_id=:id:'; // paging link format

$start = ( ($row_count / $item_count) - $current_page) * $item_count ;
$end = $start + $item_count;


echo paging($row_count, $item_count, $current_page, $link);

$sql = $connect->prepare("SELECT * FROM `carinfo` WHERE(`flag`=:flag AND `edit`=:edit AND `payment`=:payment) ORDER BY `id` DESC LIMIT $start,$end");
$sql->execute(array(
":flag"=>$flag,
":payment"=>$payment,
":edit"=>$edit
));
foreach($sql as $rows){
$id = $rows['id'];

qartalonline
شنبه 14 تیر 1393, 10:33 صبح
با limit بصورت زیر میشه:

<?php

$pdo = new PDO('mysql:dbname=test;host=localhost', 'root', null, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

$row_count_q = $pdo->prepare('SELECT `carinfo`.* FROM `carinfo`');
$row_count_q->execute();
$row_count = $row_count_q->rowCount();

$item_count = 2;
$current_page = isset($_GET['page_id']) && is_numeric($_GET['page_id']) ? $_GET['page_id'] : 1;
$link = '?page_id=:id:';

$start = $item_count * ($current_page - 1 ) ;
$end = $item_count ;


$result = $pdo->prepare("SELECT `carinfo`.* FROM `carinfo` ORDER BY `carinfo`.`id` DESC LIMIT $start,$end");
$result->execute();
$rows = $result->fetchAll(PDO::FETCH_ASSOC);

echo '<p>';
foreach($rows as $row){
echo $row['title'].'<br>';
}
echo '</p>';


echo paging($row_count, $item_count, $current_page, $link);





function paging($total, $limit, $current_page, $link = ':id:', $distance = 3)
{
$total_page = $total / $limit;

if (is_float($total_page))
$total_page = ceil($total_page);

$result = '<li><a title="' . $current_page . '" href="' . str_replace(':id:', $current_page, $link) . '" class="disabled">' . $current_page . '</a></li>' . PHP_EOL;

for ($i = $current_page + 1; $i <= $current_page + $distance; $i++)
if ($i <= $total_page)
$result .= '<li><a title="' . $i . '" href="' . str_replace(':id:', $i, $link) . '">' . $i . '</a></li>' . PHP_EOL;

for ($i = $current_page - 1; $i >= $current_page - $distance; $i--)
if ($i >= 1)
$result = '<li><a title="' . $i . '" href="' . str_replace(':id:', $i, $link) . '">' . $i . '</a></li>' . PHP_EOL . $result;

if ($current_page - $distance > 2)
$result = '<li> ... </li>' . PHP_EOL . $result;

if ($current_page + $distance < $total_page - 1)
$result .= '<li> ... </li>' . PHP_EOL;

if ($current_page > 1)
{
$previous = $current_page - 1;
$result = '<li><a title="' . $previous . '" href="' . str_replace(':id:', $previous, $link) . '">&lsaquo;</a></li>' . PHP_EOL . $result;
}

if ($current_page < $total_page)
{
$next = $current_page + 1;
$result .= '<li><a title="' . $next . '" href="' . str_replace(':id:', $next, $link) . '">&rsaquo;</a></li>' . PHP_EOL;
}

if ($current_page - $distance > 1)
$result = '<li><a title="1" href="' . str_replace(':id:', '1', $link) . '">&laquo; اولی</a></li>' . PHP_EOL . $result;

if ($current_page + $distance < $total_page)
$result .= '<li><a title="' . $total_page . '" href="' . str_replace(':id:', $total_page, $link) . '">آخری &raquo;</a></li>' . PHP_EOL;

return '<div class="paging">' . PHP_EOL . '<ul>' . PHP_EOL . $result . '</ul>' . PHP_EOL . '<div>تعداد کل صفحات : <strong>' . $total_page . '</strong> صفحه</div>' . PHP_EOL . '</div>';
}


باید fetchAll بکنید که بتونید با حلقه اطلاعات رو چاپ کنید.

alibehroozi
شنبه 14 تیر 1393, 12:17 عصر
فکر کنم به این صورت بشه توی دستور mysql

id > 10 LIMIT recordperpage

mehdi423
دوشنبه 26 آبان 1393, 12:30 عصر
در واقع این یک قطعه کد اماده هست و درست کار میکنه ولی به دلیل نیاز تغییراتی در اون انجام دادم..مثلا کد اصلی بر اساس رکورد های کل دیتابیس صفحه بندی میکنه ولی من میخواستم که وقتیtype=$_REQUEST[type] بود بر اساس همین صفحه بندی کنه...ولی یه مشکل هست اونم اینه که فقط صفحه اول اطلاعات را درست نشون میده بقیه صفحات چیزی نشون نمیده و در قسمت اطلاعات صفحه دو مینویسه صفحه 2 از 0

$query = mysql_query("SELECT * FROM ".$tb_name." where type=$_REQUEST[type] ORDER BY id desc LIMIT $start, ".$setting['paged_item']."")
or die(mysql_error());


//چاپ خروجی
while($row = mysql_fetch_array($query)){
$id = $row['id'];
$name = $row['name'];
$ename = $row['ename'];
$type = $row['type'];
$price = $row['price'];
$address="content.php?id= '$id'";
?>


<div class="book">



<a href="<?php echo $address ?>">
<img style=" " src="<?php echo $row["picture"] ?>" width="100%" height="50%"/></a>

<a class="anext" href="<?php echo $address ?>"><?php echo $name ?></a>
<a class="anext" href="<?php echo $address ?>"><?php echo $ename ?></a>
<a class="anext" href="<?php echo $address ?>"><?php echo $type ?></a>
<a class="anext" href="<?php echo $address ?>"><?php echo $price." "."ریال" ?></a>

</div>
<?php
}
//پرس و جوی تعداد کل ردیف ها
$total = mysql_query("SELECT id FROM ".$tb_name." where type=$_REQUEST[type]")
or die(mysql_error());

//مجموع
$count = mysql_num_rows($total);

//بررسی نیاز به صفحه بندی
if($count - $setting['paged_item'] > 0){

//تعداد صفحات
$paged_total = ceil($count / $setting['paged_item']);
//صفحه آخر
$paged_last = $paged_total;
//صفحات میانی
$paged_middle = $page + 4;
//شروع صفحه بندی
$paged_start = $paged_middle - 4;
?>






</div>
</div>



<div class="pagination">
<?php
//ایجاد لینک صفحه نخست
if($page > 1){
//اگر صفحه درخواستی بزرگتر از 1 بود
$paged_result = '<div class="paged-link"><a href="type.php?page=1" title="صفحه نخست">نخست</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه نخست اگر صفحه درخواستی برابر 1 بود
else{
$paged_result = '<div class="paged-link-off">نخست</div>'."\n";
}

//ایجاد لینک صفحه قبلی
if($page > 1){
//محاسبه لینک صفحه قبلی
$paged_perv = $page - 1;
//ایجاد لینک صفحه قبلی
$paged_result .= '<div class="paged-link"><a href="type.php?page='.$paged_perv.'" title="صفحه قبلی">قبلی</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه قبلی اگر صفحه انتخابی برابر 1 بود
else{
$paged_result .= '<div class="paged-link-off">قبلی</div>'."\n";
}

//ایجاد لینک صفحات میانی، شروع از دو شماره قبل
for ($i=$paged_start-2; $i<=$paged_middle; $i++){
//ایجاد لینک در صورتی که صفر، منفی یا از آخرین صفحه بیشتر نباشد
if ($i > 0 && $i <= $paged_last){
//در حالت انتخاب شده
if($i == $page){
$paged_result .= '<div class="paged-link-selected"><a href="type.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
//در حالت عادی
else{
$paged_result .= '<div class="paged-link"><a href="type.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
}
}

//نمایش لینک صفحات بعدی
if($page <= $paged_last - 1){
//محاسبه لینک صفحه بعدی
$paged_next = $page + 1;
//ایجاد لینک صفحه بعدی
$paged_result .= '<div class="paged-link"><a href="type.php?page='.$paged_next.'" title="صفحه بعدی">بعدی</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه بعدی اگر صفحه انتخابی برابر صفحه آخر بود
else{
$paged_result .= '<div class="paged-link-off">بعدی</div>'."\n";
}

//لینک صفحه آخر
if($page <= $paged_last - 1){
$paged_result .= '<div class="paged-link"><a href="type.php?page='.$paged_last.'" title="صفحه آخر">آخر</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه آخر اگر صفحه انتخابی برابر صفحه آخر بود
else{
$paged_result .= '<div class="paged-link-off">آخر</div>'."\n";
}

//اطلاعات صفحات
$paged_result .= '<div class="paged-link-info">&raquo; صفحه: '.$page.' از '.$paged_total.'</div>'."\n";
//خروجی
echo $paged_result;


}
else{
echo ''."\n";
}

//پایان اتصال
$close = mysql_close($connect);
?>

abbas27
دوشنبه 26 آبان 1393, 14:46 عصر
یه نگاه اینجا بنداز/http://barnamenevis.org/showthread.php?475851-صفحه-بندی-بدون-رفرش