Witam , o to mój pierwszy skrypt do oceny na tym forum ( i w sumie pierwszy większy który dotychczas napisalem - php zajalem sie dopiero miesiąc temu ). Służy on do dzielenia , pobranych z bazy danych wyników na podstrony ( za operacje zwiazane z baza danych odpowiedzialna jest pierwsza klasa "Sql" do ktorej takze prosilbym o rady
Kilka moich uwag .
- Prosze wszystkie swoje zastrzeżenia zapisać niezależnie od tego jak błache lub jak ostre będą (IMG:
style_emoticons/default/smile.gif) .
- Komentarze sa po polsku gdyz bardzo sie spieszylem w napisaniu ich ; ) .
- Za literowki przepraszam ( patrz punkt wyzej ).
- W kilku miejscach miesza sie jezyk polski z jezykiem angielskim ( np zmienne sa po angielsku a niektore komunikaty po polsku ) . Tym takze zajme sie jak juz bede mogl
- Kod testowany przy pomocy apache dziala poprawnie .
To tyle slowem wstepu.
<?php
abstract class Pagination
{
/** Zmienna zawierajaca wyniki zwrocone przez baze danych
*/
var $results;
/** Zmienna zawierajaca wartosc okreslajaca limit wynikow na 1 stronie
*/
var $limit;
/** Zmienna zawierajaca pelny adres strony www ktora ma zostac poddana dzialaniu poszczegolnych funkcji
*/
var $www_name;
/** Zmienna zawierajaca wartosc okreslajaca ilosc podstron
*/
var $pages;
/** Zmienna zawierajaca kopie polaczenia z baza danych
*/
var $sql_connection;
/** Zmienna zawierajaca numer ostatniej podstrony
*/
var $last_page;
/** Zmienna zawierajaca numer pierwszej podstrony
*/
var $first_page;
/** Zmienna zawierajaca zapytanie ktore zostanie uzyte do wyswietlenia odp ilosci wynikow na strone( np wprowadzamy
'SELECT * from registered_users order by user_id' do tego zapytania zsostanie dodana odp linijka,
*/
var $question_limit;
/** Zmienna zawierajaca zapytanie ktore zostanie uzyte do wyliczenia wymaganej ilosci podstron np
' SELECT * from registered_users '
*/
var $question_all;
/** Funkcja odpowiedzalna za pobranie odpowiednich parametrow i sprawdzenie ich wartosci
* @parametr $data(Tablica zawierajaca kolejno ,
* pelna nazwe strony ktora zostanie podzielona na podstrony,
* zapytanie ktore zostanie uzyte do wyswietlenia odp ilosci wynikow na strone( np wprowadzamy
'SELECT * from registered_users order by user_id' do tego zapytania zostanie dodana odp linijka,
* zapytanie ktore zostanie uzyte do wyliczenia wymaganej ilosci podstron np ' SELECT * from registered_users ',
* limit wynikow na jednej podstronie
* @parametr $sql_connection( Zmienna zawierajaca kopie polaczenia z baza danych)
*/
public function create($data = '' , $sql_connection)
{
$this->www_name = $data[0];
$this->question_limit = $data[1];
$this->question_all = $data[2];
$this->limit = $data[3];
$this->sql_connection = $sql_connection;
$sql_connection->disconnect();
try
{
if(!isset($this->www_name) || empty($this->www_name)) {
throw new Exception('Nie podano wartosci zmiennej www_name');
}
if(!isset($this->question_limit) || empty($this->question_limit)) {
throw new Exception('Nie podano wartosci zmienniej question_all');
}
if(!isset($this->question_all) || empty($this->question_all)) {
throw new Exception('Nie podano wartosci zmienniej question_all');
}
{
throw new Exception('Nie podano wartosc zmiennej limit');
}
if(!isset($this->sql_connection) || empty($this->sql_connection)) {
throw new Exception('Nie podano wartosci zmiennej sql_connection');
}
}
catch (Exception $e)
{
}
$sql = $this->sql_connection;
$sql->question($this->question_all);
$this->results = $sql->num_rows();
/** Przypisanie odp wartosci do zmiennych pages i results
*/
/** Jezeli ilosc wynikow na ostatniej stronie jest mniejsza niz wartosc zmiennej limit
*/
if(($this->results)%($this->limit))
{
/** $last_page - zmienna okreslajaca ilosc wyniko na ostatniej stronie
*/
$last_page = $this->results % $this->limit;
/** Obliczenie potrzebnej ilosc podstron
* Przyklad
* Ilosc wynikow = 23
* Limit wynikow na stronie = 4
* Ilosc wynikow na ostatniej stronie(obliczona wczesniej) = 3
* ILOSC PODSTRON = ((23-3)/4)+1 = 6
*/
$this->pages = ((($this->results-$last_page)/$this->limit)+1);
}
/** Jezeli nie jest mniejsza czyli jest rowna
*/
else
{
$this->pages = $this->results / $this->limit;
}
$this->last_page = $this->pages;
$this->first_page = 1;
}
abstract protected function make($fields='');
}
class NewsPagination extends Pagination
{
/** Funkcja odpowiedzalna za wyswietlenie wynikow i podzielelnie ich na podstrony
* @parametr $fields jest odpowidzialny za zamiane domyslnych pol "field" z bazy danych podczas wyswietlania wynikow
*/
public function make($fields='')
{
{
$id = $_GET['page'];
}
else
{
$id = 1;
}
/** Aktualizacja zapytania question_limit tak aby nadawalo sie do wyswietlania odp ilosc wynikow
*/
$this->sql_connection->question($this->question_limit.' LIMIT '.(($id*$this->limit)-4).','.$this->limit.';');
/** Wyswietlenie wynikow na stronie
*/
$this->sql_connection->write_news($fields,'news',$www_name);
/** Kod odpowiedzialny za stronicowanie wynikow
*/
/** Jezeli w adresie wartosc $_GET['page'] jest poza zakresem podstron ( np ktos ja tam wpisal ) to skrypt
* nie wyswietla nic
*/
if($id<1
|| $id>$this->last_page){ exit; } echo '<div class="pagination">'; echo '<a href="'.$www_name.'?page=1"> <<< </a>';
/** Jezeli jestesmy na pierwszej podstronie to link POPRZEDNIA przekieruje nas do tej podstrony
*/
if($id==1)
{
echo '<a href="'.$www_name.'?page='.$id.'">POPRZEDNIA</a>'; }
/** Jezeli nie to zostaniemy przekierowani do podstrony o numerze o 1 mniejszym
*/
else
{
echo '<a href="'.$www_name.'?page='.($id-1).'">POPRZEDNIA</a>'; }
echo '    '; /** Jezeli jestesmy na ktorejs z podstron o numerach [1,6] to wykonaj
*/
if($id<=6)
{
/** Jezeli jest mniej niz 10 podstron wynikow to wykonaj
*/
if($this->last_page<10)
{
/** Petla wypisujaca podstrony z przedzialu [1,strona ostatnia]
*/
for($i=1;$i<=$this->last_page;$i++)
{
/** Numer strony na ktorej jestesmy zostanie dodatkowo odsuniety spacjami od sasiadujacych numerow
*/
if($id==$i)
{
echo '<a href="'.$www_name.'?page='.$i.'" style="color: red;">['.$i.']</a>'; }
/** Reszta linkow zostanie zapisana normalnie
*/
else
{
echo '<a href="'.$www_name.'?page='.$i.'">['.$i.']</a>'; }
}
}
/** Jezeli jest wiecej niz 10 podstron wynikow
*/
else
{
/** Petla wypisujaca podstrony z przedzialu [1,10]
*/
for($i=1;$i<=10;$i++)
{
/** Dzialamy analogicznie jak w czesci powyzej
*/
if($id==$i)
{
echo '<a href="'.$www_name.'?page='.$i.'" style="color: red;">['.$i.']</a>'; }
else
{
echo '<a href="'.$www_name.'?page='.$i.'">['.$i.']</a>'; }
}
}
}
/** Jezeli jestesmy na podstronie oddalonej od strony ostatniej o 5 wynikow lub wiecej to wykonaj
*/
else if($id >= $this->last_page-5)
{
/** Petla dzieki ktorej nie wyswietla sie numery podstron wiekszych od numeru ostatniej podstrony
*/
for($i=($id-5);$i<=($this->www_name);$i++)
{
/** Dzialamy analogicznie jak w czesci powyzej
*/
if($id == $i)
{
echo '<a href="'.$www_name.'?page='.$i.'" style="color: red; ">['.$i.']</a>'; }
else
{
echo '<a href="'.$www_name.'?page='.$i.'">['.$i.']</a>'; }
}
}
/** Jezeli jestesmy na stronie z przedzialu [7,ostatnia_strona-6]
*/
else
{
for($i=($id-5);$i<=($id+5);$i++)
{
if($id == $i)
{
echo '<a href="'.$www_name.'?page='.$i.'" style="color: red; ">['.$i.']</a>'; }
else
{
echo '<a href="'.$www_name.'?page='.$i.'">['.$i.']</a>'; }
}
}
echo '    '; if($id == $this->last_page)
{
echo '<a href="'.$www_name.'?page='.$this->last_page.'">NASTEPNA</a>'; }
else
{
echo '<a href="'.$www_name.'?page='.($id+1).'">NASTEPNA</a>'; }
echo '<a href="'.$www_name.'?page='.$this->last_page.'"> >>> </a>';
}
}
?>
A tutaj wrzucam kod klasy Sql ( w pierwszym poscie nie bylo miejsca )
class Sql
{
/** ZMIENNA ZAWIERAJACA NAZWE HOSTA
*/
var $db_host;
/** ZMIENNA ZAWIERAJACA LOGIN UZYTKOWNIKA DO BAZY DANYCH
*/
var $db_login;
/** ZMIENNA ZAWIERAJACA HASLO UZYTKOWNIKA DO BAZY DANYCH
*/
var $db_password;
/** ZMIENNA ZAWIERAJACA NAZWE WYBRANEJ BAZY DANYCH
*/
var $db_name;
/** ZMIENNA ZAWIERAJACA REZULTAT Z PROBY POLACZENIA Z BAZA DANYCH
*/
var $db_connection;
/** ZMIENNA ZAWIERAJACA REZULTAT WYSLANIA ZAPYTANIA DO BAZY DANYCH W POSTACI TABLICY
*/
var $db_result = array();
/** ZMIENNA ZAWIERAJACA TABLICE REKORDOW
*/
var $db_records = array();
var $db_lastid;
/** ZMIENNA ZAWIERAJACA ZAPYTANIE WYSLANIE DO BAZY DANYCH
*/
var $db_question;
/** FUNKCJA ODPOWIADAJACA ZA WYPISANIE KOMUNIKATU O BLEDZIE
*/
var $db_data = '';
function error()
{
}
/** FUNKCJA ODPOWIEDZIALNA ZA NAWIAZANIE POLACZENIA Z BAZA DANYCH
* @param $db_name - zmienna przechowujaca nazwe bazy danych
*/
function connect($db_data)
{
$this->db_data = $db_data;
$this->db_host = $db_data[0];
$this->db_login = $db_data[1];
$this->db_password = $db_data[2];
$this->db_name = $db_data[3];
try
{
if(!isset($this->db_name) || empty($this->db_name)) {
throw new Exception('Wartosc zmiennej db_name jest nieprawidlowa!');
}
if(!isset($this->db_host) || empty($this->db_host)) {
throw new Exception('Wartosc zmiennej db_host jest nieprawidlowa!');
}
if(!isset($this->db_login) || empty($this->db_login)) {
throw new Exception('Wartosc zmiennej db_login jest nieprawidlowa!');
}
if(!isset($this->db_password) || empty($this->db_password)) {
throw new Exception('Wartosc zmiennej db_password jest nieprawidlowa!');
}
}
catch(Exception $e)
{
echo '<br/ >Problem : '.$e->getmessage().'<br />'; return false;
}
$this->db_connection = new mysqli($this->db_host,$this->db_login,$this->db_password);
$connection = $this->db_connection;
{
$connection->select_db($this->db_name);
return true;
}
else
{
$this->error();
return false;
}
}
/** FUNKCJA ODPOWIEDZIALNA ZA WYSLANIE ZAPYTANIA DO BAZY DANYCH
* @param $db_question - zmienna przechowujaca zapytanie do bazy danych
*/
function question($db_question)
{
{
$this->db_question = $db_question;
if(isset($this->db_connection) && !empty($this->db_connection)) {
$connection = $this->db_connection;
$this->db_result = $connection->query($db_question);
if(isset($this->db_result) && !empty($this->db_result)) {
return true;
}
else
{
$this->error();
return false;
}
}
else
{
$this->error();
return false;
}
}
else
{
echo 'Wartosc zmiennej db_question jest niepoprawna !'; return false;
}
}
/** FUNKCJA ODPOWIEDZIALNA ZA PRZYPISANIE WYNIKOW DO ODP ZMIENNEJ (OTRZYMANYCH W WYNIKU ZAPYTANIA DO ODP ZMIENNEJ)
*/
function fetch()
{
if(isset($this->db_result) && !empty($this->db_result)) {
$record = $this->db_result->fetch_array();
{
$this->db_records = $record;
return $record;
}
else
{
$this->error();
return false;
}
}
else
{
return false;
}
}
/** FUNKCJA ODPOWIADAJACA ZA PODANIE ILOSCI "num_rows"
*/
function num_rows()
{
return $this->db_result->num_rows;
}
/** FUNKCJA ODPOWIADAJACA ZA WYPISANIE WYNIKOW Z BAZY DANYCH NA EKRANIE
* @param $fields - zmienna przechowujaca tablice nazw pol ktorych chcemy uzyc jako alternatywe dla pol
* typu "field" z bazy danych mysql
* @param $table - zmienna przechowujaca nazwe columny
*/
function write($fields = '',$table='')
{
$sql = new Sql();
$sql->connect($this->db_data);
$sql->question('SHOW COLUMNS from '.$table);
$amount_of_fields = count($fields);
{
for( $n = 0 ; $n < $amount_of_fields ; $n++)
{
$field[$n] = $sql->fetch();
}
while($row = $this->fetch())
{
$column = 0;
echo '<div style="margin:0; padding:0; width: 550px; border: 1px solid #0e44f6;">'; for($i = 0; $i<$amount_of_fields; $i++)
{
if($column == 0)
{
echo '<div style="margin:0; padding:0; width: 550px; background-color:#93ffc1">'; echo $fields[$i].' : '.$row[$field[$i]['Field']].'<br />'; $column++;
}
else if($column == 1)
{
echo '<div style="margin:0; padding:0; width: 550px; background-color:#93acff">'; echo $fields[$i].' : '.$row[$field[$i]['Field']].'<br />'; $column--;
}
}
}
}
else
{
for( $i = 0 ; $i < ($sql->num_rows()+1) ; $i++)
{
$field[$i] = $sql->fetch();
}
while($row = $this->fetch())
{
for($i = 0; $i < $sql->num_rows() ; $i++)
{
echo $field[$i]['Field'].' : '.$row[$field[$i]['Field']].'<br />'; }
}
}
}
/** FUNKCJA ODPOWIADAJACA ZA ZMIANE BAZY DANYCH
* @param $db_name - zmienna przechowujaca nazwe bazy danych do ktorej chcemy sie przelaczyc
*/
function change_database($db_name)
{
$this->db_name = $db_name;
$this->disconnect();
$this->connect($db_name);
}
/** FUNKCJA ODPOWIADAJACA ZA ROZLACZENIE SIE Z BAZA DANYCH
*/
function disconnect()
{
{
$db_result->free();
}
}
}
Ten post edytował snuffix 22.10.2009, 15:25:18