Precedente :: Successivo |
Autore |
Messaggio |
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 26 Gen 2012 21:13 Oggetto: |
|
|
Ho modificato la riga 13 così:
Codice: | $cerca=isset($_POST['cerca']) && strlen($_POST['cerca'])>=3 ? $_POST['cerca'] : null;
| , adesso mi ha manifestato un errore alla riga 54:
l'erroe è questo: Parse error: syntax error, unexpected '}' in /home/mhd-01/www.streamingmania.it/htdocs/Rollover/Ris.php on line 54, vuol dire che manca una di queste giusto: "}"? |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 26 Gen 2012 21:28 Oggetto: |
|
|
Avevo cannato io alcuni apici perchè ho usato un editor che apro poco e che ha una politica di autocompletamento differente da quello che uso di solito.
Non rileggendo sono rimasti errori di sintassi.
Ho ora evidenziato i bordi della tabella per farteli vedere bene e ho aggiunto che se l'ultima riga ha una cella sola, ne viene aggiunta una vuota per formattare bene la tabella.
In più facendo il copia & incolla del tuo codice mi ha portato a sputtanare la query.
Ora mi pare che funzioni.
Fa conto che in questa pagina ci devi arrivare con una post; se preferisci la get cambia la var $_POST con $_GET.
Codice: |
<?php
$db_host = "host";
$db_user = "DB_User";
$db_password = "pass";
$db_name = "prova";
//connetto il database
$db = mysql_connect($db_host, $db_user, $db_password) or die ('Errore durante la connessione');
mysql_select_db($db_name, $db) or die ('Errore durante la selezione del db');
$errMsg='';
$cerca=isset($_POST['cerca']) && strlen($_POST['cerca'])>=3 ? $_POST['cerca'] : null;
$dati=array();
if ($cerca===null)
{
$errMsg='Querystring errata!';
}
else
{
$cerca="'%".mysql_escape_string($cerca). "%'";
// cerco nel db
$query = "SELECT * FROM Tabella WHERE Titolo LIKE $cerca OR Descrizione LIKE $cerca";
$rs=mysql_query($query);
if ($rs && mysql_num_rows($rs)>0)
{
while ($row=mysql_fetch_assoc($rs))
{
$dati[]=$row;
}
}
else
{
$errMsg='Nessun risultato trovato!';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>StreamingMania</title>
</head>
<body>
<p>Risultati per: <?php print $cerca;?></p>
<?php if ($errMsg!='') {
print '<b>'.$errMsg.'</b>';
} else {?>
<table border="1">
<tr><th colspan="2"><?php print count($dati) . ' risultati';?></th></tr>
<?php
$i=0;
// qui apro la riga come di SverX
print '<tr>';
foreach ($dati as $d)
{
print '<td>Titolo: ' . $d['Titolo'].'<br/>'.$d['Immagine'].'<br/>Descrizione: '.$d['Descrizione'].'</td>';
++$i;
if ($i%2==0) // $i è pari?
{
print '</tr><tr>';
}
}
if ($i%2!=0)
{
print '<td> </td>';
}
print '</tr>';
?>
</table>
<?php }?>
</body>
</html>
|
|
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 26 Gen 2012 21:37 Oggetto: |
|
|
@freemind Sei un grande funziona, l'unico problema è questa frase che esce in cima: "Risultati per: '%prova%'", ma per il resto và benissimo, ringrazio sia te che SverX per l'aiuto che mi avete dato, veramente gentilissimi.... |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 27 Gen 2012 09:10 Oggetto: |
|
|
Sì, hai ragione.
Invece di
Codice: |
$cerca="'%".mysql_escape_string($cerca). "%'";
|
cambia variabile tipo:
Codice: |
$safeCerca="'%".mysql_escape_string($cerca). "%'";
|
e la query cambiala di conseguenza con:
Codice: |
$query = "SELECT * FROM Tabella WHERE Titolo LIKE $safeCerca OR Descrizione LIKE $safeCerca";
|
Così dovrebbe stampare giusto tutto. |
|
Top |
|
|
Pazzini Comune mortale
Registrato: 29/01/12 03:23 Messaggi: 2
|
Inviato: 29 Gen 2012 03:39 Oggetto: |
|
|
Salve, anche io stò cercando di realizzare qualcosa di simile, e lo script qui proposto funziona anche a me, ma non riesco a personalizzarlo come vorrei.
La visualizzzazione dovrebbe essere così: in basso a destra vorrei ottenere un qualcosa di simile: "1 l 2 l 3 l 4 l 5 l 6 l 7 l 8l 9 l 10 l"(oppure gli stessi sottolineati, ma mi par eche quello si fà con i css quando si influenza la classe link) e sopra dove appaiono i risultati se ad esempio appaiono 2 risultati mi dovrebbe uscire scritto "pagina 1 di 1", e vorrei impostare il limite dei risultati a 20 per pagina, ora se io metto limit come letto nella discussione funziona, ma come faccio ad andare avanti con le pagine, esistono già o devo ordinare io al computer di crearle e se si come devo scrivere?
Un grazie a chi risponderà. |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 29 Gen 2012 20:06 Oggetto: |
|
|
Mi ero scordato della limit...
La clausola limit vincola il numero di righe in base ai parametri passati alla clausola. Come già detto "limit 0,12" vuol dire "le prime dodici righe" quindi alla fine il recordset ritornato sarà composto solo da queste e non da tutte quelle che sarebbero ritornate senza clausola.
Se dobbiamo quindi impaginare i dati abbiamo la necessità di:
1) sapere quante righe ci sono in tutto
2) sapere quale pagina vogliamo visualizzare
3) sapere quante pagine ci sono in tutto.
Per il punto 1 dobbiamo contare le righe che corrispondono alla ricerca.
Potremmo da bastardi e brocchi eseguire la query senza limit e sfruttare "mysql_num_rows" per sapere il numero di risultati.
Questo approccio è sbagliato perchè la limit ha lo stesso peso computazionale delle select semplice quindi se questa è pesante eseguiremmo due volte una brutta select sul db.
Allora useremo l'aggregatore "count".
Per il punto 2 è facile perchè saremo noi a dire quale pagina visualizzare sottointendendo 1 se non viene specificata.
Il punto 3 viene risolto mettendo insieme 1 e 2 perchè il numero di pagine è dato da "ceil($howMany/$limit)" con $howMany il numero totale di righe (punto 1) e $limit la dimensione della pagina. ceil arrotonda per eccesso un numero e ci serve perchè la limit vuole numeri interi (ovviamente).
Qui sotto il codice per impaginare i dati; son partito dallo script precedente.
Ho preferito non creare tanti link quante sono le pagine ma una select in modo da poter racchiudere la tabella in una form aggiungendo un hidden "cerca" valorizzato come la ricerca per poter "rifare la ricerca" sulla stessa form cambiando solo la pagina.
Codice: |
<?php
$db_host = "host";
$db_user = "DB_User";
$db_password = "pass";
$db_name = "prova";
//connetto il database
$db = mysql_connect($db_host, $db_user, $db_password) or die ('Errore durante la connessione');
mysql_select_db($db_name, $db) or die ('Errore durante la selezione del db');
$errMsg='';
$cerca=isset($_REQUEST['cerca']) && strlen($_REQUEST['cerca'])>=3 ? $_REQUEST['cerca'] : null;
$dati=array();
$howMany=0; // usato più avanti
if ($cerca===null)
{
$errMsg='Querystring errata!';
}
else
{
$safeCerca="'%".mysql_escape_string($cerca). "%'";
$page=isset($_REQUEST['page']) ? $_REQUEST['page'] : 1;
$limit=5;
$offet=($page-1)*$limit;
// conto quante righe ci sono
$query="SELECT IFNULL(COUNT(*),0) as q FROM Tabella WHERE Titolo LIKE $safeCerca OR Descrizione LIKE $safeCerca";
//print $query;exit;
$rs=mysql_query($query);
$row=mysql_fetch_assoc($rs);
$howMany=$row['q'];
$totPages=ceil($howMany/$limit); // numero totale di pagine
//print $totPages;exit;
$select='<select name="page">';
for ($i=1;$i<=$totPages;++$i)
{
$select.='<option value="' .$i .'"' . ($i==$page ? ' selected="selected"' : ''). '>'.$i.'</option>';
}
$select.='</select>';
// l'impaginatore
$pager='Pagina ' . $select . ' di '. $totPages . ' <input type="submit" name="command" value="Vai"/>';
// cerco nel db
$query = "SELECT * FROM Tabella WHERE Titolo LIKE $safeCerca OR Descrizione LIKE $safeCerca LIMIT $offet,$limit";
$rs=mysql_query($query);
if ($rs && mysql_num_rows($rs)>0)
{
while ($row=mysql_fetch_assoc($rs))
{
$dati[]=$row;
}
}
else
{
$errMsg='Nessun risultato trovato!';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>StreamingMania</title>
</head>
<body>
<p>Risultati per: <?php print $cerca;?></p>
<?php if ($errMsg!='') {
print '<b>'.$errMsg.'</b>';
} else {?>
<form method="get" action="<?php print $_SERVER['PHP_SELF'];?>">
<input type="hidden" name="cerca" value="<?php print $cerca;?>"/>
<table border="1">
<tr><th colspan="2"><?php print $howMany . ' risultati';?></th></tr>
<?php
$i=0;
// qui apro la riga come di SverX
print '<tr>';
foreach ($dati as $d)
{
print '<td>Titolo: ' . $d['Titolo'].'<br/>'.$d['Immagine'].'<br/>Descrizione: '.$d['Descrizione'].'</td>';
++$i;
if ($i%2==0) // $i è pari?
{
print '</tr><tr>';
}
}
if ($i%2!=0)
{
print '<td> </td>';
}
print '</tr>';
?>
<tr><td colspan="2"><?php print $pager;?></td></tr>
</table>
</form>
<?php }?>
</body>
</html>
|
Testando la roba prima di fare la doccia (come sempre) sembra che la cosa stia in piedi.
Per variare la dimensione delle pagine basta cambiare il valore alla variabile $limit. |
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 30 Gen 2012 00:00 Oggetto: |
|
|
Bella aggiunta, hai arricchito ulteriormente il codice. Solo una domanda: se volessi visualizzare la lista di pagine totali, ad esempio: pagine 1 l 2 l 3 dovrei semplicemente andare a toccare la funzione che ha a che fare con select vero? |
|
Top |
|
|
Pazzini Comune mortale
Registrato: 29/01/12 03:23 Messaggi: 2
|
Inviato: 03 Feb 2012 01:30 Oggetto: |
|
|
Ciao, scusa se ti rispondo solo ora ma non ci sono stato. Potresti farmi un favore?
Vorrei che riscrivessi il codice in maniera che mi mostri le pagine così: pagina precedente 1 2 3 4 5 6 7 8 pagina successiva, senza la funzione scroll che hai messo, ho provato a farlo da solo ma sono molto incapace .ù Ti prego di farmi questo favore please |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 06 Feb 2012 19:22 Oggetto: |
|
|
Invece di creare la select occorre creare tanti "<a href="">...</a>" il cui link punti alla stessa pagina con il parametro "page" uguale all'indice della pagina e il parametro "cerca" uguale a quello che ora è nell'hidden. |
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 08 Feb 2012 02:37 Oggetto: |
|
|
Ok, allora vi posto quello che ho fatto fino ad ora modificando quel codice:
Codice: | for($i=1; $i<$totPages; $i++) $pagine[]="<a href='../risultati.php?ricerca=ok&$cerca&p=".$i."'".($i==$p ? " class='this'" : '').">".$i."</a>"; |
Come detto da freemind ho ordinato allo script di creare tanti "<a href="">...</a>" allora ho sostituito alla funzione quello script trovato su google, e ovviamente riadattato a ciò che dovevo fare. Ho messo il parametro $cerca perchè ho notato che molti siti mettevano quella stringa(forse per stampar eil termine della riecrca su tutte le pagine, comunque sia prima ho provato senza la stringa $cerca è già non funzionava bene). Comunque alla fine ho aggiunto anche la variabile $p(che da quello che ho capito identifica le pagine della ricerca partendo da 0 come pagina iniziale dei risultati e aumentanto, ad esempio p=1 per la pagina due, ecc), però ho un problema, quando provo a sfogliare i risultati mi dà l'errore "Querystring errata", che è il messaggio che appare anche quando non si scrive nulla. Alla luce di ciò e dopo aver provato per 2 orette buone, ho pensato che stranamente dopo aver stampato le pagine lo scipt si "dimentica" della parola cercata, quindi se effettivamente ho 6 pagine nella ricerca, solo la prima conterrà risultati, le altre saranno vuote, tuttavia ho anche notato che se clicco per caricare una pagina , ad esempio la 3, e appare il messaggio di erore, dopo se tento di andare indietro scopro che il server ha chiuso la connessione con il database e ha eliminato i risulatti trovati e mi appare un errore: "documento scaduto". Se qualcuno magari sà la soluzione dell'enigma o può darmi qualceh indicazione per arrivarci gli sarei molto grato. |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11568 Residenza: Tokelau
|
Inviato: 09 Feb 2012 14:38 Oggetto: |
|
|
se sulla prima pagina usi un form in modalità 'POST' poi quando cercherai di passare alla seconda pagina attraverso un link non avrai più il valore 'POSTato'. Ti consiglio di passare il parametro sulla querystring, e quindi usare GET, così funzionerà in tutte le pagine successive. |
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 09 Feb 2012 23:17 Oggetto: |
|
|
Ok adesso provo, grazie per il consiglio. |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 09 Feb 2012 23:25 Oggetto: |
|
|
Nella generazione dei link, hai dimenticato di passare il parametro cerca (o almeno così mi pare).
Quando scrivi il for, ad un certo punto generi la query mettendo un "$cerca" ma dovresti fare una roba tipo: "..&cerca=$cerca&...". |
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 10 Feb 2012 23:46 Oggetto: |
|
|
Ok, ci sono riuscito, avevo fatto alcuni errori sui parametri e dovevo sistemare meglio una riga che avevo fatto, grazie a tutti. |
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 16 Feb 2012 19:34 Oggetto: |
|
|
Ok, ho l'ultimo problema e poi ho finito tutto il database finalmente. Allora, se io cerco la parola "prova" e mi escono un totale di 30 pagine, il browser visualizzarà tutte e 30 le pagine, nella lista in basso per la selezione. Vorrei sapere se c'è un modo per visualizzare solo ad esempio le prime 6 pagine così: 1 2 3 4 5 6 e poi continuando, ad esempio cliccando sul 6 così: 4 5 6 7 8 9. Credo che si faccia con l'apposita funzione LIMIT, però ho qualche dubbio che sia propio così... Comunque su google non ho trovato nulla in proposito e mi chiedo se qualcuno di voi lo sappia. Se avete una guida che spiega il procedimento propio per fare questo meglio ancora. Grazie. |
|
Top |
|
|
SverX Supervisor Macchinisti
Registrato: 25/03/02 11:16 Messaggi: 11568 Residenza: Tokelau
|
Inviato: 17 Feb 2012 13:45 Oggetto: |
|
|
immagino tu usi un ciclo for per stampare i link alle altre pagine... bene, basta che il tuo ciclo for parta da
k=max(1,pagina corrente-3)
e vada a
min(numero totale pagine, k+5)
|
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 17 Feb 2012 21:18 Oggetto: |
|
|
Grazie della risposta, però nno ho capito bene come implementare, normalmente ho questo: Codice: | for($i=1; $i <= $totPages; $i++) | , che è il ciclo for usato per stampare, con sotto la variabikle che stampa il risultato "$pagine". Adesso, ho provato a fare così:
Codice: | $k= max(1,$page-3);
$m= min($totPages, $k+5);
for($k; $m)($i=1; $i <= $totPages; $i++) | , ma forse tu non intendevi questo, comunque adesso faccio una ricerca su google e vedo se c'è qualche consiglio su questo tipo di aggiustamento, sperando di trovre magari dove sbaglio, se risolvo posto la soluzione. Ciao. |
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 18 Feb 2012 02:23 Oggetto: |
|
|
Allora, non ho ancora risolto il problema, ma dalle cose trovate su google meglio che specifichi subito il tutto. I dati per essere pubblicati passano attraverso una $variabile , che pubblica le pagine tramite una funzione implode( "$a", "$b"), ovviamente ho utilizzato nomi a caso per gli esempi, però meglio specificare il tutto... Quella cosa he ho scritto prima in codice ignoratela, non conoscevo la funzione è ho inserito il tutto un pò a caso, comunque ancora non ho capito come fare. |
|
Top |
|
|
freemind Supervisor sezione Programmazione
Registrato: 04/04/07 20:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 19 Feb 2012 13:23 Oggetto: |
|
|
Aspetta, che vuol dire:
Codice: |
for($k; $m)($i=1; $i <= $totPages; $i++)
|
Il ciclo deve diventare
Codice: |
for ($i=$k;$i<=$m;++$i)
{
...
}
|
ossia $i deve partire da $k e terminare in $m dove $k e $m sono definite come ti ha fatto vedere SverX.
Quello che hai scritto tu non esiste in php. |
|
Top |
|
|
HelpMe!!! Eroe in grazia degli dei
Registrato: 16/12/11 21:03 Messaggi: 87
|
Inviato: 19 Feb 2012 16:10 Oggetto: |
|
|
Grazie mille della risposta, avevo mal interpretato la sintassi di SverX ed ero andato fuori strada. Avevo pensato che dovessi metterli dentro quei parametri comunque, ma mi dava degli errori di sintassi, e ho pensato che non fosse quella la strada (invece lo era), per questo ho deciso di metterli fuori (sbagliando, anche se non avevo mai visto una cosa del genere, e come ho scritto, poi ho deciso di abbandonarla perchè sembrava veramente strana la sintassi, nonchè impossibile...).
Certo che voi due ne sapete di cose....
Come sempre adesso funziona. Bravi. |
|
Top |
|
|
|