Salve a tutti, ho un problema che mi sta facendo passare le notti in bianco, ho un piccolo motore di ricerca che visualizza i risultati paginati grazie a questo script:
Codice PHP:
<?php/**
* Funzione per la paginazione automatica delle query, con propagazione delle querystring
*
* @author Pippo Pluto - }gu|do[z]{®© <pippo@pluto.paperino> - Supporto su [url]www.guidoz.it/forum[/url]
* @version 1.1 (11/11/2005)
* @param string $query La query sql con cui intendiamo estrarre i nostri dati
* @param integer $x_pag Il numero di record che vogliamo visualizzare in una singola pagina (default: 10)
* @param integer $num_links Il numero di link alle pagine precedenti e successive da stampare nel menu' (default: 5)
* @return array Il primo valore è il risultato della query, il secondo il menu' stampabile
*/
function paging($query,$x_pag=15,$num_links=5)
{
//conteggio i record presenti
$resource = mysql_query($query); //grazie a piero.mac per la compatibilità con mysql 5
$righe = mysql_num_rows($resource);
if ($righe == 0){ return false; }
//calcolo il numero di pagine necessarie per visualizzare i dati
$numpages = ceil($righe/$x_pag);
//ottengo il numero di pagina, se manca lo imposto ad 1
$pag = isset($_GET['pag'])? $_GET['pag'] : 1;
//imposto il primo estremo del limit
$da = ($pag-1) * $x_pag;
//appendo il limit alla query originaria
$query .= " LIMIT $da,$x_pag";
//gesisco la propagazione della query string
$querystring = '';
foreach($_GET as $k => $v)
{
if ($k != 'pag')
{
$querystring .= "&".$k."=".$v;
}
}
//inizializzo una stringa vuota in cui appenderò l'output del menu'
$menu = '';
//serie di condizionali in cascata per costruire il menu'
if($numpages <= $num_links)
{
for ($pagina = 1; $pagina <= $numpages; $pagina++)
{
if ($pagina == $pag)
$menu .= "[<span class=\"pag_selected\"> $pagina </span>] ";
else
$menu .= "[<a class=\"pag_link\" href=\"?pag={$pagina}{$querystring}\" title=\"Vai a pagina $pagina\"> $pagina </a>] ";
}
}
//se la pag corrente è tra le prime $num_links/2 --> stampo i primi $nun_links link
else if($pag <= ceil($num_links/2))
{
for ($pagina=1; $pagina<=$num_links; $pagina++)
{
if ($pagina == $pag)
$menu .= "[<span class=\"pag_selected\"> $pagina </span> ";
else
$menu .= "<a class=\"pag_link\" href=\"?pag={$pagina}{$querystring}\" title=\"Vai a pagina $pagina\"> $pagina </a> ";
}
$menu .= "<a class=\"pag_link\" href=\"?pag={$numpages}{$querystring}\" title=\"Vai all'ultima pagina\"> >> </a> ";
}
//se la pag corrente è tra le ultime $num_links/2 --> stampo gli ultimi $nun_links link
else if($pag > ($numpages-ceil($num_links/2)))
{
$menu .= "<a class=\"pag_link\" href=\"?pag=1{$querystring}\" title=\"Vai alla prima pagina\"> << </a> ";
for ($pagina=$numpages-$num_links+1; $pagina<=$numpages; $pagina++)
{
if ($pagina == $pag)
$menu .= "[<span class=\"pag_selected\"> $pagina </span>] ";
else
$menu .= "[<a class=\"pag_link\" href=\"?pag={$pagina}{$querystring}\" title=\"Vai a pagina $pagina\"> $pagina </a>] ";
}
}
//Altrimenti la pagina corrente è una dell centrali --> stampo i $nun_links/2 link prima ed $nun_links/2 link dopo
else
{
$menu .= "<a class=\"pag_link\" href=\"?pag=1{$querystring}\" title=\"Vai alla prima pagina\"> << </a> ";
for ($pagina = $pag-ceil($num_links/2-1); $pagina <= $pag+ceil($num_links/2-1); $pagina++)
{
if ($pagina == $pag)
$menu .= "[<span class=\"pag_selected\"> $pagina </span>] ";
else
$menu .= "[<a class=\"pag_link\" href=\"?pag={$pagina}{$querystring}\" title=\"Vai a pagina $pagina\"> $pagina </a>] ";
}
$menu .= "<a class=\"pag_link\" href=\"?pag={$pagina}{$querystring}\" title=\"Vai all'ultima pagina\"> >> </a> ";
}
//restituisco il risultato della query, e l'output del menu'
return array(mysql_query($query),$menu);
}
?>
il form di ricerca è semplice:
codice:
<form method="post" action="cerca_result.php">
<input name="cerca" type="text" size="15">
<input type="submit" value="Cerca" class="button">
</form>
dopo di che il tutto viene dato in pasto allo script di ricerca:
Codice PHP:
<?php
include("../config.inc.php");
include("../top_foot.inc.php");
top();//intestazione dell pagona
if(empty($_POST["cerca"])) //sono state inserite keyword?
{
echo "
<table width=\"80%\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"cont\">
<tr>
<td align=\"center\">
Devi specificare una chiave di ricerca</p></td>
</tr>
</table>";
foot(); //chiude la pagina
exit();
}
//connessione al db
$db = mysql_connect($db_host, $db_user, $db_password)or die ("Parametri di connessione errati");
//selezione db
mysql_select_db($db_name, $db)or die ("Parametri di connessione errati");
$keys = explode (" ", $cerca);
$richiesta = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{
$parola = trim($parola);
if ($parola != "")
{
$richiesta .= "titolo LIKE '%$parola%' OR news LIKE '%$parola%' OR autore LIKE '%$parola%' OR ";
}
}
$richiesta .= "id=0";
$query0 = mysql_query( "CREATE TEMPORARY TABLE ricerca SELECT id, titolo, data, autore, news FROM news WHERE ".$richiesta);
$query = "SELECT * FROM ricerca ORDER BY data DESC";
include("paging.func.php");
$res = paging($query);//funzione di paging
if (!$res[0])
{
echo "<div align=\"center\"></br>La ricerca non ha prodotto nessun risultato.</br></br>
<?
include("../config.inc.php");
include("../top_foot.inc.php");
top();
if(empty($_POST["cerca"]))
{
echo "
<table width=\"80%\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" class=\"cont\">
<tr>
<td align=\"center\">
Devi specificare una chiave di ricerca</p></td>
</tr>
</table>";
foot();
exit();
}
$db = mysql_connect($db_host, $db_user, $db_password)or die ("Parametri di connessione errati");
mysql_select_db($db_name, $db)or die ("Parametri di connessione errati");
$keys = explode (" ", $cerca);
$richiesta = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{ $parola = trim($parola);
if ($parola != ""){
$richiesta .= "titolo LIKE '%$parola%' OR news LIKE '%$parola%' OR autore LIKE '%$parola%' OR ";
}
}
$richiesta .= "id=0";
$query0 = mysql_query( "CREATE TEMPORARY TABLE ricerca SELECT id, titolo, data, autore, news FROM news WHERE ".$richiesta);
$query = "SELECT * FROM ricerca ORDER BY data DESC";
include("paging.func.php");
$res = paging($query);//funzione di paging
if (!$res[0])
{
echo "<div align=\"center\"></br>La ricerca non ha prodotto nessun risultato.</br></br>
<INPUT TYPE=\"button\" VALUE=\"TORNA INDIETRO\" onClick=\"history.back()\" class=\"button\"></br></br>
</div></br>";
}
else
{
while($row = mysql_fetch_array($res[0]))
{
setlocale (LC_TIME, "italian");
$dbtime = $row[data];
$dates = explode("-", $dbtime);
echo "[*]<a href=\"view.php?id=".$row['id']."\">" . date("j/n/Y", mktime(0, 0, 0, $dates[1], $dates[2], $dates[0])) . " - ".$row['titolo']."</a>";
}
}
echo "<div class=\"pag\" align=\"right\">Pagine: ".$res[1]."</div></br></br>";
mysql_close($db);
foot();
?>
ora tutto funziona bene nel caso in cui il campo di ricerca è vuoto (visualizza specificare una chiave di ricerca), nel caso in cui a ricerca dia esiti positivi (tutti i recor vengono visualizzati e paginati correttamente), ma nel caso in cui la ricerca dia esito negativo lo script si blocca alla funzione di paging e sembra come andare in loop.
Nessun errore mysql viene restituito e nessun errore sintattico è presente... non so più dove sbattere la testa.