Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Tatuator handpoke

Plaja de nudisti in Grecia?

Mufa microusb a telefonului mobil...

"Ciudatenii" control pasa...
 Impamantare

Apple maps pe Windows 10

Sfarsitul woke-ismului si al core...

Renovare completa + pompa de cald...
 Libre Office nu vad liniile

Modalitați amuzante și ...

O disparitie de ani buni, Acces D...

Mancarea e scumpa
 Parere achiziționare BMW G20

Schimbarea bateriei moderne la VA...

Rostschreck Lidl

Si noi suntem Florin Piersic? / J...
 

Probleme la afiserea rezultatelor din numararea paginilor

- - - - -
  • This topic is locked This topic is locked
14 replies to this topic

#1
Nsilviu

Nsilviu

    Junior Member

  • Grup: Members
  • Posts: 99
  • Înscris: 25.06.2008
Salut problema mea este urmatorea:
Am o functie de imparte rezultatele pe pagini..
Problema este la afiserea rezultatelor
Am urmatorul cod:
include('ttt_files/paginare.php');  
$rezultate_pe_pagina = '2';
		$statement = "`anunt_standard` where `activat` = 0  AND prs_prv='$filtru_p' ";
/* Inceputul stabiliri functiei numaratorelor */
	  $page = (int) (!isset($_GET["page"]) ? 1 : $_GET["page"]);
	   $limit = $rezultate_pe_pagina;
	   $startpoint = ($page * $limit) - $limit;
//Query pentru afisere si paginare
/* Sfarsitul stabiliri functiei numaratorelor */
$url = "{$server_url}anunturi/f/{$_GET['f']}/page/";
   echo "<div id='asezare_butoane'>".pagination($statement,$limit,$page,$url)."</div>";
  
  
//afiseaza inregistrarile platite
			$query_pay = mysql_query("SELECT * FROM {$statement} AND activat_plata = '1' AND sters = '0' ORDER BY data_adaugare DESC  LIMIT {$startpoint} , {$limit}");
		  
		 echo "<table border='0' width='950px' style='border-collapse:separate; border-spacing:0px 5px;'>";
		
		 $i = 0;
		
		   while ($row = mysql_fetch_assoc($query_pay)) {
			include('continut_platit.php');
		
			}
		
		 echo "</table>";
//afiseaza inregistrarile normale
			$query = mysql_query("SELECT * FROM {$statement} AND sters = '0' AND activat_plata = '0' ORDER BY data_adaugare DESC LIMIT {$startpoint} , {$limit}");
		  
		 echo "<table border='0' width='950px' style='border-collapse:separate; border-spacing:0px 5px;'>";
		
		 $i = 0;
		
		   while ($row = mysql_fetch_assoc($query)) {
			include('continut.php');
		
			}
		
		 echo "</table>";
		
//afiseaza inregistrarile sterse
			$query_del = mysql_query("SELECT * FROM {$statement} AND sters = '1' ORDER BY data_adaugare DESC LIMIT {$startpoint} , {$limit}");
		  
		 echo "<table border='0' width='950px' style='border-collapse:separate; border-spacing:0px 5px;'>";
		
		 $i = 0;
		
		   while ($row = mysql_fetch_assoc($query_del)) {
			include('continut_sters.php');
		
			}
		
		 echo "</table>";
		

Problema este ca el nu afiseaza 2 rezultate pe pagina cum este setat acuma ci afiseaza cate 2 rezultate din fiecare query adica Afiseaza in total 6 rezultate:
2 - $query_pay
2 - $query
2 - $query_del
Dar numi dau seama cum sa fac sa afiseze decat cate 2 de exemplu e prima pagina daca sunt introduse 2 inregistrari 'pay' sa le afiseze decat pe alea 2..Sau daca sunt decat 2 inregistrari la query sa le afiseze decat pe acele 2:(
Functia pentru paginare
<?php
   function pagination($query, $per_page = 10,$page = 1, $url = '?'){  
	   $query = "SELECT COUNT(*) as `num` FROM {$query}";
	   $row = mysql_fetch_array(mysql_query($query));
	   $total = $row['num'];
		$adjacents = "2";
	   $page = ($page == 0 ? 1 : $page);
	   $start = ($page - 1) * $per_page;					   
	 
	   $prev = $page - 1;					
	   $next = $page + 1;
		$lastpage = ceil($total/$per_page);
	   $lpm1 = $lastpage - 1;
	  
	   $pagination = "";
	   if($lastpage > 1)
	   {  
		  $pagination .= "<ul class='pagination'>";
					//$pagination .= "<li class='details'>Pagina $page din $lastpage</li>";
		  if ($lastpage < 7 + ($adjacents * 2))
		  {  
			 for ($counter = 1; $counter <= $lastpage; $counter++)
			 {
				if ($counter == $page)
				   $pagination.= "<li><a class='current'>$counter</a></li>";
				else
				   $pagination.= "<li><a href='{$url}$counter/'>$counter</a></li>";			  
			 }
		  }
		  elseif($lastpage > 5 + ($adjacents * 2))
		  {
			 if($page < 1 + ($adjacents * 2))	 
			 {
				for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
				{
				   if ($counter == $page)
					  $pagination.= "<li><a class='current'>$counter</a></li>";
				   else
					  $pagination.= "<li><a href='{$url}$counter/'>$counter</a></li>";			  
				}
				$pagination.= "<li class='dot'>...</li>";
				$pagination.= "<li><a href='{$url}$lpm1/'>$lpm1</a></li>";
				$pagination.= "<li><a href='{$url}$lastpage/'>$lastpage</a></li>";	 
			 }
			 elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
			 {
				$pagination.= "<li><a href='{$url}1/'>1</a></li>";
				$pagination.= "<li><a href='{$url}2/'>2</a></li>";
				$pagination.= "<li class='dot'>...</li>";
				for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
				{
				   if ($counter == $page)
					  $pagination.= "<li><a class='current'>$counter</a></li>";
				   else
					  $pagination.= "<li><a href='{$url}$counter/'>$counter</a></li>";			  
				}
				$pagination.= "<li class='dot'>..</li>";
				$pagination.= "<li><a href='{$url}$lpm1/'>$lpm1</a></li>";
				$pagination.= "<li><a href='{$url}$lastpage/'>$lastpage</a></li>";	 
			 }
			 else
			 {
				$pagination.= "<li><a href='{$url}1/'>1</a></li>";
				$pagination.= "<li><a href='{$url}2/'>2</a></li>";
				$pagination.= "<li class='dot'>..</li>";
				for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
				{
				   if ($counter == $page)
					  $pagination.= "<li><a class='current'>$counter</a></li>";
				   else
					  $pagination.= "<li><a href='{$url}$counter/'>$counter</a></li>";			  
				}
			 }
		  }
		 
		  if ($page < $counter - 1){
		
		 $pagination.= "<li><a href='{$url}$next/'>Urmatoarea</a></li>";
				//$pagination.= "<li><a href='{$url}page=$lastpage'>Ultima</a></li>";
		  }else{
			 $pagination.= "<li><a class='current'>Urmatoarea</a></li>";
				//$pagination.= "<li><a class='current'>Ultima</a></li>";
			}
		  $pagination.= "</ul>\n";	 
	   }
  
  
		return $pagination;
	}
?>

Ma gandeam sa numar rezultatele totale mai sus si dupa sa creez o conditie care sa fie afiseate dar nustiu ce fel de conditie sa pun.
Sau sa pun cele 3 query desupra si sa numar rezultatele apoi sa le adun si sa le impart la 3 o merge asa ? Dar iar ajung la o functie care nu stiu cum sa o gandesc

#2
poadol

poadol

    Guru Member

  • Grup: Senior Members
  • Posts: 14,104
  • Înscris: 13.12.2010
Ai:
- inregistrari platite; (prima faza)
- inregistrari normale; (faza a doua)
- inregistrari sterse; (faza a treia)
(Doar o idee = habar nu am daca se poate face)
Inseamna ca ajunge sa scoti partea de cod pentru cele care nu le vrei in prima faza, in a doua faza adaugi una dintre cele scoase (partea de cod) si scoti pe cea existenta (partea de cod) si mai iti ramane la final cea de a treia  (parte de cod), mai ramane doar sa vezi cum inlantuiesti aceste 3 parti sa urmeze una dupa incheierea celeilalte sau le folosesti separat.
Exemplu prima faza:
include('ttt_files/paginare.php');
$rezultate_pe_pagina = '2';
$statement = "`anunt_standard` where `activat` = 0 AND prs_prv='$filtru_p' ";
/* Inceputul stabiliri functiei numaratorelor */
$page = (int) (!isset($_GET["page"]) ? 1 : $_GET["page"]);
$limit = $rezultate_pe_pagina;
$startpoint = ($page * $limit) - $limit;
//Query pentru afisere si paginare
/* Sfarsitul stabiliri functiei numaratorelor */
$url = "{$server_url}anunturi/f/{$_GET['f']}/page/";
echo "<div id='asezare_butoane'>".pagination($statement,$limit,$page,$url)."</div>";


//afiseaza inregistrarile platite
$query_pay = mysql_query("SELECT * FROM {$statement} AND activat_plata = '1' AND sters = '0' ORDER BY data_adaugare DESC LIMIT {$startpoint} , {$limit}");

echo "<table border='0' width='950px' style='border-collapse:separate; border-spacing:0px 5px;'>";

$i = 0;

while ($row = mysql_fetch_assoc($query_pay)) {
include('continut_platit.php');

}

echo "</table>";



Edited by poadol, 22 February 2013 - 00:50.


#3
Nsilviu

Nsilviu

    Junior Member

  • Grup: Members
  • Posts: 99
  • Înscris: 25.06.2008
Asta e idea, ma gandeam sa fac o singura intergoare dar nu pot sa le separ pe cele platite sa fie afisate primele cu alta culoare si pe cele sterse ultimile cu alta culoare :)). Nustiu ma gandesc ca trebuie sa fie o formula matematica care ar trebuii sa o calculez dar nustiu in ce mod..Ce stiu e asa: Am nr_afiseri_pe_pagini = 2; interogari=3; inregistrari=n; pagini=n;

#4
poadol

poadol

    Guru Member

  • Grup: Senior Members
  • Posts: 14,104
  • Înscris: 13.12.2010
Daca vrei sa afisezi rezultatele intr-o pagina de site, culoarea (care doresti) ar trebui sa fie posibil sa le-o dai cu cod CSS ori Javascript sau poate ca este posibil si cu PHP.

Edited by poadol, 22 February 2013 - 01:22.


#5
Nsilviu

Nsilviu

    Junior Member

  • Grup: Members
  • Posts: 99
  • Înscris: 25.06.2008
La culoare ma gandi acuma as putea sa fac o singura interogare sql.. SI anume:
$query = mysql_query("SELECT * FROM {$statement} ORDER BY data_adaugare DESC LIMIT {$startpoint} , {$limit}");
				 

Iar de aici la linia
<tr style="background-color: #FFFFFF">
as putea sa o fac
<?php if($_row['activat_plata'] == 1 && $_row['sters'] == 0){echo '<tr style="background-color: #000000">';}elseif(..............
Asta nu ar fi o problema dar mai ramne problema sa le afisez primele pe cele care au activat_plata = 1 si ultimile pe cele care au sters = 1 ? Aici nu am nici o idee

#6
poadol

poadol

    Guru Member

  • Grup: Senior Members
  • Posts: 14,104
  • Înscris: 13.12.2010
Datele acelea (inregistrari platite; inregistrari normale; inregistrari sterse; )Posted Image se afla toate intr-un singur tabel in Mysql?
Folosesti codul numai pentru cele cu plata, apoi pentru cele fara plata si la urma pentru cele sterse.
sau
Daca datele sunt in 3 tabele separate foloseste intai "SQL UNION Operator" = UNION ALL, doar ca va trebui modificat codul sa le ia in ordine grupate cate 2.

Edited by poadol, 22 February 2013 - 01:56.


#7
Nsilviu

Nsilviu

    Junior Member

  • Grup: Members
  • Posts: 99
  • Înscris: 25.06.2008
Sunt intr-un singur tabel dar daca fac cum zici tu o sa imi apara de 3 ori paginarea eu vreau o singura paginare:)

#8
poadol

poadol

    Guru Member

  • Grup: Senior Members
  • Posts: 14,104
  • Înscris: 13.12.2010
Nu inteleg de ce sa-ti apara de 3 ori paginarea? Poate nu ai inteles ce face SQL UNION ALL Example sau nu stiu ce sa "zic"?

#9
Nsilviu

Nsilviu

    Junior Member

  • Grup: Members
  • Posts: 99
  • Înscris: 25.06.2008
Am inteles pot sa folosesc UNION
mysql_query("SELECT u.* FROM (
		(SELECT * FROM anunt_standard  WHERE `activat_plata`='1' AND `sters`='0' AND `activat`='0' ORDER BY data_adaugare DESC)
		UNION ALL
		(SELECT * FROM anunt_standard  as b WHERE `activat_plata`='0' AND `sters`='0' AND `activat`='0' ORDER BY data_adaugare DESC)
		UNION ALL
		(SELECT * FROM anunt_standard WHERE `sters`='1' AND `activat`='0' ORDER BY data_adaugare DESC)
		)As u   LIMIT {$startpoint} , {$limit}")or die(mysql_error());


Dar 'ORder By' nu il ia in calcul..:(

#10
poadol

poadol

    Guru Member

  • Grup: Senior Members
  • Posts: 14,104
  • Înscris: 13.12.2010
Incearca sa le unesti intai si abia dupa aceea ordoneaza-le cu if in PHP banuiesc ca va merge, dar ca sa fi sigur trebuie sa incerci. (este mai complicat)
sau
Daca le vrei ordonate obtine 3 tabele ordonate in mysql cum ai facut pana acuma, le salvezi, dupa care unesti cele 3 tabele cu UNION ALL.

SQL ORDER BY Syntax


SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC|DESC

Edited by poadol, 22 February 2013 - 18:16.


#11
sergiu_spooky

sergiu_spooky

    Senior Member

  • Grup: Senior Members
  • Posts: 3,738
  • Înscris: 23.06.2006

View PostNsilviu, on 22 februarie 2013 - 01:24, said:

La culoare ma gandi acuma as putea sa fac o singura interogare sql.. SI anume:
$query = mysql_query("SELECT * FROM {$statement} ORDER BY data_adaugare DESC LIMIT {$startpoint} , {$limit}");
				

Iar de aici la linia
<tr style="background-color: #FFFFFF">
as putea sa o fac
<?php if($_row['activat_plata'] == 1 && $_row['sters'] == 0){echo '<tr style="background-color: #000000">';}elseif(..............
Asta nu ar fi o problema dar mai ramne problema sa le afisez primele pe cele care au activat_plata = 1 si ultimile pe cele care au sters = 1 ? Aici nu am nici o idee

Si de aici ati ajuns la union. N-am habar cum.
Ce te opreste sa ordonezi si dupa coloanele alea?

ORDER BY activat_plata DESC, sters ASC, data_adaugare DESC

#12
Nsilviu

Nsilviu

    Junior Member

  • Grup: Members
  • Posts: 99
  • Înscris: 25.06.2008
Pentru ca daca folosesc mai multe query nu face bine paginarea..

#13
sergiu_spooky

sergiu_spooky

    Senior Member

  • Grup: Senior Members
  • Posts: 3,738
  • Înscris: 23.06.2006
Si unde am scris eu despre mai multe query-uri?

SELECT * FROM blabla ORDER BY activat_plata DESC, sters ASC, data_adaugare DESC LIMIT 0, 10

Asta iti aduce rezultatele sortate dupa activat_plata descrescator, adica alea care au 1 primele, apoi cele cu 0. Fiecare grup (cu 1 sau 0) e sortat la randul lui dupa sters (primele o sa fie alea care au sters 0), apoi dupa data_adaugare.
Eu am scos in evidenta ca poti sorta dupa mai multe coloane si ca n-ai nevoie de UNION.

Ce vrei tu evident nu se face asa defapt.
Arhitectura aplicatiei tale e fundamental gresita.
Ar trebui sa ai o singura coloana dupa care sortezi, eventual sortezi si dupa data_adaugare.
Asta pentru ca e lent sa pui DB-ul sa sorteze dupa (activat_plata AND sters).
In schimb poti pune logica asta in PHP, la salvare.
O coloana noua, sa zicem sort_order, in care pui
1 daca `activat_plata`='1' AND `sters`='0' AND `activat`='0',
0 daca `activat_plata`='0' AND `sters`='0' AND `activat`='0' si
-1 daca `activat_plata`='0' AND `sters`='1' AND `activat`='0'

Acum nu-ti mai ramane decat sa select * from blabla order_by sort_order DESC, data_adaugare DESC LIMIT 0, 10.

Presupun ca n-ai habar cum functioneaza clasa ta de paginare pentru ca altfel nu-mi dau seama cum te-ai putea astepta sa-ti returneze primele doua rezultate doar din primul query.

#14
Nsilviu

Nsilviu

    Junior Member

  • Grup: Members
  • Posts: 99
  • Înscris: 25.06.2008
Am rezolvat problema pana la urma uitati si ucm pentru cine este interesat:

mysql_query("SELECT u.* FROM (
	(SELECT *, data_adaugare AS a, 0 AS b, 0 AS c FROM anunt_standard  WHERE `activat_plata`='1' AND `sters`='0' AND `activat`='0')
  UNION ALL
	(SELECT *, 0 AS a,  data_adaugare AS b, 0 AS c FROM anunt_standard WHERE `activat_plata`='0' AND `sters`='0' AND `activat`='0')
  UNION ALL
	(SELECT *,  0 AS a, 0 AS b, data_adaugare AS c FROM anunt_standard WHERE `sters`='1' AND `activat`='0')
)As u ORDER BY a DESC, b DESC, c DESC LIMIT {$startpoint} , {$limit}");

Iar pentru culoare am folosit:
if($row['activat_plata'] == '1'){$tr = "<tr style='background: #cef0c2 url({$server_url}img/promovat.png) no-repeat right;'>";}
elseif($row['activat_plata'] == '0' && $row['sters'] =='0'){$tr = "<tr style='background-color: {$bg_color};'>";}
elseif($row['sters'] =='1'){$tr = "<tr style='background-color: #ffc4c7;'>";}

Multumesc mult tuturor

#15
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View PostNsilviu, on 23 februarie 2013 - 01:25, said:

Am rezolvat problema pana la urma uitati si ucm pentru cine este interesat:
Te rog să citeşti regulamentul ariei PHP, cu deosebită atenţie asupra postului #2 de acolo. Acest subiect deschis de tine pe aria PHP este off-topic pe aria PHP.

La următoarele abateri, va trebui să trec la warn pentru off-topic.

Mulţumesc.

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate