Paginazione mysql

  • Creatore Discussione Creatore Discussione spidy58
  • Data di inizio Data di inizio

spidy58

Nuovo Utente
7 Giu 2012
9
0
0
ciao a tutti, sono appena arrivato e avrei bisogno di un aiuto per una paginazione ASP+MYSQL che ho trovato qui:

https://www.mrw.it/asp/articoli/paginazione-dati-asp-mysql_746.html

Funziona benissimo...ma dato che l'ho usata per un motore di ricerca, mi da un problema che nn so come risolvere...:crying:

così come è il codice adesso conta sempre tutti i record, ma a me chiaramente serve che conti i record trovati in base alla ricerca.
per esempio di cui allego un immagine di una ricerca e 2 risultati trovati:
esempio.jpg

nel DB al momento per provare, ho inserito solo 19 record e in base ad una ricerca soddisfatta con solo 2 record, dice sempre 19 trovati e crea una seconda pagina vuota (ho impostato risultati per pagina=10)
grazie a tutti per l' aiuto che potrete darmi...:o
Rob
 

grazie, ho guardato e provato anche quelle che mi hai consigliato, ma il problema rimane...
il fatto è che queste paginazioni sono create per leggere il DB (e infatti funzionano benissimo), senza legami ad una ricerca,
restituiscono tutti i record e le relative pagine, ma se si allegano ad una ricerca restituscono sempre il totale dei record e non quelli trovati
in base alla ricerca stessa...:crying:
un Rob in speranzosa attesa...:D
 
Ciao,

se ti restituisce 19 e come hai scritto hai 19 recorìd, è logico supporre che il rs.recordcount

conta i record dove ti deve stampare il risultato dei documenti trovati viene fatto sul solo recordcount.

Devi usare rs.PageCount e rs.AbsolutePage associati alla variabile che passi in querystring che si chiama Pagina

es:

Dim totalpages
totalpages = rs.PageCount
rs.AbsolutePage = Pagina ' *

per il risultato:

Codice:
<%Response.write "<font face =Arial size=2>"
Response.Write "Pagina " & Pagina & " di " & totalPages & "<br>"
Response.Write "Record Trovati :<b> " & rs.RecordCount & "</b><br>"
Response.Write " </font>"%>

*
Codice:
Dim currentPage
If Len(Request.QueryString("Pagina")) = 0 Then
Pagina = 1
Else
Pagina = CInt(Request.QueryString("Pagina"))
End If

Impostare le costanti il numero dei record per pagina da mostrare prima di attivare [2] [3] ecc...

Nella sql metti come riferimento:

Codice:
Dim Sql

Sql = "SELECT * FROM nome_tabella where nome_campo =  '" & request.queryString("Ricerca") & "'"

Nella barra degli indirizzi hai se la pagina si chiama risultato.asp:

risultato.asp?Ricerca=datocercato

Risultato per frase esatta

Valeria.
 
ciao Vale,
grazie tantissimo per la risposta ma ti volevo chiedere una cosa, io prima di usare Mysql, con Access avevo una paginazione che usa Absolutepage, ma facendo una ricerca ho saputo che non è supportata da Mysql...infatti quando l'ho provata mi dava sempre errore.
ho trovato più di una paginazione in ASP+MYSQL in cui avrei dovuto usare Select Count per la conta e Limit per la paginazione...ma va bene per leggere normalmente i dati, ma per una ricerca sembra di no!
cmq ti post il codice magari si capisce meglio...;)))


<%
PageName = Request.ServerVariables("PATH_INFO")
SearchMethod = Request.ServerVariables("REQUEST_METHOD")






Dim pag
pag = Request.QueryString("pag")
If IsNumeric(pag) = False Or pag < 1 Then pag = 1

If SearchMethod = "POST" Then

search = request.form("search")

ElseIf SearchMethod = "GET" Then
search = request.QueryString("search")

End If




%>

<form method="post" name="editform">
<tr bgcolor="">
<td width="150" align="left" class="text"><b></b></td>
<td width="680" align="left" class="text">
<!--motore-->
<form method="post" action="default.asp?go=searchcom3" name="editform">
<input type="radio" name="criterio" value="ext" checked> frase esatta&nbsp;&nbsp;<input type="radio" name="criterio" value="all"> tutte le parole

<input type="text" name="search" size="30" value="<%=search%>">
<input type="submit" value="CERCA" name="submit" class=box onMouseOver="this.className='submit'" onmouseOut="this.className='box'" onFocus="this.blur()">
</form>
<!--fine motore---->
</td>
<%
session ("search") = request.form ("search")
%>
</tr>
<tr bgcolor="">
<td colspan="3" align="left" class="text" height="1"></td>
</tr>
</form>
<script language="javascript">document.editform.search.focus();</script>
<% If SearchMethod = "POST" And len(search) = 0 Then %>
<tr>
<td colspan="3" height="60" align="center" class="text" bgcolor="#FFFFFF"><b>Digitare un testo per la ricerca</b></td>
</tr>
<tr bgcolor="#000033">
<td colspan="3" height="1"></td>
</tr>

<% End If %>
<%
if len(search) > 0 then






'connessione mysql
Dim cn, rs
Set cn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
cn.open = "driver={MySQL ODBC 3.51 Driver};server=;database=;uid=;pwd="
'conn.Open str_Conn



rs.Open "SELECT COUNT(*) AS temp FROM searchcom", cn, 3 ,3
Dim quanti, a, b
quanti = CInt(rs("temp"))
b = 10
a = (pag - 1) * b
rs.Close
If quanti > 0 Then
Dim sql


sql = "Select * From searchcom Where"


If request.form("criterio") <> "ext" Then

ArrSearch = Split(search)
x = 0
for each Word In ArrSearch


sql = sql & " (doc like '%" & Replace(word, "'", "''") & "%' Or parola_chiave like '%" & Replace(word, "'", "''") & "%' Or anno like '%" & Replace(word, "'", "''") & "%' Or data like '%" & Replace(word, "'", "''") & "%'Or massime like '%" & Replace(word, "'", "''") & "%' ) "
If Not x = UBound(ArrSearch) Then sql = sql & " or"

' Se preferisci la ricerca di una qualsiasi delle parole inserite
' in tutti dodumenti usa questo codice:
' If Not x = UBound(ArrSearch) Then sql = sql & " Or"


x = x + 1
Next

Else
sql = sql & " (doc like '%" & Replace(search, "'", "''") & "%' Or parola_chiave like '%" & Replace(search, "'", "''") & "%'Or anno like '%" & Replace(search, "'", "''") & "%' Or data like '%" & Replace(search, "'", "''") & "%'Or massime like '%" & Replace(search, "'", "''") & "%' ) "
End If


sql = sql & " LIMIT " & a & ", " & b
rs.CursorType = adOpenDynamic
rs.Open sql, cn

'set rs = server.createobject("adodb.recordset")
'set rs = conn.execute(sql)



If rs.Eof=True or rs.Bof=True then
Response.Write "<P>Nessun risultato trovato</P>"
Else




%>
<td colspan="3" class="text" bgcolor="#FFFFFF"><b>Pagina
<%=pag%>/<%=intero%>
- Risultati relativi alla ricerca:<span style="background-color: #ffff00; color: #ff0000">"<%=search%>"</span> - Totale documenti
trovati <%=rs.recordcount%></b></td>


<%
response.Write "<td class=""link"" valign=""top"" colspan=""""><div align=""justify""><i><b><a class='link' href=""defaultnew.asp?go=anteprimacom&id=" & rs("id") & "&search=" & Server.UrlEncode(search)& """><font color=""black"">" & EvidenziaParola(Left(rs("doc"),191), search, "<span style=""background-color:#ffff00; color: #ff0000""><b>", "</b></span>")
If Len(rs("doc")) > 10 Then Response.write "..."
response.Write "</a></font></i></div>&nbsp;</td></tr>"
%>
<%
Dim i, intero
i = 1
intero = CInt(quanti / b)
If quanti > (intero * b) Then
intero = intero + 1
End If
%>
<b>Pagina <%=pag%> di <%=intero%></b><br><br>
<%
For i = 1 To intero
If CInt(i) = CInt(pag) Then
%>
[<b><%=i%></b>]
<%
Else
%>
[<b><a href="<%=PageName%>?go=searchcom3&pag=<%=i%>&search=<%=Server.UrlEncode(search)%>"><%=i%></a></b>]

spero che sia utile per capire meglio il mio problema.....
grazie ancora
Rob
 
Ciao,

non controllo il codice, prego inserirlo usando l'apposito tasto # peultimo a destra della textarea, difficile organizzare gli acapo, ecc..

Devi usare LIMIT, LIMIT consente di limitare il numero di risultati restituiti da una interrogazione e può essere utilizzata con uno o due parametri. La stringa SQL seguente ad esempio:

SELECT * FROM tabella LIMIT 10

restituisce i primi 10 record della tabella specificata.

SELECT * FROM tabella LIMIT 7, 10

restituisce 10 record della tabella specificata a partire dal settimo record.

conteggia il numero di record totali della query e il numero di pagine (per la visualizzazione dei link delle altre pagine)

Codice:
sql = "SELECT COUNT(*) AS CNT FROM tabella"
set rs = cn.execute(sql)
recordCount = rs("CNT")

recuperi il numero delle pagine totali.

Codice:
pageCount = int(CInt(recordCount) / pageSize)
rs.Close()

seleziona i record da visualizzare nella pagina corrente.

Codice:
sql = "SELECT * FROM tabella " &_
      " LIMIT " & (currentPage - 1) * pageSize & ", " & pageSize
set rs = cn.execute(sql)

visualizza il contenuto del recordset e chiudi la connessione al database.

Codice:
do while not rs.eof
  Response.Write(rs("nome_campo") & "<br>")
  rs.MoveNext()
loop

rs.Close()
set rs = nothing

cn.Close()
set cn = nothing

visualizzo i link alle pagine

Codice:
dim i
for i=1 to pageCount
  Response.Write("<a href=""tua_pagina.asp?pagina=" & i & """>" & i & "</a> ")
next

Inizio pagina

Codice:
<%

dim currentPage, pageSize, recordCount, pageCount

imposta il numero di record da visualizzare in ogni pagina.

Codice:
pageSize = 20

leggo la pagina corrente dalla querystring.

Codice:
if(len(Request.QueryString("pagina"))=0)then
  currentPage = 1
else
  currentPage = CInt(Request.QueryString("pagina"))
end if

Nota non sono ordinati solo esempi.

Sistema la tua SQL in base alle tue eseigenze, per il resto non c'è altro.

Valeria.
 
ciao grazie ancora per la risposta, ho provato a cambiare il mio codice con quello che mi hai mandato(abbastanza simile al mio), ma il risultato nn cambia, restituisce sempre il numero totale dei records e non quelli in base alla ricerca...:(
grazie cmq per l' interessamento...
rob
 
Ciao,

devi contare solo quello che chiedi e passi in querystring.


Codice:
sql = "SELECT * FROM  tabella where [B]nome_campo[/B] =  '" & request.queryString("[B]Ricerca[/B]") & "'" &_
      " LIMIT " & (currentPage - 1) * pageSize & ", " & pageSize
set rs = cn.execute(sql)

se la ricerca trova 5 record corrispondenti, es:

pagina.asp?Ricerca=Valeria

se hai 5 corrispondenze con il risultato valeria ti conta quelle non il recordCount di tutti i dati in tabella.

Valeria.
 
Ultima modifica:
Codice:
sql = "Select * From searchcom Where"


If request.form("criterio") <> "ext" Then

ArrSearch = Split(search)
x = 0
for each Word In ArrSearch


'" & request.queryString("Ricerca") & "'"


sql = sql & " (doc like '%" & request.queryString(word, "'", "''") & "%' Or parola_chiave like '%" & request.queryString(word, "'", "''") & "%' Or anno like '%" & request.queryString(word, "'", "''") & "%' Or data like '%" & request.queryString(word, "'", "''") & "%'Or massime like '%" & request.queryString(word, "'", "''") & "%'         ) "
If Not x = UBound(ArrSearch) Then sql = sql & " or"

' Se preferisci la ricerca di una qualsiasi delle parole inserite
' in tutti dodumenti usa questo codice:
' If Not x = UBound(ArrSearch) Then sql = sql & " Or"


x = x + 1
Next

Else
sql = sql & " (doc like '%" & request.queryString(search, "'", "''") & "%' Or parola_chiave like '%" & request.queryString(search, "'", "''") & "%'Or anno like '%" & request.queryString(search, "'", "''") & "%' Or data like '%" & request.queryString(search, "'", "''") & "%'Or massime like '%" & request.queryString(search, "'", "''") & "%'    ) "
End If
sql = sql & " LIMIT " & (currentPage - 1) * pageSize & ", " & pageSize
set rs = conn.execute(sql)


ho cambiato la query come mi hai suggerito, al posto di "Replace" ho messo "request.queryString", ma da questo errore:

Microsoft VBScript runtime error '800a01c2'

Wrong number of arguments or invalid property assignment: 'Request.QueryString'

----------------------------------------------------------------------

ho cambiato da così

Codice:
doc like '%" & request.queryString(search, "'", "''") & "%'

a così togliendo apici e doppi apici
Codice:
doc like '%" & request.queryString("search") & "%'

e a questo punto non cerca più la parola della ricerca, infatto ho inserito

Codice:
response.write (sql)

e mi da questo risultato

Codice:
Select * From searchcom Where (doc like '%%' Or parola_chiave like '%%' Or anno like '%%' Or data like '%%'Or massime like '%%' ) LIMIT 0, 5
come puoi vedere, appunto il querystring non passa.... la ricerca è vuota...

a questo punto è sicuramente una questione di sintassi, che una capra come me non riesce a capire come intervenire...
se riesci a risolvermi l' arcano, quando passi da Roma ti offro tanti di quei caffè da farti diventare isterica.....;)
grazie ancora per il tempo che mi dedichi
Rob
 
Ciao,

io non l'ho detto, ma come fai a contare i record di un determinato dato passato e trovato con solo il COUNT

passagli il dato che ti serve in querystring.


Codice:
sql = "SELECT COUNT(*) as CNT FROM [B]tabella[/B] WHERE [B]nome_campo LIKE '" & request.queryString("Ricerca") & "%'"[/B]
set rs = cn.execute(sql)
if not rs.eof then
recordCount = Cint(rs("CNT"))
pageCount = int(CInt(recordCount) / pageSize)
else
recordCount = 0
end if
set rs = nothing


Non puoi fare un replace di una querystring scritta in quel modo

nel caso scrivi replace((cosa(tua_querystring,"'","''"))

anche se è bene non mettere i replace dell'apice singolo in una SQL

mettilo a inizio paina nella forma:

cosa=(cosa,"'","''")
cosa2=(cosa,"'","''")
ecc...

nella sequel metti solo i dati lei like.

Nei link adesso sono contati in base alla request e non al conteggio totale dei record, con risultati vuoti per dati non esistento devi ripassare i dati della querystryng.

Questo è un esempio perfettamente funzionante, vedi se puoi risolvere controllando la configurazione dello script e dei codici.

Codice:
<%
dim currentPage, pageSize, recordCount, pageCount

pageSize = 10

if(len(Request.QueryString("page"))=0)then
currentPage = 1
else
currentPage = CInt(Request.QueryString("page"))
end if

dim cn, rs, sql

set cn = Server.CreateObject("ADODB.Connection")
cn.Open "Driver={MySQL ODBC 3.51 Driver};Server;Database=;user=;password=;"

sql = "SELECT COUNT(*) as CNT FROM utenti WHERE nome LIKE '" & request.queryString("Ricerca") & "%'"
set rs = cn.execute(sql)
if not rs.eof then
recordCount = Cint(rs("CNT"))
pageCount = int(CInt(recordCount) / pageSize)
else
recordCount = 0
end if
set rs = nothing

sql = "SELECT * FROM utenti where nome =  '" & request.queryString("Ricerca") & "'" &_
" LIMIT " & (currentPage - 1) * pageSize & ", " & pageSize 
set rs = cn.execute(sql)

If Not rs.EOF Then

Response.write "<font face=Arial size=2>"
Response.Write "Pagina " & currentPage & " di " & pageCount & "<br>"
Response.Write "Record Trovati :<b> " & recordCount & "</b><br>"
Response.Write " </font>"
Response.Write "<br><br>"

Else
%>
<font face=Arial size=2>Nessuna corrispondenza trovata per questa ricerca</font><%End If%> 
<%
Dim rcount, i, x
For i = 1 To rs.PageSize
rcount = i
If page > 1 Then
For x = 1 To (page - 1)
rcount =  rcount
Next
End If
%> 
<% 
If Not rs.EOF Then 
%><span><font face=Verdana size=-2><b></span><%=rs("Nome_campo")%><br></b></font> 
<font face=Verdana size=-2><%=rs("altro_nome_campo")%></font><br><br> <!-- se più di uno -->
<% 
rs.MoveNext
End If
Next	
%>
<%
rs.Close()
set rs = nothing
cn.Close()
set cn = nothing
%>
<br><br>
<%
For page2 = 1 to pageCount
if page2 = currentPage  then
response.write "<font face=""Verdana"" size=""-2"">[ <b>" & currentPage & "</b> ]</font>"
else
Response.Write "<font face=""Verdana"" size=""-2"">[</font> <a href='risultato.asp?page=" & page2 & "&Ricerca=" & Server.URLEncode(Request.QueryString("Ricerca")) & "'>"
Response.Write page2
Response.Write "</a> <font face=""Verdana"" size=""-2"">]</font>"
end if
Next                                       
%>

Vedi tu.

Ho visto la tua richiesta in altra sede, mi spiace ma non riceverai altre risposte.

Valeria.
 
grazie ancora una volta per la risposta, volevo dire, dovesse servire anche ad altri, che ho risolto non con "request.queryString("Ricerca")" ma con "request.form("Ricerca")...
grazie e scusa, ma non sapevo che c'è il veto di non partecipare anche su altri forum, ma sai quando si è veramente disperati... in questi casi ci si attacca a tutto..se conoscevo altri 20 forum avrei chiesto anche lì.....e cmq mi sembra che a quanto pare, non sono il solo....sai queste frasi perentorie
Ho visto la tua richiesta in altra sede, mi spiace ma non riceverai altre risposte.
dimostrano, appunto che non sono il solo dato che anche tu vai in altre sedi.... e che non ci si preoccupa dei problemi altri...
cmq ti ringrazio ancora per la disponibiltà e la chiudo anche io qui!
Roberto
 
grazie ancora una volta per la risposta, volevo dire, dovesse servire anche ad altri, che ho risolto non con "request.queryString("Ricerca")" ma con "request.form("Ricerca")...
grazie e scusa, ma non sapevo che c'è il veto di non partecipare anche su altri forum, ma sai quando si è veramente disperati... in questi casi ci si attacca a tutto..se conoscevo altri 20 forum avrei chiesto anche lì.....e cmq mi sembra che a quanto pare, non sono il solo....sai queste frasi perentorie dimostrano, appunto che non sono il solo dato che anche tu vai in altre sedi.... e che non ci si preoccupa dei problemi altri...
cmq ti ringrazio ancora per la disponibiltà e la chiudo anche io qui!
Roberto

Ciao,

l'unica differenza tra una request.form e una request.querystring sullo stesso campo è nel passare i dati in get o post sulla request stessa, indifferentemente dal method del form (get o post), se fai con una sola pagina può bastare la request del form, se devi portarti avanti dati a pagine successive, due tre o quattro sei obbligato ad usare la querystring, (migliore soluzione) o le session (sconsigliate), se non le chiudi (distruggi) con session.destroy, visto che ogni singolo utente accede alla stessa applicazione e le session sono memorizzate sul server a differenza delle request che sono memorizzate sul client.

grazie e scusa, ma non sapevo che c'è il veto di non partecipare anche su altri forum, ma sai quando si è veramente disperati...

1) non c'è nessun veto per il non partecipare (chiedere aiuto) in altri Forum, ci mancherebbe. Puoi postare il tuo problema in cento forum.
2) non sono iscritta a quel forum e non lo frequento neppure come visitatore, la comunicazione è arrivata da terzi, una persona che lo frequenta ed è iscritta.

Abbiamo riempito due pagine per una richiesta di facilità molto bassa, non si può (tra parentesi) fare richieste su codici buttati li e che al fin fine non funzionano. Pur non avendo bisogno di fare richieste personali a domande per la quale ho già la soluzione (se non la ho subito consulto i miei libri dedicati, dove ho studiato), basta solo un po d'impegno, per questo quando rispondo a un thread cerco di dare informazioni utili al risolvimento del problema prima di una soluzione definitiva.

Un poco bisogna studiare.

Comunque nessun problema, mi spiace della risposta data "Non riceverai più risposte" e sono contenta che tu abbia risolto il problema.

Adesso visto che la soluzione trovata può essere utile ad altri utenti, come si fa in tutti i fori, scrivi come hai risolto e posta il codice.

Saluti Valeria.
 

Discussioni simili