Hoşgeldin Misafir

PDO AJAX Gelişmiş Sayfalama Yapımı Örneği

percl

27 Ara 2018
170 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Merhaba,

bu örnekle hem sayfalama yapıp, hemde bunun içerisinde listeleme ve arama yapabiliyorsunuz. genelde datatable bu işi görüyor ama, yorum listelemem gerekti, o zaman işe yaramıyor. ihtiyacı olan olursa diye bırakıyorum buraya.

indeximiz (not php değil html sayfada da çalıştırabilirsiniz bu kısmı.);
Kod:
      <div class="card card-outline card-purple" id="yorum">
        <div class="card-header">
            <div class="card-tools">
                        <ul class="nav justify-content-end">
                              <li class="nav-item">
                                  <div class="input-group input-group-sm" style="width: 120px;">
                                      <select class="form-control select2" id="sirala" onchange="searchFilter()">
                                        <option selected="selected" value="">Sırala</option>
                                        <option value="1">Eskiden Yeniye</option>
                                        <option value="2">Yeniden Eskiye</option>
                                        <option value="3">Olumsuz Önce</option>
                                        <option value="4">Olumlu Önce</option>
                                    </select>
                                  </div>
                            </li>
                              <li class="nav-item">
                                  <div class="input-group input-group-sm" style="width: 120px;">
                                      <input type="text" class="form-control float-right" placeholder="İsim ara" id="yorumara"
 onkeyup="searchFilter()">
                                      <div class="input-group-append">
                                          <button type="submit" class="btn btn-default"><i class="fas fa-search"></i></button>
                                      </div>
                                  </div>
                            </li>
                        </ul>
                    </div>
                </div><!-- /.card-header -->
          <div  id="tumyorumlar">
          </div>
</div>
<p class="goster" onclick="searchFilter()">Tüm yorumları göster</p>
<script src="https://code.jquery.com/jquery-3.5.0.js" integrity="sha256-r/AaFHrszJtwpe+tHyNi/XCfMxYpbsRg2Uqn0x3s2zc=" crossorigin="anonymous"></script>
<script>
$('#yorum').hide();
$( ".goster" ).click(function() {
  $( ".goster" ).hide( "slow", function() {
    $('#yorum').show();
  });
});
function searchFilter(page_num) {
    page_num = page_num?page_num:0;
    var yorumara = $('#yorumara').val();
    var sirala = $('#sirala').val();
    $.ajax({
        type: 'POST',
        url: 'test.php',
        data:'page='+page_num+'&yorumara='+yorumara+'&sirala='+sirala,
        beforeSend: function () {
            $('.loading-overlay').show();
        },
        success: function (html) {
            $('#tumyorumlar').html(html);
            //$('.loading-overlay').fadeOut("slow");
        }
    });
}
</script>

ajax ve jquery sınıf ve idlerine bakarak, hangi element ve classların ne işe yardığını anlayabilirsiniz. anlamayan olursa yazsın yardımcı olayım. index sayfasının sadece geçerli bölümü bu kısım, bu yüzden tasarımda kullanacağınız alana göre düzenleyin.

ben çalış çalışmadığını test ettiğim için dosyaya test2 adını verdim verdim, siz yorumlar diyip bir dizine ekleyebilirsiniz ya da bir post controlcüsüne uyarlayabilirsiniz 
PHP:
    include('inc/sayfalama.php');
    include('takip/settings/database.php');
    include('takip/settings/temix.php');
    $start = !empty($_POST['page'])?$_POST['page']:0;
    $limit = 9;
    $whereSQL = $orderSQL = '';
    $yorumara = temiz($_POST['yorumara']);
    $sirala = $_POST['sirala'];
    if(!empty($yorumara)){
        $whereSQL = "and yorum LIKE '%".$yorumara."%'";
    }
    if(!empty($sirala)){
        if($sirala == 1){$orderSQL = " ORDER BY id asc "; }
        if($sirala == 2){$orderSQL = " ORDER BY id desc "; }
        if($sirala == 3){$orderSQL = " ORDER BY puan asc "; }
        if($sirala == 4){$orderSQL = " ORDER BY puan desc "; }
    }else{
        $orderSQL = " ORDER BY d_id DESC ";
    }
    $queryNum = $db->query("SELECT COUNT(*) as postNum FROM yorumlar where $whereSQL $orderSQL");
    $resultNum = $queryNum->fetch(PDO::FETCH_ASSOC); 
    $rowCount = $resultNum['postNum'];
    $pagConfig = array(
        'currentPage' => $start,
        'totalRows' => $rowCount,
        'perPage' => $limit,
        'link_func' => 'searchFilter'
    );
    $pagination =  new Pagination($pagConfig);

    $conn = $db->query("SELECT * FROM yorumlar where /*BURADA SESSİON KULLANDIMDI EKLEMEDİM BİŞİ KULLANMAYACAKSINIZ WHERE İÇİN YUKARIDAKİ YUKARIDAKİ WHERESQL DEĞİŞKENİNİN ÖNÜNDEN AND OPERATÖRÜNÜ SİLİN */ $whereSQL $orderSQL LIMIT $start,$limit");
if($conn->rowCount() > 0){
$rows = $conn->fetchAll(PDO::FETCH_ASSOC);
$liste = array();
foreach ($rows as $row) {
echo 'İD:'.$row["id"].' Puan:'.$row["puan"].' Yorum:' .$row["yorum"]."<br>";   }

echo $pagination->createLinks(); }else{ echo "sonuçç bulunamadı";}

dahil edilen dosyalarla başlayayalım. sayfalama.php bizim sayfalama classımız, bir sonraki dahil edeceğim dosya yani. database'i biliyorsunuz zaten. temix.php ide sql injection için önlem olarak kullandığımız dosya, temiz() functionlarını siliniz bu kısımdan. tasarımın gerçekleşeceği kısımda aslında bu dosya, çünkü indeximizde herhangi bir kod betiği bulunmuyor, her şeyi buradan yüklüyoruz. while ise tasarımı yapacağımız alan -if($conn->rowCount() > 0){ sabit elementlerimizi  --foreach ($rows as $row) { dan sonra döngüye giren elementlerimizi yazabiliriz
----
sayfalama classı:

PHP:
class Pagination{
	var $baseURL		= '';
	var $totalRows  	= '';
	var $perPage	 	= 9;
	var $numLinks		= 2;
	var $currentPage	= 0;
	var $firstLink   	= 'İlk';
	var $nextLink		= 'Sonraki';
	var $prevLink		= 'Önceki';
	var $lastLink		= 'Son';
	var $fullTagOpen	= '<nav aria-label="Contacts Page Navigation"><ul class="pagination justify-content-center m-0">';
	var $fullTagClose	= '</ul></nav>';
	var $firstTagOpen	= '';
	var $firstTagClose	= '&nbsp;';
	var $lastTagOpen	= '&nbsp;';
	var $lastTagClose	= '';
	var $curTagOpen		= '<li class="page-item active"><a class="page-link">';
	var $curTagClose	= '</a></li>';
	var $nextTagOpen	= '&nbsp;';
	var $nextTagClose	= '&nbsp;';
	var $prevTagOpen	= '&nbsp;';
	var $prevTagClose	= '';
	var $numTagOpen		= '';
	var $numTagClose	= '';
	var $anchorClass	= '';
	var $showCount      = true;
	var $currentOffset	= 0;
	var $contentDiv     = '';
    var $additionalParam= '';
	var $link_func      = '';
	function __construct($params = array()){
		if (count($params) > 0){
			$this->initialize($params);		
		}
		
		if ($this->anchorClass != ''){
			$this->anchorClass = 'class="'.$this->anchorClass.'" ';
		}	
	}
	function initialize($params = array()){
		if (count($params) > 0){
			foreach ($params as $key => $val){
				if (isset($this->$key)){
					$this->$key = $val;
				}
			}		
		}
	}
	function createLinks(){
		if ($this->totalRows == 0 OR $this->perPage == 0){
		   return '';
		}
		$numPages = ceil($this->totalRows / $this->perPage);
		if ($numPages == 1){
			if ($this->showCount){
				$info = 'Sonuç : ' . $this->totalRows;
				return $info;
			}else{
				return '';
			}
		}
		if ( ! is_numeric($this->currentPage)){
			$this->currentPage = 0;
		}
		$output = '';
		$this->numLinks = (int)$this->numLinks;
		if ($this->currentPage > $this->totalRows){
			$this->currentPage = ($numPages - 1) * $this->perPage;
		}
		$uriPageNum = $this->currentPage;
		$this->currentPage = floor(($this->currentPage/$this->perPage) + 1);
		$start = (($this->currentPage - $this->numLinks) > 0) ? $this->currentPage - ($this->numLinks - 1) : 1;
		$end   = (($this->currentPage + $this->numLinks) < $numPages) ? $this->currentPage + $this->numLinks : $numPages;
		if  ($this->currentPage > $this->numLinks){
			$output .= $this->firstTagOpen 
				. $this->getAJAXlink( '' , $this->firstLink)
				. $this->firstTagClose; 
		}
		if  ($this->currentPage != 1){
			$i = $uriPageNum - $this->perPage;
			if ($i == 0) $i = '';
			$output .= $this->prevTagOpen 
				. $this->getAJAXlink( $i, $this->prevLink )
				. $this->prevTagClose;
		}
		for ($loop = $start -1; $loop <= $end; $loop++){
			$i = ($loop * $this->perPage) - $this->perPage;
					
			if ($i >= 0){
				if ($this->currentPage == $loop){
					$output .= $this->curTagOpen.$loop.$this->curTagClose;
				}else{
					$n = ($i == 0) ? '' : $i;
					$output .= $this->numTagOpen
						. $this->getAJAXlink( $n, $loop )
						. $this->numTagClose;
				}
			}
		}
		if ($this->currentPage < $numPages){
			$output .= $this->nextTagOpen 
				. $this->getAJAXlink( $this->currentPage * $this->perPage , $this->nextLink )
				. $this->nextTagClose;
		}
		if (($this->currentPage + $this->numLinks) < $numPages){
			$i = (($numPages * $this->perPage) - $this->perPage);
			$output .= $this->lastTagOpen . $this->getAJAXlink( $i, $this->lastLink ) . $this->lastTagClose;
		}
		$output = preg_replace("#([^:])//+#", "\\1/", $output);
		$output = $this->fullTagOpen.$output.$this->fullTagClose;
		return $output;		
	}
	function getAJAXlink( $count, $text) {
        if($this->link_func == '' && $this->contentDiv == '')
            return '<li class="page-item"><a class="page-link" href="'.$this->baseURL.'?'.$count.'"'.$this->anchorClass.'>'.$text.'</a></li>';
		
		$pageCount = $count?$count:0;
		if(!empty($this->link_func)){
			$linkClick = 'onclick="'.$this->link_func.'('.$pageCount.')"';
		}else{
			$this->additionalParam = "{'page' : $pageCount}";
			$linkClick = "onclick=\"$.post('". $this->baseURL."', ". $this->additionalParam .", function(data){
					   $('#". $this->contentDiv . "').html(data); }); return false;\"";
		}
	    return "<li class=\"page-item\"><a class=\"page-link\" href=\"javascript:void(0);\" " . $this->anchorClass . "
				". $linkClick .">". $text .'</a>';
	}
}

demo
0XGpt0.gif
 

percl

27 Ara 2018
170 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Security' Alıntı:
percl' Alıntı:
@security hocam bu tarz javascript kullanımı güvenlik açığı oluşturur mu, aklıma takıldı sorayım istedim? çünkü gelen değeri direk sql içerisinde kullanıyorum

gerekli önlemleri alırsan herhangi sorun olmaz ama genel olarak soruyorsan muhakkak güvenlik açiği meydana cıkabilir.

yorum araması kısmında sql e müdahale etmeyi denedim sql sorgusu ve javascript kullanarak, bir sıkıntı çıkmadı. metine dönüştürüyorum gelen değerleri script kullanımı yok, sqle müdahale edilmiyor. alternatif veya atladığım bir nokta var mı acaba?