Cautare+paginare mici probleme

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

sad3
PHPRomania Supporter
Mesaje: 14
Membru din: Lun Mar 22, 2010 7:22 pm
Contact:

Cautare+paginare mici probleme

Mesajde sad3 » Vin Noi 19, 2010 9:46 pm

Salutare.
Problema pe care o am este la paginare.
Atasez urmatorul cod dupa care detaliez problema.
Imi cer scuze ca am afisat tot codul, dar nu stiu exact unde este problema, iar in caz ca se rezolva o sa ramana pentru cei care cauta asa ceva.

Cod: Selectaţi tot

<form name="form" action="cautare.php" target="_blank" method="post">
  <input type="text" name="q" />
  <input type="submit" name="Submit" value="Cauta" />
</form>


Cod: Selectaţi tot

<?php
session_start();
 $_SESSION['q']= $_POST['q'];
echo $_SESSION['q'];

$var = $_SESSION['q'] ;
$trimmed = trim($var);
 
mysql_connect("localhost","user","pass");

mysql_select_db("database") or die("Unable to select database");

 $rows_per_page = 30;
 
 $page = $_GET['page'];
 $offset = (!empty($page)) ? $page : $page = 1;
 
 $self = $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
 $self = str_replace("page={$offset}", "", $self);
 
 $offset = ($page) ? ($page - 1) * $rows_per_page : 0;
 $query = "SELECT * ".
 "FROM tabel ".
 "WHERE camp LIKE \"%$trimmed%\"".
 "ORDER BY id ".
 "LIMIT {$offset},{$rows_per_page}";
 $result = mysql_query($query);
 
// GET NUMBER OF PAGES
 $ltq = mysql_query("SELECT * FROM tabel WHERE camp LIKE \"%$trimmed%\" ORDER BY id");

 $listings_total = mysql_num_rows($ltq);
 $NumPgs = ceil($listings_total / $rows_per_page);
?>
 
 <div><strong>Rezultatele </strong></div>

 <?php while($row = mysql_fetch_array($result)){ ?>

 <div >
<?
$title=$row['camp'];
$final = $title;
echo "<a href=\" $final\" target='_blank'>$title</a><br/>" ;
session_destroy();
?>
</div>

 <?php } ?>

 <span style="float:right">
 <?=$prev = ($NumPgs > 0 && $page!=1) ? "<a href=\"{$self}page=".($page-1)."\">&lt;&lt;Prev</a>&nbsp;&nbsp;":
 "&lt;&lt;Prev&nbsp;&nbsp;"; ?>

 [Page <?php echo $page; ?>]
 <?=$next = ($page < $NumPgs) ? "<a href=\"{$self}page=".($page+1)."\">&nbsp;&nbsp;Next&gt;&gt;</a>":
 "&nbsp;&nbsp;Next&gt;&gt;";?>&nbsp;
 </span>

 <b>&nbsp;<?=$offset+1?> la <?=$offset+$rows_per_page?>, din <?=$listings_total?> Afisari</b>
</div>
</div>



Eh si acum detalii:

La afisarea initiala a cautarii totul pare ok pana se apasa pe linkul pentru pagina urmatoare.
Cand am apasat pe link, din tabel dispare cautarea facuta de user si sunt afisate toate rezultatele ca si cum la interogare a fost folosit doar "SELECT * tabel" fara nici o alta cauza.
Eu banuiesc 2 motive:

1.Din cauza ca variabila 'q' obitnuta din formul initial se pierde la apasarea linkului Next, iar pe a doua pagina este afisat rezultatul unei interogari goale.

2.Din cauza ca s-a strecurat o mica greseala in script sau in sqlquery pe care nu reusesc sa o dibuiesc.

Acum evident si rugaminti:
Daca va dati seama ce anume gresesc va rog sa ma luminati :).

Eu banuiesc ca trebuie folosit un cookie sau o sesiune dar nu reusesc sa implementez nici una din ele.

Multumesc ca m-ati suportat.



l33t
Senior Member
Mesaje: 216
Membru din: Sâm Mai 10, 2008 7:31 pm

Mesajde l33t » Sâm Noi 20, 2010 3:03 am

Ai cateva greseli in modul in care ai gandit cautarea / paginarea, nu cred ca vrei sa reinventezi roata.
1. formularul ar trebui sa fie trimis prin get, nu prin post
astfel vei avea $_GET['q'] si un url: cautare.php?q=...
2. nu se foloseste session, nici cookie, nu ai nevoie de ele
bucata asta, ma cam depaseste, nu inteleg ce vrei:

Cod: Selectaţi tot

$page = $_GET['page'];
 $offset = (!empty($page)) ? $page : $page = 1;
 
 $self = $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
 $self = str_replace("page={$offset}", "", $self);
 
 $offset = ($page) ? ($page - 1) * $rows_per_page : 0;

atunci cand folosesti o variabila, verifica si tu ca este setata, in cazul tau $page nu este setat, poti afisa erorile cu

Cod: Selectaţi tot

ini_set('display_errors', 1); error_reporting(E_ALL);

3. pentru GET NUMBER OF PAGES foloseste in mysql count, este mai rapid
4. pentru stringuri poti folosi atat apostrof cat si ghilimele, iti recomand sa folosesti in PHP apostrof si in HTML ghilimele
astfel:

Cod: Selectaţi tot

echo "<a href=\" $final\" target='_blank'>$title</a><br/>" ;

devine:

Cod: Selectaţi tot

echo '<a href="'.$final.'" target="_blank">'.$title.'</a><br/>' ;

mie mi se pare mai curat sa concatenezi, decat sa faci escape pentru ghilimele
5. nu mai folosi short tags, incepand cu php 5.2 sunt dezactivate default, pentru ca sunt invechite; iar forma scurta a lui if nu o recomand, pentru ca o folosesti si cu o atribuire si te complici
6. nu ai nevoie de $_SERVER pentru ca ai $_GET, au aceleasi valori - self fiind cautare.php
7. incearca sa folosesti mysql_real_escape_string , url_encode/decode , htmlspecialchars si alte functii de verificare -> pentru $page ai is_int

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Mesajde Birkoff » Sâm Noi 20, 2010 4:04 am

te poti inspira si din tutorialele de aici eventual poti folosi una din clasele de paginare de acolo
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

sad3
PHPRomania Supporter
Mesaje: 14
Membru din: Lun Mar 22, 2010 7:22 pm
Contact:

Mesajde sad3 » Sâm Noi 20, 2010 3:50 pm

Multumesc pentru raspunsul prompt.
Am tinut cont am schimbat Post in GET. ideea e ca la a 2-a , a n-a pagina "q" nu ramane in ecuatie.
Am schimbat si paginarea sa fie una mai simplista, ca sa imi dau seama ce gresesc, dar tot nu ii dau de capat.

Ideea e:
am 2 variabile
variabila "q" pe care o obtin din inputul userului in form.
variabila "start" care este pentru paginare. si am definit asa:

Cod: Selectaţi tot

$q = $_GET['q'];
$start = $_GET['start'];
if (!$start)
    $start = 0;
    echo 'q="'.$q.'" ' ;
    echo 'start="'.$start.'" ' ;


iar codul de paginare:

Cod: Selectaţi tot


$prev = $start - $rows_per_page;
$next = $start + $rows_per_page;

if (!($start<=0))
echo "<a href = 'pagina.php?start=$prev'>Prev </a>" ;

$i=1;
for ($x=0;$x<$listings_total;$x=$x+$rows_per_page)
{
  if ($page!=$x)
    echo " <a href='pagina.php?start=$x'>$i</a> ";
 else
    echo " <a href='pagina.php?start=$x'><b>$i</b></a> ";
 $i++;

}

if (!($start>=$listings_total-$rows_per_page))
echo "<a href = 'pagina.php?start=$next'> Next</a>" ;
?>
<div align = "right">
<?php
echo " $listings_total rezultate";



afisarea initiala e ok , dar pe a doua pagina q devine nul.
cum fac sa pastrez valoarea lui q?
De asta ziceam de cookie sau sesiune, ma gandeam ca pot salva q in cookie sau ceva de genul.

Multam. Si ca sa va faceti o idee, poate nu sunt explicit puteti verifica la :

www . dauanunturi . ro /cautare.php si incercati o cautare dupa a , b, sau c , etc ...
Ultima oară modificat Sâm Noi 20, 2010 6:01 pm de către sad3, modificat 1 dată în total.

sad3
PHPRomania Supporter
Mesaje: 14
Membru din: Lun Mar 22, 2010 7:22 pm
Contact:

Mesajde sad3 » Sâm Noi 20, 2010 5:59 pm

Am rezolvat intre timp.
Toata chestia era ca nu atribuiam si valoarea q la paginatie iar ea se pierdea pe drum.
Pentru alti useri pun codul final si declar topicul inchis.
Multumesc si bafta.

Cod: Selectaţi tot

echo "<a href = 'pagina.php?start=$next'> Next</a>";


o sa fie asa:

Cod: Selectaţi tot

echo "<a href = 'pagina.php?start=$next&q=$q'> Next</a>" ;

l33t
Senior Member
Mesaje: 216
Membru din: Sâm Mai 10, 2008 7:31 pm

Mesajde l33t » Sâm Noi 20, 2010 6:25 pm

Ok, hai sa-ti spun cum vad eu paginarea:
1. ai 2 variabile: $q si $pagina pe care le iei prin get, vei avea un url de forma cautare.php?q=ceva&pagina=3, daca $pagina nu exista il consideri 0
aici ai grija sa stii ca prima este 0 iar ultima este n-1
2. ai un $offset - numarul de randuri afisate
3. ai un $count numarul total de randuri pe care ti-l gaseste query-ul
4. query-ul il faci cu limit de $offset * $pagina , $offset astfel daca ai $pagina 3 (adica este a patra pagina - 0 fiind prima) si iti afiseaza 10 randuri, vei avea limit 30,10
5. pentru next si previous, dupa verificarile de rigoare, sa nu fie prima sau ultima pagina, vei avea un link de forma cautare.php?q=$q&pagina=($pagina-1) sau pagina=($pagina+1) cuvantul cautat, il transmiti ca parametru in link, d-asta ti-am spus sa folosesti get


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 15 vizitatori