защита на променлива OOP

stoqnski

Registered
в класа pagination имам :

PHP:
    public function page($page) {
        $this->page = (!isset($page) || $page < 0) ? $this->page = 1 : $this->page = $page;
    }

и там където изкарвам със mysql заявка :

$pagination->page($_GET['page']);

но на тази страница примерно: когато съм на stranica.php дава :
Notice: Undefined index: page
следователно !isset-a не бачка нещо ...
когато съм на страница stranica.php?page=1 , 2 , 3 ,4 ... и т.н.
няма проблеми
когато съм на страница stranica.php?page=' , ?page= , ?page="
дава хубава exploit-ска грешка :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right ...

чудя се дали да пробвам нещо с preg_match и след преди целия израз: (isset$page...) да сложа (int) ?
 
PHP:
    public function page($page) {
        $this->page = (!isset($page) || $page < 0) ? 1 : $page;
    }


написал си $var = (expr) ? $var = true : $var = false; - което е грешно. Горе съм ти го оправил.

по проблема ти - ако очакваш $page да е само число, или го кастни към int - (int)$page , или проверявай дали е число и изкарвай грешка ако не е. :)

т.е. $this->page = (int) $page;

ИЛИ

$this->page = is_numeric($page) ? $page : 1;
 
Как ти се вижда това

PHP:
    public function page($page_number=1) { ... }
btw ако си писал на продуктите на Borland, $page_number e private, a достъпа до нея става с public function Get_page_number && Set_page_number
3a php достатъчно е декларация в класа от типа на
PHP:
public $page_number=1;
:?:
 
ами това е целия клас :
PHP:
<?php
class pagination {
    private $d,$q,$page,$totalrows,$pagination;
    public $p;
    
    function __construct($rpp,$sql) {
        $this->rpp = $rpp; 
		$this->sql = $sql;
    }
    
    private function getTotalRows() {
        $this->d = mysql_fetch_assoc(mysql_query($this->sql));
        $this->totalrows = $this->d['allz'];
        return $this->d['allz'];
    }
    
    public function page($page) {
        $this->page = (!isset($page) || $page < 0) ? $this->page = 1 : $this->page = $page;
    }
    
    private function lastPage() {
        return ceil($this->getTotalRows() / $this->rpp);
    }
    
    public function limit() {
        return ($this->page - 1) * $this->rpp;
    }
    
    public function showPages() {
        if($this->lastPage() != "1") {
            $this->pagination = '<div id="pagination">';
            $this->d = ceil($this->getTotalRows() / $this->rpp);
            $prev = ($this->page <= 1) ? '<div class="disabled button">Предишна</div>' : '<div class="enabled button"><a href="?page='.($this->page - 1).'">Предишна</a></div>';
            $next = ($this->page >= $this->lastPage()) ? '<div class="disabled button">Следваща</div>' : '<div class="enabled button"><a href="?page='.($this->page + 1).'">Следваща</a></div>';
            $this->pagination .= $prev;
            if($this->lastPage() > 7) {
                if($this->page > 3) { $this->pagination .= '<a class="button" href="?page=1">1</a> ...'; }
                if($this->page <= 3) {
                    for($x = 1;$x<=4;$x++) { $this->pagination .= '<a class="button" href="?page='.$x.'">'.$x.'</a>'; }
                    $this->pagination .= '<div class="marg">...</div><a class="button" href="?page='.$this->lastPage().'">'.$this->lastPage().'</a>';
                } else {
                    if($this->page >= ($this->lastPage() - 4)) {
                        for($x = ($this->lastPage() - 3);$x<=($this->lastPage() - 1);$x++) { $this->pagination .= '<a class="button" href="?page='.$x.'">'.$x.'</a>'; }
                        $this->pagination .= '<a class="button" href="?page='.$this->lastPage().'">'.$this->lastPage().'</a>';
                    }
                    else { 
                        for($x = $this->page;$x<=($this->page + 4);$x++) { $this->pagination .= '<a class="button" href="?page='.($x - 1).'">'.($x - 1).'</a>'; }
                        $this->pagination .= '<div class="marg">...</div><a class="button" href="?page='.$this->lastPage().'">'.$this->lastPage().'</a>';
                    }
                }
            } else {
                for($x = 1;$x<=$this->lastPage();$x++) { $this->pagination .= '<a class="button" href="?page='.$x.'">'.$x.'</a>'; }
            }
            $this->pagination .= $next.'</div>';
            return $this->pagination;
        }
    }
}
?>

а това изкарването :

PHP:
<table border="1">
<tr><td>ID</td><td>Снимка</td><td>Име</td><td>Емайл</td><td>Телефон</td><td>Автор</td></tr>
<?php
include("../obqvi/conf.php");
include("class_pagination.php");
$rpp = 3;
$sql = "SELECT count(id) as `allz` FROM obiavi WHERE status ='1' " or die (mysql_error());
$pagination = new pagination($rpp,$sql);
$pagination->page($_GET['page']);
$query = mysql_query("SELECT * from obiavi WHERE status = '1' LIMIT ".$pagination->limit().",".$pagination->rpp."")or die (mysql_error());
while($d = mysql_fetch_assoc($query)) {
   echo '<tr><td>'.$d['id'].'</td><td><img src="../obqvi/'.$d['snimka'].'" /></td><td>'.$d['ime'].'</td><td>'.$d['email'].'</td><td>'.$d['tel'].'</td><td>'.$d['awtor'].'</td></tr>';
}
?>
</table>
<?php echo $pagination->showPages(); ?>

не знам кой е оригиналния автор , но го взех тук от уроците
 
PHP:
    public function page($page = null) {
        $this->page = ($page == null) ? 1 : (int) $page;
    }

Не съм сигурен дали ми видя поста, това трябва да ти е финалния метод. :)
 
djman каза:
PHP:
    public function page($page = null) {
        $this->page = ($page == null) ? 1 : (int) $page;
    }

Не съм сигурен дали ми видя поста, това трябва да ти е финалния метод. :)

видях го , но не стана и помислих , че бъркам , но имаш предвид да взема този код и да го заместя в класа там за тази функция ? ако е така пак не работи както трябва
 
stoqnski каза:
ако е така пак не работи както трябва
Функцията се казва page, тя има аргумен page, отделно има private page :lol: Честно казано $this->page не знам дали не се overwrite-ва
 
koko5 каза:
stoqnski каза:
ако е така пак не работи както трябва
Функцията се казва page, тя има аргумен page, отделно има private page :lol: Честно казано $this->page не знам дали не се overwrite-ва

да бе как ги кръщават тез хора :D ако знаете някой читав клас за странициране може да дадете линк , единственото ми условие е да ги прави примерно 1 2 3 ... 29 30 или 1 2 3 4 .. 30 31 .. 49 49 нещо подобно . Тук в туриста съм ги пробвал всичките и един не работи като хората и не е довършен ...
 
В този сайт на @lortnoc е най-добър скрипта за странициране и е много лесен за настройка.


П.П. http://web-tourist.net/login/login/view.php?st=2334
 
Грешката която ти изписва е, че в $_GET няма ключ с име page и няма нищо общо с метода (функцията както я наричаш) в твоя клас. Когато викаш този метод проверявай дали има $_GET['page'] .... или в крайна сметка игнорирай, защото това е просто notice.

PHP:
error_reporting (E_ALL & ~E_NOTICE);

:)

И вземи под внимание първия ми коментар, щото практически пишеш това:

PHP:
if(true)
    $var = $var = 1;
else
    $var = $var = 0;
 
не приемам каквато и да е практика за прикриване на грешки или notice или warning-и , ако едно нещо е правилно написано тези функции не трябва да ги има ...
 
stoqnski каза:
не приемам каквато и да е практика за прикриване на грешки или notice или warning-и , ако едно нещо е правилно написано тези функции не трябва да ги има ...

Дадох ти варианти ако не искаш да потискаш грешката, но ще напиша още веднъж:

това е при извикване на самия метод page() :

PHP:
if(empty($_GET['page']))
	$pagination->page(1); 
else
	$pagination->page((int)$_GET['page']);

Разбира се, може и по-компактно:

PHP:
$pagination->page(empty($_GET['page']) ? 1 : (int) $_GET['page']);

По този начин можеш да махнеш проверките за isset във самия метод. :)
 

Back
Горе