PHP странициране

Msecurity

Registered
Здравейте как мога да си направя странициране и например на страница да излизат само по 8 резултата.
Ето ми го кода за извеждане на резултатите:
PHP:
<?php 
$category = 1; 
if(isset($_GET['category']) and is_numeric($_GET['category'])) {
    $category = intval($_GET['category']);
    $result                            = mysql_query("SELECT c.name, n.info, n.title, n.price, n.promo, n.images, n.data FROM news as n LEFT OUTER JOIN categories as c ON n.catid = c.id WHERE n.catid = '".$category."'")
    or die("Не може да изпълни заявката");
    if(mysql_num_rows($result) > 0) {
        while($row = mysql_fetch_array($result)) {
echo "<b>  <IMG SRC=" . $row["images"]   .  "  ALIGN=LEFT border= 1px  " .  "<b> Продукт:</b>"   .  $row['title']. "<br>" . "<b> Описание: </b>" . $row['info']. "</br>" . "<b> Цена:</b>". $row['price']. "</br>" . "<b>На промоция? </b>" . $row['promo'] . "</br>" . "<hr><br /><br />";
}
} else

echo "Няма резултати в тази категория.";
}
?>
 
Препоръчвам ти това странициране. Доста лесно се използва, няма бъгове, абе общо взето екстра баца.

Успех :)
 
Намерих си скрипт... но нещо не мога да го приписна с моя...
Ето кои скрипт искам да използвам за странициране:
PHP:
<?php

$ar = array("element1","element2","element3","element4","element5","element6","element7");
$el_na_stranica = 3;

if(isset($_GET['page'])) $page = $_GET['page'];
else $page = 1;

$reji_ot_elem = ($el_na_stranica*$page)-$el_na_stranica;
$sm = array_slice($ar, $reji_ot_elem, $el_na_stranica);
foreach($sm as $l) echo $l."<br />";


for($x=1; $x<=ceil(count($ar)/$el_na_stranica);$x++){
	if ($x==$page) { echo "$x "; continue; }
	echo ("<a href=\"index.php?page=$x\">$x</a> ");
}
?>
Ако някои може да ми помогне с препасването ще съм му много благодарен.
 
Ето ти едно странициране:
Код:
<?php
$thispage = $PHP_SELF;

$showeachside = 5; //  Колко страници да се показват отляво и отдясно на текущата страница

// Колко реда на страница
$rowsPerPage = 42;

// Подразбираме показване на първа страница
$pageNum = 1;

// ако $_GET['page'] е дифинирано използваме тази страница
if(isset($_GET['page']) and is_numeric($_GET['page']))
{
    $pageNum = $_GET['page'];
}

// пресмятаме отместването
$offset = ($pageNum - 1) * $rowsPerPage;

// тук трябва да напишеш своята заявка
$category = 1; 
if(isset($_GET['category']) and is_numeric($_GET['category'])) {
    $category = intval($_GET['category']);
    $result = mysql_query("SELECT c.name, n.info, n.title, n.price, n.promo, n.images, n.data FROM news as n LEFT OUTER JOIN categories as c ON n.catid = c.id WHERE n.catid = '".$category."' LIMIT $offset, $rowsPerPage")
    or die("Не може да изпълни заявката");
    if(mysql_num_rows($result) > 0) {
        while($row = mysql_fetch_array($result)) {
echo "<b>  <IMG SRC=" . $row["images"]   .  "  ALIGN=LEFT border= 1px  " .  "<b> Продукт:</b>"   .  $row['title']. "<br>" . "<b> Описание: </b>" . $row['info']. "</br>" . "<b> Цена:</b>". $row['price']. "</br>" . "<b>На промоция? </b>" . $row['promo'] . "</br>" . "<hr><br /><br />";
}
} 
else
{
echo "Няма резултати в тази категория.";
}

// колко реда общо имаме ?
$query1   = "SELECT COUNT(id) AS numrows FROM news";
$result  = mysql_query($query1) or die('Error, query failed');
$row     = mysql_fetch_array($result, MYSQL_ASSOC);

$num = $row['numrows']; // броя на редовете

$start = ($pageNum -1) * $rowsPerPage;
if(empty($start))$start=0;  // текуща стартова позиция

$max_pages = ceil($num/$rowsPerPage); // брой на страниците
$cur = ceil($start/$rowsPerPage)+1; // текуща страница
?>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
<br/>
        <td align="center" valign="middle">
            <?php
            if(($start-$rowsPerPage) >= 0)
            {
                $next = $cur - 1;
                ?>
                <a class="page" href="<?php print("$thispage?m=news&page=1");?>">Първа</a>
                <a class="page" href="<?php print("$thispage".($next>0?("?m=news&page=").$next:""));?>">Назад</a>
                <?php
            }
            ?>
        </td>


        <td align="center" valign="middle">
            <table>
                <tr>
                    <td colspan="3" align="center" valign="middle">
                        <?php
                        $eitherside = ($showeachside * $rowsPerPage);
                        if($start+1 > $eitherside)print (" .... ");
                        $pg=1;
                        for($y=0;$y<$num;$y+=$rowsPerPage)
                        {
                            $class=(($y==$start)?"active":"")."page";
                            if(($y > ($start - $eitherside)) && ($y < ($start + $eitherside)))
                            {
                                if ($y <> $start) {
                                    ?>
                                     <a class="page" href="<?php print("$thispage"."?m=news&page=".(($y/$rowsPerPage)+1));?>"><?php print($pg);?></a> 
                                    <?php
                                } else {
                                    ?>
                                     <a class="page"><?php print($pg);?></a> 
                                    <?php
                                }
                            }
                            $pg++;
                        }
                        if(($start+$eitherside)<$num)print (" .... ");
                        ?>
                    </td>

                </tr>
            </table>
        </td>


        <td align="center" valign="middle">
            <?php
            if (($start+$rowsPerPage) < $num)
            {
                $next = $cur + 1;
                ?>
                <a class="page" href="<?php print("$thispage?m=news&page=".$next);?>">Напред</a>
                <a class="page" href="<?php print("$thispage?m=news&page=$max_pages");?>">Последна</a>
                <?php
            }
            ?>
        </td>

    </tr>

    <tr>
        <td colspan="3" align="center" valign="middle"> </td>
    </tr>

</table>
 
Хмм една грешка.. която не мога да разбера от къде идва при положение че всичко е затворено...
"Parse error: syntax error, unexpected $end in C:\Program Files\VertrigoServ\www\news.php on line 120"
 
Да грешката я видях не бях затворил една скобка..

Код:
<?php
$thispage = $PHP_SELF;

$showeachside = 5; //  Колко страници да се показват отляво и отдясно на текущата страница

// Колко реда на страница
$rowsPerPage = 42;

// Подразбираме показване на първа страница
$pageNum = 1;

// ако $_GET['page'] е дифинирано използваме тази страница
if(isset($_GET['page']) and is_numeric($_GET['page']))
{
    $pageNum = $_GET['page'];
}

// пресмятаме отместването
$offset = ($pageNum - 1) * $rowsPerPage;

// тук трябва да напишеш своята заявка
$category = 1;
if(isset($_GET['category']) and is_numeric($_GET['category'])) {
    $category = intval($_GET['category']);
    $result = mysql_query("SELECT c.name, n.info, n.title, n.price, n.promo, n.images, n.data FROM news as n LEFT OUTER JOIN categories as c ON n.catid = c.id WHERE n.catid = '".$category."' LIMIT $offset, $rowsPerPage")
    or die("Не може да изпълни заявката");
    if(mysql_num_rows($result) > 0) {
        while($row = mysql_fetch_array($result)) {
echo "<b>  <IMG SRC=" . $row["images"]   .  "  ALIGN=LEFT border= 1px  " .  "<b> Продукт:</b>"   .  $row['title']. "<br>" . "<b> Описание: </b>" . $row['info']. "</br>" . "<b> Цена:</b>". $row['price']. "</br>" . "<b>На промоция? </b>" . $row['promo'] . "</br>" . "<hr><br /><br />";
}
}
}
else
{
echo "Няма резултати в тази категория.";
}

// колко реда общо имаме ?
$query1   = "SELECT COUNT(id) AS numrows FROM news";
$result  = mysql_query($query1) or die('Error, query failed');
$row     = mysql_fetch_array($result, MYSQL_ASSOC);

$num = $row['numrows']; // броя на редовете

$start = ($pageNum -1) * $rowsPerPage;
if(empty($start))$start=0;  // текуща стартова позиция

$max_pages = ceil($num/$rowsPerPage); // брой на страниците
$cur = ceil($start/$rowsPerPage)+1; // текуща страница
?>

<table border="0" cellpadding="0" cellspacing="0">
    <tr>
<br/>
        <td align="center" valign="middle">
            <?php
            if(($start-$rowsPerPage) >= 0)
            {
                $next = $cur - 1;
                ?>
                <a class="page" href="<?php print("$thispage?m=news&page=1");?>">Първа</a>
                <a class="page" href="<?php print("$thispage".($next>0?("?m=news&page=").$next:""));?>">Назад</a>
                <?php
            }
            ?>
        </td>


        <td align="center" valign="middle">
            <table>
                <tr>
                    <td colspan="3" align="center" valign="middle">
                        <?php
                        $eitherside = ($showeachside * $rowsPerPage);
                        if($start+1 > $eitherside)print (" .... ");
                        $pg=1;
                        for($y=0;$y<$num;$y+=$rowsPerPage)
                        {
                            $class=(($y==$start)?"active":"")."page";
                            if(($y > ($start - $eitherside)) && ($y < ($start + $eitherside)))
                            {
                                if ($y <> $start) {
                                    ?>
                                     <a class="page" href="<?php print("$thispage"."?m=news&page=".(($y/$rowsPerPage)+1));?>"><?php print($pg);?></a> 
                                    <?php
                                } else {
                                    ?>
                                     <a class="page"><?php print($pg);?></a> 
                                    <?php
                                }
                            }
                            $pg++;
                        }
                        if(($start+$eitherside)<$num)print (" .... ");
                        ?>
                    </td>

                </tr>
            </table>
        </td>


        <td align="center" valign="middle">
            <?php
            if (($start+$rowsPerPage) < $num)
            {
                $next = $cur + 1;
                ?>
                <a class="page" href="<?php print("$thispage?m=news&page=".$next);?>">Напред</a>
                <a class="page" href="<?php print("$thispage?m=news&page=$max_pages");?>">Последна</a>
                <?php
            }
            ?>
        </td>

    </tr>

    <tr>
        <td colspan="3" align="center" valign="middle"> </td>
    </tr>

</table>
 
Нещо не се получава по този начин. Когато цъкна на 2-ра страница да речем и ми показва че няма нищо в тази категория... и има грешка с PHP_SELF.
 
Като гледах кода има следните проблеми според мен:
1. $PHP_SELF не е заредена, което прави невалидни линковете на навигатора
2. $_GET променливите не се запазват и се губят при следващи страници - в конкретния случай се губи category, а m си я прехвърляш ръчно.
3. При изчислението на общия брой записи не се използва същата заявка, която връща ефективно резултата, което потенциално ще доведе до различия с основната заявка и от там до грешно изчисление на общия брой страници.

Направил съм промени по кода за оправяне на тези проблеми и се надявам математическия алгоритъм да е верен защото не съм го засичал:


PHP:
<?php
$thispage = $_SERVER['PHP_SELF'];
// запазваме GET стойностите с изключение на page
$getwithoutpage = "?";
if (isset($_GET))
	foreach($_GET as $k=>$v)
		if ($k!='page') $getwithoutpage.=$k."=".urlencode($v)."&";
 
$showeachside = 5; //  Колко страници да се показват отляво и отдясно на текущата страница

// Колко реда на страница
$rowsPerPage = 42;

// Подразбираме показване на първа страница
$pageNum = 1;

// ако $_GET['page'] е дифинирано използваме тази страница
if(isset($_GET['page']) and is_numeric($_GET['page']))
{
    $pageNum = $_GET['page'];
}

// пресмятаме отместването
$offset = ($pageNum - 1) * $rowsPerPage;

// тук трябва да напишеш своята заявка
$category = 1;
if(isset($_GET['category']) and is_numeric($_GET['category'])) {
    $category = intval($_GET['category']);
    $result = mysql_query("SELECT c.name, n.info, n.title, n.price, n.promo, n.images, n.data FROM news as n LEFT OUTER JOIN categories as c ON n.catid = c.id WHERE n.catid = '".$category."' LIMIT $offset, $rowsPerPage")
    or die("Не може да изпълни заявката");
    if(mysql_num_rows($result) > 0) {
        while($row = mysql_fetch_array($result)) {
			echo "<b>  <IMG SRC=" . $row["images"]   .  "  ALIGN=LEFT border= 1px  " .  "<b> Продукт:</b>"   .  $row['title']. "<br>" . "<b> Описание: </b>" . $row['info']. "</br>" . "<b> Цена:</b>". $row['price']. "</br>" . "<b>На промоция? </b>" . $row['promo'] . "</br>" . "<hr><br /><br />";
		}
	}
}
else
{
	echo "Няма резултати в тази категория.";
}

// колко реда общо имаме ?
// тук е важно да се използва същата заявка като в WHILE-а
$query1   = "SELECT COUNT(*) AS numrows FROM news as n LEFT OUTER JOIN categories as c ON n.catid = c.id WHERE n.catid = '".$category."'";
$result  = mysql_query($query1) or die('Error, query failed');
$row     = mysql_fetch_array($result, MYSQL_ASSOC);

$num = $row['numrows']; // броя на редовете

$start = ($pageNum -1) * $rowsPerPage;
if(empty($start))$start=0;  // текуща стартова позиция

$max_pages = ceil($num/$rowsPerPage); // брой на страниците
$cur = ceil($start/$rowsPerPage)+1; // текуща страница
?>

<table border="0" cellpadding="0" cellspacing="0">
    <tr>
<br/>
        <td align="center" valign="middle">
            <?php
            if(($start-$rowsPerPage) >= 0)
            {
                $next = $cur - 1;
                ?>
                <a class="page" href="<?php print($thispage.$getwithoutpage."page=1");?>">Първа</a>
                <a class="page" href="<?php print($thispage.$getwithoutpage.($next>0? "page=".$next:""));?>">Назад</a>
                <?php
            }
            ?>
        </td>


        <td align="center" valign="middle">
            <table>
                <tr>
                    <td colspan="3" align="center" valign="middle">
                        <?php
                        $eitherside = ($showeachside * $rowsPerPage);
                        if($start+1 > $eitherside)print (" .... ");
                        $pg=1;
                        for($y=0;$y<$num;$y+=$rowsPerPage)
                        {
                            $class=(($y==$start)?"active":"")."page";
                            if(($y > ($start - $eitherside)) && ($y < ($start + $eitherside)))
                            {
                                if ($y <> $start) {
                                    ?>
                                     <a class="page" href="<?php print($thispage.$getwithoutpage."page=".(($y/$rowsPerPage)+1));?>"><?php print($pg);?></a> 
                                    <?php
                                } else {
                                    ?>
                                     <a class="page"><?php print($pg);?></a> 
                                    <?php
                                }
                            }
                            $pg++;
                        }
                        if(($start+$eitherside)<$num)print (" .... ");
                        ?>
                    </td>

                </tr>
            </table>
        </td>


        <td align="center" valign="middle">
            <?php
            if (($start+$rowsPerPage) < $num)
            {
                $next = $cur + 1;
                ?>
                <a class="page" href="<?php print("$thispage?m=news&page=".$next);?>">Напред</a>
                <a class="page" href="<?php print("$thispage?m=news&page=$max_pages");?>">Последна</a>
                <?php
            }
            ?>
        </td>

    </tr>

    <tr>
        <td colspan="3" align="center" valign="middle"> </td>
    </tr>

</table>
 
Честно казано понякога е по-лесно да вземеш нещо на готово :) Избирай си странициране и радвай :P

Аз лично ползвам това http://www.catchmyfame.com/2007/07/28/finally-the-simple-pagination-class/
 

Back
Горе