Newsgroup: it.comp.www.php
Titolo: ricerca nel sito e paginazione risultati..

Ciao all, mi serve qualche consiglio su come gestire la ricerca e la
paginazione dei risultati all'interno di un piccolo CMS che sto
sviluppando per diletto..
Situazione:
n "moduli" (attualmente 4) che gestiscono i contenuti, (immagini, link,
news e articoli, etc, etc..). Ogni modulo ha una sua tabella (mysql per
adesso..).
Non sapendo a priori il nome della tabella, e i campi da utilizzare, ho
deciso che ogni modulo, in fase di installazione inserirà in un file di
configurazione i dati per eseguire la ricerca.
Quindi ho uno script forsearch.php che contiene un array con i dati per
la query. 
Una cosa tipo:
$search['gallery'] = array('table'=>'gallery', 'fields'=>'title,
filename');
$search['link'] = array('table'=>'weblink'', 'fields'=>'title, link');
e così via, un array per ogni modulo.
Poi, ciclando sull'array eseguo le varie query, memorizzo i risultati e
li mostro.
Fino a qui, tutto ok. funziona senza problemi. Adesso però vorrei
inserire la classica paginazione dei risultati; il numero totale dei
risultati, in numero delle "pagine", i link avanti/indietro etc, etc..
Ora, quando si ha a che fare con una sola tabella, è semplice ma qui è
un filo più complicato...
Secondo me le soluzioni possibili sono 3:
1) a livello DB, visualizzando solo n risultati per modulo/tabella
2) carico sempre e comunque tutti i risultati in un array e poi faccio
la paginazione ciclando sull'array
3) una pagina intermedia che mostra solo il numero dei risultati per
modulo che "linka" la pagina per mostrare i riusaltati nel dettaglio,
lavorando però su una sola tabella, semplificando il tutto..
La 1 non mi piace e mi sembra poco logica.
La 2 potrebbe andare ma fino a che punto ? Cioè, quanti risultati
sarebbe in grado di gestire senza appesantire troppo il tutto o
addirittura rischiare di sforare il time/memory limit?
Mi sa che la 3 è la soluzione migliore, che ne pensate ?
Ciao.
-- 
*** Linux user # 198661 ---_ ICQ 33500725 ***
    ***  Home  
http://www.kailed.net
  ***
        ***  Powered by openSUSE  ***

 sviluppando per diletto..
Prova a dare un'occhiata a questo: 
http://www.phpfreaks.com/quickcode/MySQLPHP-Recordset-Navigation/232.php

nervino wrote:

Grazie del consiglio ma la paginazione la so fare; il problema è farla
con dati provenienti da più tabelle.


li mostro.
Ti conviene fare in un modo un pochino diverso: al tuo script arriva un
numero di pagina (se non c'e', consideri 1). Sai gia' che vuoi mostrare
"N" risultati per pagina.
Allora io farei cosi':
	- Se in sessione NON ho SearchQueryMD5:
	  SearchQueryMD5 = MD5(Search Query);
	- Se MD5(Search Query) != SearchQueryMD5:
	  cancella l'array SearchResultCount;
	- Se ho il numero di pagina, assegno PageNo;
	  altrimenti PageNo = 1;
	- SearchResultStart = PageNo*N;
	- SearchResultStop  = (PageNo+1)*N-1;
	- SearchResultCurr  = 0;
	- SearchResultLast  = 0;
	per ogni modulo di ricerca:
	- Se SearchResultCount[modulo] NON e' definito
		- SearchResultCount[modulo] = ...COUNT(*) FROM...
	- SearchResultLast += SearchResultCount[modulo];
	- Se  SearchResultLast < SearchResultStart
	  OR SearchResultStart > SearchResultStop
		// TotalRows = SearchResultCount[modulo];
	ELSE
	{
	- Mi serve QUESTA query, a partire dall'elemento
		SearchResultStart - SearchResultCurr
	  e proseguendo per N o per SearchResultStop - SearchResultCurr,
	  a seconda di quale e' piu' PICCOLO,
	  per un totale di TotalRows righe
	- Faccio la query e mostro / memorizzo i risultati
	}
	SearchResultCurr = SearchResultLast;
Alla fine, (int)((SearchResultLast+N-1) / N) e' il tuo massimo numero di
pagine, hai tenuto in sessione solo il result_count di ogni query, e non
hai fatto query di retrieval che non ti servissero.
Non garantisco che l'algoritmo cosi' come l'ho scritto sia sensato :-) -
una volta che lo feci sul serio funziono', ma ci volle del debug.
Leonardo
-- 
 What do you make, so fair and bright;
 What do you build with sails for flight;
 What do you weave with wool so white?

 mostrare "N" risultati per pagina.
Poi me lo studio ma ormai credo di optare per la soluzione '3', una
pagina intermedia che mostra i riusltati (il numero) per modulo. Un
passaggio in più ma che indirizza meglio l'utente verso i risultati che
interessano..
Ciao e grazie.
