Problema script paginare

Aici prezentati probleme, intrebari, sau orice subiecte legate de scripturi si tutoriale de pe site.
duvibv
Mesaje: 14

Problema script paginare

Fiind primul meu post pe site, vreau sa ai multumesc administratorului pentru tutorialele si explicatiile pe care acesta le ofera utilizatorilor mai mult sau mai putin experimentati!
Site-ul il urmaresc de mai mult timp insa ma tot confrunt cu o problema caruia nu-i gasesc rezolvare.
Am meniul de forma

Cod: Selectaţi tot

<a href="subcategorie.php?page=11">Garsoniere/Camera</a><br>
In mysql am baza de date cu numele `anunturi' ,si acolo am categorie,subcategorie etc
Ex:Am subcategoria 11(garsoniere/camera)

Cod: Selectaţi tot

$page=$_GET['page'];
$page=$_REQUEST['page'];   
  echo '<div class="mainbody">';
 
 include "conn.php";
        $cerereSQL='SELECT anunturi.*,subcategorii.numeSc
               FROM anunturi JOIN subcategorii
               ON(anunturi.subCategorie=subcategorii.id_sub)
               WHERE id_sub='.$page.'';
$rezultat=mysql_query($cerereSQL) or die (mysql_error());
while ($rand=mysql_fetch_array($rezultat)) { 
$id=urlencode($rand["id"]);
Imi apare totul cu link-uri exact cum ma intereseaza,dar nu am paginare!
Cum pot sa fac paginarea cu modelul din modelul de pe site?

Cod: Selectaţi tot

$sql = "SELECT COUNT(*) FROM 
$sql = "SELECT * FROM `` LIMIT $offset, $rowsperpage";
Banuiesc ca aici este partea care ma intereseaza legat de paginare!
Asa arata baza mea de date:
imageshack.us/photo/my-images/338/51867746.jpg/
imageshack.us/photo/my-images/838/80835101.jpg/

Sper ca ati putut intelege ce vreau sa fac.Multumesc

MarPlo Mesaje: 4343
Salut
Ati inteles bine, cele doua select-uri sunt baza pt. paginare.

Cod: Selectaţi tot

$sql = "SELECT COUNT(*) FROM `tabel`";
$sql = "SELECT * FROM `tabel` LIMIT $offset, $rowsperpage";
 
Primul Select afla numarul total de randuri din categoria ce trebuie selectata, ca sa se poata crea numerotarea.
Al doilea Select preia din baza de date doar randurile cuprinse intre numerele $offset si $rowsperpage.

Incercati sa inlocuiti in scriptul de paginare, primul Select cu acesta:

Cod: Selectaţi tot

$sql = "SELECT COUNT(*) FROM anunturi, subcategorii WHERE anunturi.subCategorie=subcategorii.id_sub";
 
Si al doile cu acesta:

Cod: Selectaţi tot

$sql = "SELECT anunturi.*, subcategorii.numeSc FROM anunturi
 JOIN subcategorii ON(anunturi.subCategorie=subcategorii.id_sub) LIMIT $offset, $rowsperpage";
Mai departe, vedeti ce iese si daca mai trebuie schimbat /adaugat ceva.

duvibv Mesaje: 14
Va multumesc foarte mult pentru raspunsul dumneavoastra si rabdarea de care dati dovata pt fiecare user!
Am inlocuit

Cod: Selectaţi tot

$sql = "SELECT COUNT(*) FROM anunturi, subcategorii WHERE anunturi.subCategorie=subcategorii.id_sub AND id_sub=".$page."";
si aici

Cod: Selectaţi tot

$sql = "SELECT anunturi.*, subcategorii.numeSc FROM anunturi
JOIN subcategorii ON(anunturi.subCategorie=subcategorii.id_sub) WHERE id_sub=".$page." ";
Pana aici totul ok,paginarea apare,pot intra in link insa nu pot accesa pagina urmatoare!
Imi apar mai multe erori:

Cod: Selectaţi tot

Notice: Undefined index: page in C:\wamp\www\pretul zilei 06.04.2012\subcategorie.php on line 20

Cod: Selectaţi tot

Notice: Undefined index: page in C:\wamp\www\pretul zilei 06.04.2012\subcategorie.php on line 21

Cod: Selectaţi tot

Notice: 256 in C:\wamp\www\pretul zilei 06.04.2012\subcategorie.php on line 45

Cod: Selectaţi tot

Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in C:\wamp\www\pretul zilei 06.04.2012\subcategorie.php on line 46

Cod: Selectaţi tot

Notice: Undefined variable: id in C:\wamp\www\pretul zilei 06.04.2012\subcategorie.php on line 101
Din ce cred erorile imi apar deoarece el asteapta sa preia subcategorie.php?page=ceva insa cand trec la pagina a2-a imi apare de forma subcategorie.php?currentpage=2
Credeti ca este gandit prost tabelul din baza de date?Sau poate cum am gandit eu paginarea cu $page in query?

Va doresc o zi placuta,
Stima

MarPlo Mesaje: 4343
Acele erori nu au treaba cu baza de date, ci apar deoarece PHP cauta sa preia datele din URL cu index 'page', dar la formarea link-urilor de paginare, la "href" este 'currentpage'.
Incercati sa inlocuiti "currentpage=" cu "page=" in codul care formeaza link-urile, ori inlocuiti:

Cod: Selectaţi tot

$page=$_GET['page'];
$page=$_REQUEST['page'];
Cu aceasta linie de cod:

Cod: Selectaţi tot

$page=$_REQUEST['currentpage'];
 

duvibv Mesaje: 14
Din pacate nu merge nici asa!
Ma tot uitat in stanga si in dreapta si nu ai dau de cap la problema asta :(
Eu asa am in index.php(de forma)

Cod: Selectaţi tot

<?php
$page='';
if (isset($_GET['page'])) $page = $_GET['page'];?>
<body>
<div class="content"><br>
	VANZARI-CUMPARARI<br>
	<a href="subcategorie.php?page=11">Garsoniere/Camera</a><br>
	<a href="subcategorie.php?page=12">2 Camere</a><br>
	<a href="subcategorie.php?page=13">3 Camere</a><br>
	<a href="subcategorie.php?page=14">4+ Camere</a><br>
	<a href="subcategorie.php?page=15">Ansambluri rezidentiale</a><br>
	<a href="subcategorie.php?page=16">Vile,case</a><br>
	<a href="subcategorie.php?page=17">Spatii comerciale/industriale</a><br>
	<a href="subcategorie.php?page=18">Terenuri</a><br>
	<a href="subcategorie.php?page=19">Cumparari/schimburi</a><br>
Mie imi preia nr din link ex.11(garsoniere)care este si in baza de date si imi arata de acolo toate intrarile din anunturi unde subcategorie este 11.
Prima pagina o preia,dar a2-a apare de forma page=2 sau currentpage=2 el nu are ce sa preia din baza de date pt ca nu exista.

Multumesc anticipat.

MarPlo Mesaje: 4343
Cred ca trebuie sa folosesti ambii indexi 'page' si 'currentpage' in scriptul de paginare; in URL si respectiv in "href" la link-urile de paginare ("subcategorie.php?page=...&currentpage=...").
Apoi se preia asa:

Cod: Selectaţi tot

if(isset($_GET['page'])) $page = $_GET['page'];
if(isset($_GET['currentpage'])) $currentpage = $_GET['currentpage'];
 
"page" fiind pt subcategoria aleasa, iar "currentpage" pt paginarea ei.
Dar trebuie remodificat scriptul de paginare, pe la $offset, la link-uri, si nu mai stiu unde.
Spor.

duvibv Mesaje: 14
Buna Ziua.
Am facut aproape toate modificarile respective!Nu am stiut la offset ce trebuie facut!
Acum imi apar cum trebuie linkurile,de forma: subcategorie.php?page=11&currentpage=1
Nu primesc mesaje de eroare nici cand dau inainte inapoi etc.
Dar daca am la $rowsperpage sa spunem 10 rezultate si in baza de date am pana in 10 rezultate e ok!Daca am mai multe rezultate,la pagina a 2-a tot rezultate de pe prima pagina primesc!

Cod: Selectaţi tot

<?php
if(isset($_GET['page'])) $page = $_GET['page'];
if(isset($_GET['currentpage'])) $currentpage = $_GET['currentpage'];
 
$host = "localhost";    // server MySQL
$utilizator = "root"; 
$parola = "";
$numebd = "anunturi";    // nume baza de date

// Conectarea la baza de date
$conn = mysql_connect($host, $utilizator, $parola);
if (!$conn) {
  echo 'Conectare nereusita la MySQL'; 
  exit;
}

// Selectarea bazei de date
if (!mysql_select_db($numebd, $conn)) {
  echo 'Baza de date nu a putut fi selectata deoarece : '. mysql_error();
  exit;
}
// Setarea pentru format UTF-8
$sql = "SET NAMES 'utf8'";
mysql_query($sql, $conn);
// Afla cate linii sunt in tabel (MODIFICATI 'nume_tb') din baza de date  
$sql = "SELECT COUNT(*) FROM anunturi, subcategorii WHERE anunturi.subCategorie=subcategorii.id_sub AND id_sub=".$page."";
$result = mysql_query($sql, $conn) or trigger_error(E_USER_ERROR);  
$r = mysql_fetch_row($result);  
$numrows = $r[0];  
 
// Stabileste numarul de linii din tabel afisate in pagina 
$rowsperpage = 8;  
// afla numarul total necesar de pagini 
$totalpages = ceil($numrows / $rowsperpage);        // ceil face rotunjire la int. maxim
 
// Obtine pagina curenta sau seteaza default 
if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage']))  {  
  // seteaza variabila ca int 
  $currentpage = (int) $_GET['currentpage'];  
} else {  
  // pagina care este initial afisata (pagina default) 
  $currentpage = 1;  
}
 
// daca pagina curenta e mai mare decat total pagini...
if ($currentpage > $totalpages) {  
  // seteaza pagina curenta la ultima pagina  
  $currentpage = $totalpages;  
} 
// daca pagina curenta e mai mica decat prima pagina...  
if ($currentpage < 1) {  
  // seteaza pagina curenta la prima pagina   
  $currentpage = 1;  
} 
 
// lista cu pagini, in functie de pagina curenta   
$offset = ($currentpage - 1) * $rowsperpage;  
 
// obtine datele din tabel (MODIFICATI 'nume_tb') din baza de date  
$sql = "SELECT anunturi.*, subcategorii.numeSc FROM anunturi
JOIN subcategorii ON(anunturi.subCategorie=subcategorii.id_sub) WHERE id_sub=".$page." ";
$result = mysql_query($sql, $conn) or trigger_error(E_USER_ERROR);  
 
// parcurgerea matricei cu datele obtinute 
while ($list = mysql_fetch_assoc($result)) {  
    
  // - MODIFICATI numele coloanelor tabelului ('id' si 'texte')
  // Stocheaza datele returnate de MySQL in variabile array pt. fiecare coloana
  $id[] = $list['id'];
  $text[] = $list['subCategorie'];
  $a[] = $list['continut'];
  $b[] = $list['tipPret'];
  $c[] = $list['email'];
  $d[] = $list['telefon'];
  $e[] = $list['valid'];
}
mysql_close();    // Incheie conexiunea cu mysql

/*** Afisarea datelor obtinute ***/
// Parcurge variabilele array setate in bucla WHILE


for($i=0; $i<count($id); $i++) {

  // Aici puteti adauga cod HTML pentru aspectul grafic al afisarii?>
  <div class='anunt'> <a href=/layer%2023.07.2011/anunt.php?id=<?php echo $id[$i]; ?> <b>titlu:</b><?php echo $a[$i]; ?><br></div>

 
  <?php 

}

/*** Construirea link-urilor pt. paginare ***/ 
// raza nr. link-uri din jurul celui curent 
$range = 3;
 
// Link-uri inapoi, daca pagina curenta nu e prima
if ($currentpage > 1) {  
  // arata << pt. link la prima pagina  
  echo " <a href='{$_SERVER['PHP_SELF']}?page=$page&currentpage=1'><<</a> &nbsp; ";  
  // obtine nr. pagina din urma 
  $prevpage = $currentpage - 1;  
  // arata < pt. link la o pagina in urma 
  echo " <a href='{$_SERVER['PHP_SELF']}?page=$page&currentpage=$prevpage'><</a> &nbsp;";  
} 
 
// definirea link-urilor din raza paginii curente
for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++) {  
  // daca e un nr. de pagina valid ... 
  if (($x > 0) && ($x <= $totalpages)) {  
     // daca nr. e pagina curenta ...  
     if ($x == $currentpage) {  
        // afiseaza nr. pagina fara a fi link  
        echo " [<b>$x</b>] ";  
     // daca nr. nu e pagina curenta ...  
     } else {  
        // il face link  
    echo " <a href='{$_SERVER['PHP_SELF']}?page=$page&currentpage=$x'>$x</a> ";  
     }  
  }
}
          
// Daca pagina curenta nu e ultima, afiseaza link inainte si spre ultima pagina
if ($currentpage != $totalpages) {  
  // obtine pagina urmatoare 
  $nextpage = $currentpage + 1;  
   // arata > pt. urmatoarea pagina   
  echo "&nbsp; <a href='{$_SERVER['PHP_SELF']}?page=$page&currentpage=$nextpage'>></a> ";  
  //  arata >> pt. ultima pagina
  echo " &nbsp; <a href='{$_SERVER['PHP_SELF']}?page=$page&currentpage=$totalpages'>>></a> ";  
}
?>
Stiti cumva o rezolvare pentru aceasta problema?Scuze daca sunt prea insistent!
Va doresc o zi placuta,
Multumesc

Edit:
Revin la eroarea respectiva!
In prima faza am uitat sa completez in query LIMIT $rowsperpage,$offset.
Acum la: subcategorie.php?page=11&currentpage=1
(Notice: Undefined variable: id in C:\wamp\www\pretul zilei 06.04.2012\subcategorie.php on line 102)
adica aici : for($i=0; $i<count($id); $i++) {
Pagina a-2a o afiseaza corect. ( subcategorie.php?page=11&currentpage=2 )
Pagina a-3a imi ia pagina a2a+pagina a3a! ( subcategorie.php?page=11&currentpage=3 )
Pagina a-4-a imi ia pagina a2a+pagina a3a+pagina a4a! ( subcategorie.php?page=11&currentpage=4 )
Deci sirul ar continua in felul asta!

MarPlo Mesaje: 4343
Eroarea: Notice: Undefined variable: id in ... indica faptul ca variabila $id nu e definita.
Din ce se vede in cod, $id e creata cu date selectate din baza de date. Daca select-ul nu returneaza vreun rand, $id nu mai e creat; asta ar fi cauza.
De ce nu returneaza vreun rand la apelarea acelei adrese, nu stiu; dar ca sa nu mai apara eroarea, poti declara /crea variabila inainte de parcurgerea randurilor cu while():

Cod: Selectaţi tot

$id = array();
while ($list = mysql_fetch_assoc($result)) {
  $id[] = $list['id'];
  // ...
}
 
La cealalta problema, inverseaza $offset si $rowsperpage la LIMIT:

Cod: Selectaţi tot

LIMIT $offset, $rowsperpage

duvibv Mesaje: 14
Marplo multumesc foarte mult pentru ca m-ai ajutat la problema cu paginarea!
In sfarsit merge totul perfect!
Dupa ce am inversat offset cu rowsperpage merge perfect totul!
Numai bine,esti un adevarat domn!

dim Mesaje: 61
Salut
Scriptul tau cred ca este facut pentru PHP 4, PHP 5
Eu am instalat PHP 5.5 si imi da eroare

Cod: Selectaţi tot

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in ...
Am citit ca noua versiune nu mai foloseste MySQL
crezi ca poti modifica scriptu si pentru versiunea noua???
Multumesc

MarPlo Mesaje: 4343
Salut
Incearca scriptul de paginare de la adresa: https://marplo.net/php-mysql/clasa-p ... -php , foloseste MySQLi, si in plus poate pagina si date din Array, sau dintr-un sir cu continut-text mare.

dim Mesaje: 61
Multumesc pentru sfat
Am incercat scriptul si pare ok doar ca eu am o pagina prin care ma conectez la baza de date (bd.php) si as dori sa stiu daca pot sa scap de array de conectare

Cod: Selectaţi tot

/* Array pentru conectare la baza de date MySQL (serverul MySQL, utilizator, parola, baza_de_date) */
  protected $mysql = array(
   'host'=> 'localhost',
   'user'=> 'root',
   'pass'=> 'parola',
   'dbname'=> 'nume_baza_date'
  );
Am incercat sa il scot si sa il inlocuiec cu include 'bd.php'; dar nu functioneaza imi spune ca nu am baza de date selectata

Subiecte similare