PHP sayfalama - ek sayfalarda sorun görüntülenmesini doğru içerik

4 Cevap php

Ben pagination ile yardımcı olmak için çevrimiçi bu müthiş kodu buldum ve iyi çalışıyor, tek sorun: Her sayfa aynı 4 satırları görüntüler.

Herhangi bir fikir çok takdir edilecektir

<?php
        //Include the PS_Pagination class
        include('includes/ps_pagination.php');

        //Connect to mysql db
        $conn = mysql_connect("localhost", "root", "root");
        mysql_select_db('database',$conn);
        $sql = "SELECT * FROM studies WHERE niche = '{$_GET['niche']}'";
        //Create a PS_Pagination object
        $pager = new PS_Pagination($conn,$sql,4,5);
        //The paginate() function returns a mysql
        //result set for the current page
        $rs = $pager->paginate();
        //Loop through the result set
        while($row = mysql_fetch_assoc($rs)) {

    $a=0;
    while ($a < $num) {

    $id=mysql_result($result,$a,"id");
    $title=mysql_result($result,$a,"title");
    $strategies=mysql_result($result,$a,"strategies");
    $client=mysql_result($result,$a,"client");
    $copy=mysql_result($result,$a,"copy");
    $thumbmedia=mysql_result($result,$a,"thumbmedia");
    $niche=mysql_result($result,$a,"niche");


    echo '<div class="container"><p class="subheadred"><a href="casestudy.php?id='.$id.'">'.$title.'</a></p></div>';

    echo '<div class="containerstudy"><div class="column1"><p class="subheadsmall">Strategies</p><p class="sidebarred">'.$strategies.'</p>';

    echo '<p class="subheadsmall">Client</p><p class="sidebargrey">'.$client.'</p></div>';

    echo '<div class="column2"><p class="bodygrey">'.substr($copy, 0, 300).'<a href="casestudy.php?id='.$id.'">...more</a></p></div>';

    echo '<div class="column3"><img src="images/'.$thumbmedia.'" height="160" /></div></div>';

    $a++;
    }

        }
        //Display the navigation
        echo $pager->renderNav();
    ?>

Bu dahil dosyasıdır:

<?php
/**
 * PHPSense Pagination Class
 *
 * PHP tutorials and scripts
 *
 * @package 	PHPSense
 * @author  	Jatinder Singh Thind
 * @copyright   Copyright (c) 2006, Jatinder Singh Thind
 * @link    	http://www.phpsense.com
 */

// ------------------------------------------------------------------------

class PS_Pagination {
    var $php_self;
    var $rows_per_page; //Number of records to display per page
    var $total_rows; //Total number of rows returned by the query
    var $links_per_page; //Number of links to display per page
    var $sql;
    var $debug = false;
    var $conn;
    var $page;
    var $max_pages;
    var $offset;

    /**
     * Constructor
     *
     * @param resource $connection Mysql connection link
     * @param string $sql SQL query to paginate. Example : SELECT * FROM users
     * @param integer $rows_per_page Number of records to display per page. Defaults to 10
     * @param integer $links_per_page Number of links to display per page. Defaults to 5
     */

    function PS_Pagination($connection, $sql, $rows_per_page = 1, $links_per_page = 5) {
    	$this->conn = $connection;
    	$this->sql = $sql;
    	$this->rows_per_page = $rows_per_page;
    	$this->links_per_page = $links_per_page;
    	$this->php_self = htmlspecialchars($_SERVER['PHP_SELF']);
    	if(isset($_GET['page'])) {
    		$this->page = intval($_GET['page']);
    	}
    }

    /**
     * Executes the SQL query and initializes internal variables
     *
     * @access public
     * @return resource
     */
    function paginate() {
    	if(!$this->conn) {
    		if($this->debug) echo "MySQL connection missing<br />";
    		return false;
    	}

    	$all_rs = @mysql_query($this->sql);
    	if(!$all_rs) {
    		if($this->debug) echo "SQL query failed. Check your query.<br />";
    		return false;
    	}
    	$this->total_rows = mysql_num_rows($all_rs);
    	@mysql_close($all_rs);

    	$this->max_pages = ceil($this->total_rows/$this->rows_per_page);
    	//Check the page value just in case someone is trying to input an aribitrary value
    	if($this->page > $this->max_pages || $this->page <= 0) {
    		$this->page = 1;
    	}

    	//Calculate Offset
    	$this->offset = $this->rows_per_page * ($this->page-1);

    	//Fetch the required result set
    	$rs = @mysql_query($this->sql." LIMIT {$this->offset}, {$this->rows_per_page}");
    	if(!$rs) {
    		if($this->debug) echo "Pagination query failed. Check your query.<br />";
    		return false;
    	}
    	return $rs;
    }

    /**
     * Display the link to the first page
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to 'First'
     * @return string
     */
    function renderFirst($tag='First') {
    	if($this->page == 1) {
    		return $tag;
    	}
    	else {
    		return '<a href="'.$this->php_self.'?page=1">'.$tag.'</a>';
    	}
    }

    /**
     * Display the link to the last page
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to 'Last'
     * @return string
     */
    function renderLast($tag='Last') {
    	if($this->page == $this->max_pages) {
    		return $tag;
    	}
    	else {
    		return '<a href="'.$this->php_self.'?page='.$this->max_pages.'">'.$tag.'</a>';
    	}
    }

    /**
     * Display the next link
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to '>>'
     * @return string
     */
    function renderNext($tag=' &gt;&gt;') {
    	if($this->page < $this->max_pages) {
    		return '<a href="'.$this->php_self.'?page='.($this->page+1).'">'.$tag.'</a>';
    	}
    	else {
    		return $tag;
    	}
    }

    /**
     * Display the previous link
     *
     * @access public
     * @param string $tag Text string to be displayed as the link. Defaults to '<<'
     * @return string
     */
    function renderPrev($tag='&lt;&lt;') {
    	if($this->page > 1) {
    		return '<a href="'.$this->php_self.'?page='.($this->page-1).'">'.$tag.'</a>';
    	}
    	else {
    		return $tag;
    	}
    }

    /**
     * Display the page links
     *
     * @access public
     * @return string
     */




    function renderNav() {
    	for($i=1;$i<=$this->max_pages;$i+=$this->links_per_page) {
    		if($this->page >= $i) {
    			$start = $i;
    		}
    	}

    	if($this->max_pages > $this->links_per_page) {
    		$end = $start+$this->links_per_page;
    		if($end > $this->max_pages) $end = $this->max_pages+1;
    	}
    	else {
    		$end = $this->max_pages;
    	}

    	$links = '';
    	$niche = $_GET['niche'];

    	for( $i=$start ; $i<$end ; $i++) {
    		if($i == $this->page) {
    			$links .= " $i ";
    		}
    		else {
    			$links .= ' <a href="'.$this->php_self.'?page='.$i.'&niche='.$niche.'">'.$i.'</a> ';
    		}
    	}

    	return $links;
    }

    /**
     * Display full pagination navigation
     *
     * @access public
     * @return string
     */
    function renderFullNav() {
    	return $this->renderFirst().'&nbsp;'.$this->renderPrev().'&nbsp;'.$this->renderNav().'&nbsp;'.$this->renderNext().'&nbsp;'.$this->renderLast();	
    }

    /**
     * Set debug mode
     *
     * @access public
     * @param bool $debug Set to TRUE to enable debug messages
     * @return void
     */
    function setDebug($debug) {
    	$this->debug = $debug;
    }
}
?>

4 Cevap

Sadece ilk bakışta i sorgu başından itibaren bunu çalıştırmak her zaman tekerrür olduğunu görmek, böylece onu başında gelen arar çalıştırmak her zaman anlamına gelir. nerede sonraki sayfada başlamak için bunu söylemek için bir sayaç gerekir. gibi bir şey:

$sql = "SELECT * FROM studies WHERE niche = '{$_GET['niche']}' limit $startPoint, $offset";

ofset yolu Sayfa başına istediğiniz ve $ startPoint noktasıdır öğelerin sayısı olarak aynı olan bir sonraki tekrarında arama beggins.

somehting bu işe olur gibi:

if(!$startPoint){$startPoint = 0;}else{$startPoint = {$_GET['$startPoint'];}

kodunuz içinde geri sorguya başlangıç ​​noktasını geçmek ve her yineleme sonra ofset artırılarak.

Ben enjeksiyon gibi dikkate şeyleri içine almayan ettik zihin ve değişken $ num yerde 1 dosyasında gelmek görünmüyor aslında alınız. Buna karşı $ a sınamak amacıyla bunu başlatıldı nerede göremiyorum.

Sizin kod baktıktan sonra daha derinlemesine i değiştirilen kod burada azından işe almak için değiştirilmesi gereken bir kaç şey buldum:

<?php
    	//Include the PS_Pagination class
       include('includes/ps_pagination.php');

        //Connect to mysql db
        $conn = mysql_connect("localhost", "root", "root");
        mysql_select_db('database',$conn);
        $sql = "SELECT * FROM studies";// WHERE niche = '{$_GET['niche']}'";
        //Create a PS_Pagination object
        $pager = new PS_Pagination($conn,$sql,4,5);
        //The paginate() function returns a mysql
        //result set for the current page
        $rs = $pager->paginate();
        //Loop through the result set
        while($row = mysql_fetch_assoc($rs)) {

 //   $a=0;
 //   while ($a < $num) {

 //   $id=mysql_result($result,$a,"id");
 //   $title=mysql_result($result,$a,"title");
  //  $strategies=mysql_result($result,$a,"strategies");
 //   $client=mysql_result($result,$a,"client");
 //   $copy=mysql_result($result,$a,"copy");
 //   $thumbmedia=mysql_result($result,$a,"thumbmedia");
 //   $niche=mysql_result($result,$a,"niche");
    $id=$row['id'];
    $title=$row['title'];
    $strategies=$row['strategies'];
    $client=$row['client'];
    $copy=$row['copy'];
    $thumbmedia=$row['thumbmedia'];
    $niche=$row['niche'];

    echo '<div class="container"><p class="subheadred"><a href="casestudy.php?id='.$id.'">'.$title.'</a></p></div>';

    echo '<div class="containerstudy"><div class="column1"><p class="subheadsmall">Strategies</p><p class="sidebarred">'.$strategies.'</p>';

    echo '<p class="subheadsmall">Client</p><p class="sidebargrey">'.$client.'</p></div>';

    echo '<div class="column2"><p class="bodygrey">'.substr($copy, 0, 300).'<a href="casestudy.php?id='.$id.'">...more</a></p></div>';

    echo '<div class="column3"><img src="images/'.$thumbmedia.'" height="160" /></div></div>';

  //  $a++;
  //  }

        }
        //Display the navigation
        echo $pager->renderNav();
    ?>

Ben bazı bölümünü yorumladı dikkat edin gerektiğinde değil

Bu nedenle hiçbir şey göstermek istiyorum yoksa hangi $ num göre değişken $ anlamsız oldu. Şimdi bu satırları:

   //   $id=mysql_result($result,$a,"id");
     //   $title=mysql_result($result,$a,"title");
      //  $strategies=mysql_result($result,$a,"strategies");
     //   $client=mysql_result($result,$a,"client");
     //   $copy=mysql_result($result,$a,"copy");
     //   $thumbmedia=mysql_result($result,$a,"thumbmedia");
     //   $niche=mysql_result($result,$a,"niche");

burada da yanlış size $ sonuç kümesi sonuç almak için çalışıyoruz gibi. hiçbir yerde size sonucu size aktardığınız sınıf yapar ve $ rs adında bir tanımlayıcı içine koymak sonucu koyar neden $ içine set koymak vardı.

Kullandığınız beri $row = mysql_fetch_assoc($rs) daha sonra tüm yapmanız gereken böyle bir dizi ile sütun satır olsun değişkenleri almak için set sonucu ile okumak

$id=$row['id'];

ve benzerleri. Bunu bir kez beklendiği gibi daha sonra kod çalışır. Ancak bu geri bu bize getiriyor:

$sql = "SELECT * FROM studies WHERE niche = '{$_GET['niche']}'";

ben bu değişken (sen get kullanırken görme) geri sorgu dizesi geçirilen almıyor son bölümünü almak zorunda, diğer problem sayfasını yüklemek 1st zaman bu değişken 'niş' yani yok değildir Bu komut dosyası, bu değişkenin geçtiği bir bağlantı aracılığıyla erişilen sürece kod çalıştırmak 1st zaman, boş bir sayfa olacaktır. Bu noktada ben size niş aracılığıyla yapmaya çalışıyor ne emin değilim gibi dışarı yorumladı yapmamışlar.

Umut olur.

Eğer sorgu dizesinde sayfasını ayarlamak var mı?

Ben, paginate işlevi değişti eğer bir parametre $page olurdu ve fonksiyonunun başında $this->page = $page, işe yarayacağını set olacağını böylece düşünüyorum.

Ayrıca $pager->paginate($_GET['page']) için kod bu fonksiyonun arama değiştirmek zorunda kalacak.

Çağrı cihazı yanıt kaç satır var, sadece öğrenmek için tüm sorguyu alır, aynı zamanda çok verimsiz. Ben gibi bir şey kullanmak istiyorsunuz:

$all_rs = @mysql_query('SELECT COUNT(*) FROM (' . $this->sql . ')');
if(!$all_rs) {
        if($this->debug) echo "SQL query failed. Check your query.<br />";
        return false;
}
$this->total_rows = mysql_result($all_rs, 0, 0);
@mysql_close($all_rs);

Ben bu sayfalama kütüphane satır indeksi ile ne emin değilim, ama her zaman 0'a $ a belirliyor. Belki endeksi iade ediliyor sayfasında ancak genel kayıt göreceli değil mi?

Diğer bir deyişle, ne vb sayfa 2, sayfa 1, 4, 0 $ a ayarlarsanız

Bunu hesaplamak için $ rows_per_page ve $ sayfasını kullanmak gerekir. Ya da belki de bu $ set, böylece $ ofset değeri a $ rows_per_page ek satırları vurmak kadar ofset ve döngü.


Edit clarifying solution:
So what I see you could do is:

$a=0;
while ($a < $pager->rows_per_page) {
    $row = $a + $pager->offset;

    $id=mysql_result($result,$row,"id");
    $title=mysql_result($result,$row,"title");
    $strategies=mysql_result($result,$row,"strategies");
    $client=mysql_result($result,$row,"client");
    $copy=mysql_result($result,$row,"copy");
    $thumbmedia=mysql_result($result,$row,"thumbmedia");
    $niche=mysql_result($result,$row,"niche");

    ...
    $a++;
}