paginare risultati di ricerca

gianfrigna

Nuovo Utente
27 Nov 2011
4
0
0
Ringrazio anticipatamente chiunque avrà la bontà di darmi una mano!
Ho messo a punto uno script di paginazione di un semplice motore di ricerca appoggiato a una mysql_table di un mio mysql_db. Pensando a futuri aumenti della dimensione di questo mio database, ho voluto approntare una classe di paginazione che consiste di 2 file:
1) pagination.php (che è la classe vera e propria);
2) index.php (che è il file contenente il codice di estrazione dei records + il form per la ricerca sul mysql_db).
Ora, il mio problema si evidenzia nel passaggio dalla prima pagina dei risultati a quelle successive. Mi spiego meglio.
Fino a quando si rimane sulla prima pagina, tutto funziona a meraviglia... Si ottengono i risultati cercati, nel limite imposto dalla class.pagination, i link delle pagine successive vengono creati correttamente in base al totale dei records trovati / i records per pagina... ecc, ecc.
Quando si passa alla seconda pagina mi ritrovo una pagina vuota, che riporta solo il messaggio d'errore con scritto "Query was empty"!
E' come se nel passaggio dalla prima alla seconda pagina e a quelle successive, si vada perdendo l'imput che correttamente ha dato il form di ricerca alla prima pagina.
Cosa posso fare? Aggiungo i codici della class e del file contenitore.


PHP:
<?php

class pagination {
	var $php_self;
	var $rows_per_page = 3;
	var $total_rows = 0;
	var $links_per_page = 5;
	var $sql = 'SELECT (*) FROM `mysql_table` WHERE `ragionesociale` LIKE %$keyword% OR `indirizzo` LIKE %$keyword% OR `cap` LIKE %$keyword% OR `citta` LIKE %$keyword% OR `provincia` LIKE %$keyword% OR `regione` LIKE %$keyword% ';
	var $debug = false;
	var $conn = false;
	var $page = 1;
	var $max_pages = 0;
	var $offset = 0;
	
	
	function pagination($connection, $sql, $rows_per_page = 3, $links_per_page = 5)
		{
		$this->conn = $connection;
		$this->sql = $sql;
		$this->rows_per_page = (int)$rows_per_page;
		if (intval($links_per_page ) > 0) {
			$this->links_per_page = (int)$links_per_page;
		} else {
			$this->links_per_page = 5;
		}
		$this->php_self = htmlspecialchars($_SERVER['PHP_SELF'] );
		if (isset($_POST['page'] )) {
			$this->page = intval($_POST['page'] );
		}
	}
	
	function paginate() {

		if (! $this->conn || ! is_resource($this->conn )) {
			if ($this->debug)
				echo "Connessione perduta<br />";
			return false;
		}
		
		$all_rs = @mysql_query($this->sql );
		if (! $all_rs) {
			if ($this->debug)
				echo "Controlla i termini di ricerca.<br /><br />Errore: ";
			return false;
		}
		$this->total_rows = mysql_num_rows($all_rs );
		@mysql_close($all_rs );
		
		if ($this->total_rows == 0) {
			if ($this->debug)
				echo "Nessun risultato trovato con &ldquo;" . $_POST['keyword'] . "&rdquo;";
			return FALSE;
		}
		
		$this->max_pages = ceil($this->total_rows / $this->rows_per_page );
		if ($this->links_per_page > $this->max_pages) {
			$this->links_per_page = $this->max_pages;
		}
		
		if ($this->page > $this->max_pages || $this->page <= 0) {
			$this->page = 1;
		}
		
		$this->offset = $this->rows_per_page * ($this->page - 1);
		
		$result = @mysql_query($this->sql . " LIMIT {$this->offset}, {$this->rows_per_page}" );
		if (! $result) {
			if ($this->debug)
				echo "Controlla i termini di ricerca.<br /><br />Errore: ";
			return false;
		}
		return $result;
	}
	
	function renderFirst($tag = 'First') {
		if ($this->total_rows == 0)
			return FALSE;
		
		if ($this->page == 1) {
			return "$tag ";
		} else {
			return '<a href="' . $this->php_self . '?page=1">' . $tag . '</a> ';
		}
	}
	
	function renderLast($tag = 'Last') {
		if ($this->total_rows == 0)
			return FALSE;
		
		if ($this->page == $this->max_pages) {
			return $tag;
		} else {
			return ' <a href="' . $this->php_self . '?page=' . $this->max_pages . '">' . $tag . '</a>';
		}
	}
	
	function renderNext($tag = '&gt;&gt;') {
		if ($this->total_rows == 0)
			return FALSE;
		
		if ($this->page < $this->max_pages) {
			return '<a href="' . $this->php_self . '?page=' . ($this->page + 1) . '">' . $tag . '</a>';
		} else {
			return $tag;
		}
	}
	
	function renderPrev($tag = '&lt;&lt;') {
		if ($this->total_rows == 0)
			return FALSE;
		
		if ($this->page > 1) {
			return ' <a href="' . $this->php_self . '?page=' . ($this->page - 1) . '">' . $tag . '</a>';
		} else {
			return " $tag";
		}
	}
	
	function renderNav($prefix = '<span class="page_link">', $suffix = '</span>') {
		if ($this->total_rows == 0)
			return FALSE;
		
		$batch = ceil($this->page / $this->links_per_page );
		$end = $batch * $this->links_per_page;
		if ($end == $this->page) {

		}
		if ($end > $this->max_pages) {
			$end = $this->max_pages;
		}
		$start = $end - $this->links_per_page + 1;
		$links = '';
		
		for($i = $start; $i <= $end; $i ++) {
			if ($i == $this->page) {
				$links .= $prefix . " $i " . $suffix;
			} else {
				$links .= ' ' . $prefix . '<a href="' . $this->php_self . '?page=' . $i . '">' . $i . '</a>' . $suffix . ' ';
			}
		}
		
		return $links;
	}
	
	function renderFullNav() {
		return $this->renderFirst() . '&nbsp;' . $this->renderPrev() . '&nbsp;' . $this->renderNav() . '&nbsp;' . $this->renderNext() . '&nbsp;' . $this->renderLast();
	}
	
	function setDebug($debug) {
		$this->debug = $debug;
	}
}
?>


Questo il file contenitore index.php:

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title><?php echo ($_POST['keyword']); ?></title>
</head>
<body>   

<form action="index.php" method="post" name="search">
            <fieldset> 
            <label for="search">Cerca...&nbsp;&nbsp;</label>
<input name="search" type="hidden" value="search">
<input name="keyword" autocomplete="on" type="text" value="<?php echo ($_POST['keyword']); ?>" size="60" maxlength="30">&nbsp;&nbsp;
<input name="cerca" type="submit" value="Cerca!">
            </fieldset> 
            </form>

<?php

	include('pagination.php');
	
	$conn = mysql_connect('localhost','user','psw');
	if(!$conn) die("Failed to connect to database!");
	$status = mysql_select_db('mysql_db', $conn);
	if(!$status) die("Failed to select database!");
            if (@$_POST['search']=="search")
            {
            $keyword=$_POST['keyword'];
	$sql = "SELECT * FROM `mysql_table` WHERE `ragionesociale` LIKE '%$keyword%' OR `indirizzo` LIKE '%$keyword%' OR `cap` LIKE '%$keyword%' OR `citta` LIKE '%$keyword%' OR `provincia` LIKE '%$keyword%' OR `regione` LIKE '%$keyword%' ";
	    }

	$pager = new pagination($conn, $sql, 3, 5);
	
	$pager->setDebug(true);
	
	$result = $pager->paginate();
	if(!$result) die(mysql_error());
            while ($results = mysql_fetch_array($result))
            {
            $url=$results['pageUrl'];
            $ragionesociale=$results['ragionesociale'];
            $indirizzo=$results['indirizzo'];
            $cap=$results['cap'];
            $citta=$results['citta'];
            $provincia=$results['provincia'];
            $telefono=$results['telefono'];
            $fax=$results['fax'];

            echo "<h3><a href='$url' title='&nbsp;&nbsp;Fai click per maggiori informazioni su:&nbsp;&nbsp;\r&nbsp;&nbsp;&ldquo;&nbsp;$ragionesociale&nbsp;&rdquo;' ?>$ragionesociale</a></h3>
            <p>$indirizzo<br />$cap - $citta ($provincia)<br />
            tel. $telefono - fax $fax</p>";
            }
	    
	echo $pager->renderFullNav();
	
	echo "<br />\n";
	
	echo $pager->renderFirst();
	
	echo $pager->renderPrev();
	
	echo $pager->renderNav('<span>', '</span>');
	
	echo $pager->renderNext();
	
	echo $pager->renderLast();
?>

</body>
</html>
 
Ultima modifica di un moderatore:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
scusa ma guardando meglio ho visto il limit e i record per pagina.
E' come se nel passaggio dalla prima alla seconda pagina e a quelle successive, si vada perdendo l'imput che correttamente ha dato il form di ricerca alla prima pagina.
non potresti provare a passare in sessione i valori dei post?
 

gianfrigna

Nuovo Utente
27 Nov 2011
4
0
0
Grazie delle tue risposte borgo italia, ho provato a fare quanto mi hai consigliato... ma non ci riesco! Forse sbaglio qualcosa nel passare in sessione i valori di post. Riusciresti a farmi capire meglio? Grazie
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
prova in questa maniera (se il post che intendi è questo)
PHP:
<?php
session_start();
?>
<!-- html -->
<?php
//....
if ($_POST['search']=="search"){//oppure, forse meglio, metti if(isset($_POST['search'])){
 	$_SESSION['keyword']=$_POST['keyword'];
}
var_dump($_SESSION['keyword']);//per verifica, poi lo togli o lo commenti
$sql = "SELECT * FROM mysql_table WHERE ragionesociale LIKE '%".$_SESSION['keyword']."%' OR indirizzo LIKE '%".$_SESSION['keyword']."%' OR cap LIKE '%".$_SESSION['keyword']."%' OR citta LIKE '%".$_SESSION['keyword']."%' OR provincia LIKE '%".$_SESSION['keyword']."%' OR regione LIKE '%".$_SESSION['keyword']."%' ";
//....
?>
prova, al massimo non funzia

poi un paio di cose
togli il silent davanti al post così vedi eventuali messaggi di errore di php, poi puoi rimetterlo a script funzionante
togli i batik ai nomi della tabella e dei campi fanno solo confusione
se poi il tutto funzia (spero) stai attento nella parte html dove hai messo
PHP:
<title><?php echo ($_POST['keyword']); ?></title>
perchè, se come hai detto, ti sparisce il post devi usare la sessione
PHP:
<title><?php if(isset($_POST['search'])){echo $_POST['keyword'];}else{echo $_SESSION['keyword'];} ?></title>
che tra l'altro può servirti come verifica del post e della sessione
 

gianfrigna

Nuovo Utente
27 Nov 2011
4
0
0
Grazie a minatore e ancora a borgo... Purtroppo, il mio silenzio non è «assenso» come in altre realtà! Ho tardato a rispondervi solo perché il lavoro mi ha assorbito più del solito e non ho avuto quindi tempo per «divertirmi» col web. I vostri suggerimenti, sicuramente utili, non hanno portato però i risultati sperati. Grazie comunque, ragazzi.

gianfrigna
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
visto che ti stai divertendo :), quale è il $_POST che ti sparisce?
eventualmente spargi a pioggia dei var_dump($xyz); sulle variabili per cercare di capire cosa "sparisce" quando cambi pagina
 
Discussioni simili
Autore Titolo Forum Risposte Data
grottafelix Paginare 6 record in una riga e poi andare a capo Classic ASP 2
F paginare anteprime in una fotogallery PHP 2
K Estrazione di più risultati da tabelle correlate PHP 5
D Risultati diversi elaborazione dati fra localhost e Altervista PHP 0
M Contare totale risultati tabella in un periodo di tempo PHP 5
F stampare a video i risultati della query PHP 1
M Visualizzazione a video risultati query php PHP 0
P Passare i risultati di un foreach in un modal. Help! PHP 2
G eseguire calcoli matematici su risultati 2 tabelle mysql PHP 4
TpD Incolonnare risultati query (mysql_result deprecato...) PHP 3
S come togliere un post dai risultati di google? Supporto Mr.Webmaster 5
M Filtrare risultati con valori checkbox passati con jquery jQuery 2
M [PHP] Mostrare risultati di una tabella ma solo se ID è attivo PHP 0
A [MySQL] Ottenere più risultati in un unico campo MySQL 7
Alex_70 [PHP] Ricerca con risultati cliccabili PHP 21
maxnegri [PHP] Eliminare risultati duplicati da ciclo foreach ottenuti da una select php mysqli PHP 18
A [PHP] If e Else paginazione ok ci sono risultati no ma avanti lo stesso PHP 15
G [PHP] operazione matematica tra risultati di query PHP 5
Sangy PHP risultati negativi in rosso PHP 2
P Google risultati di ricerca inappropriati SEO e Posizionamento 1
D [PHP] questi risultati in una tabella PHP 4
trattorino [PHP] Risultati dentro array precisi e confrontabili PHP 7
MikSkagit [PHP] Risultati a video sulla stessa riga PHP 12
V [ASP] paginazione-risultati-query-grandi-dimensioni Classic ASP 8
L [PHP] Creare un uploader di file csv xls e ricercare i risultati PHP 0
U [PHP] estrarre i risultati di una query e visualizzarli in una tabella. PHP 9
T Monitorare risultati Google in base alla località e device di ricerca SEO e Posizionamento 0
G Risultati evidenziato dopo ricerca Classic ASP 4
M [PHP] Evidenziare le parole cercate nei risultati di una ricerca PHP 1
filippino Chiavi a corrispondenza inversa per i risultati organici? (Era: come NON farsi trovare con date chia SEO e Posizionamento 4
JackIlPazzo Ritornare risultati query in un array? PHP 1
F Tabella con prima colonna con i risultati di una query PHP 1
ecosito Risultati di Google all'interno di una pagina del sito? HTML e CSS 7
D Mysql ordinamento risultati MySQL 4
otto9due Rand() o mt_rand() per ottenere risultati alternativi.. non uguali per 3 estrazioni. PHP 5
M Paginazione di risultati query mysql PHP 2
D Problema risultati duplicati PHP 5
D [risolto] Problemi di paginazione dei risultati con una determinata query Classic ASP 4
N Raggruppare risultati di due tabelle PHP 1
M Dividere risultati in colonna in base al contenuto PHP 9
alankanz dividere risultati in pagine MySqli PHP 4
alankanz Suddividere risultati MySqli PHP 0
alankanz Estrarre solo risultati numerici MySQL 2
xone Ordinare tramite menù a tendina i risultati di una query già stampati MySQL 0
StarFish [MySQL] Full Text problema rilevanza risultati MySQL 0
L PHP e recupero risultati da query PHP 2
L PHP e recupero risultati da query PHP 11
B Sommare risultati db PHP 3
M Domanda riguardo i risultati della ricerca di google Joomla 14
R visualizzare risultati query utilizzando le funzioni PHP 0

Discussioni simili