Newsgroup: it.comp.lang.perl
Titolo: come passaare un array ad una form

Ciao a tutti,
non riesco a passare un array come parametro ad una form.
Io valorizzo l'array facendo una selezione da database. Poi ho la necessitą
di passare l'array con tutto il suo contentuto ad una successiva form.
E' possibile passare l'array o l'indirizzo dell'array tramite form?
Il mio scopo č quello di visaualizzare il contenuto dell'array in + pagine.
Ciao,
    Ivan

Ti spiego brevemente qual'è il problema:
Ho scritto un cgi che legge l'input dell'utente , ed in base
a questo effettua delle ricerche su mysql. Dato che è possibile
ottenere come risposta migliaia di righe vorrei stampare i risultati
su piu pagine senza dover fare la select ogni volta che mi sposto da una
pagina all'altra dei risultati.
Utilizzo un campo $Offset per far stampare in sequenza le pagine; Il mio 
problema è che l'output di mysql viene salvato in un array, e quindi 
viene perso ad ogni esecuzione dello script.
Ho provato anche ad inserirlo come parametro di un form tra una pagine e 
l'altra ma niente!
Qualche idea?


 Qualche idea?
Se parli di un'applicazione (con gui o da shell) allora puoi farlo,
ma se parli di uno script su web ricorda che il programma nasce e muore con
il browser. Non puo' tenere in memoria (cioè nell'array) dei valori finché
viene cliccato su "pagina successiva": li perde non appena termina
l'esecuzione.
Quindi devi fare una query ogni volta che vai avanti con le pagine.
Al massimo puoi creare un file temporaneo dove ficcare i risultati, e
scavarvi dentro ad ogni pagina richiesta, ma poi dovrai trovare il modo di
cancellarlo al termine (un po' difficile...) e soprattutto dovrai combattere
contro le richieste contemporanee (ancora peggio).
Quindi, ti conviene fare una select ad ogni cambio pagina, spostandoti con
un solo parametro (che tu hai chiamato offset).
Ciao,
Guido.

 all'altra dei risultati.
Inserisci i risultati in un array, assegna un identificativo univoco
associato in qualche modo a un file, salva l'array su file tramite, ad
esempio, il modulo Storable (semplicissimo da usare ed efficiente),
restituisci i record che ti interessano, e costrusci i link next/previous
incorporando l'identificativo della query e gli offset appropriati. Le
successive richieste useranno i dati nel file, senza ripetere la query.
Predisponi un cron, o un demone, che rimuova i file vecchi.
Storable lo trovi qui:
 
http://search.cpan.org/author/AMS/Storable-2.05/
Bye,
Max

hmmm... mi pare di ricordare che puoi dare istruzioni a MySQL perché invece
di ritornarti tutti i records relativi a una certa query te ne ritorni solo
un certo range da-a.
Potresti usare un campo in cui scrivere il numero di record e usare un WHERE
per definire il range che vuoi, oppure/inoltre puoi usare LIMIT per limitare
il numero di record ritornati (devi però definire il numero da cui vuoi
partire).
Poi facilmente puoi aggiungerti un hidden filed o semplicemente una query
nel link che ti chiama la pagina successiva in cui metterai l'offset a cui
sei arrivato(come stai già facendo), però invece di chiedere TUTTI i records
e mostrarne solo una parte, è molto meglio che tu chieda SOLO i records che
ti servono usando l'offset per sapere quali devi chiedere.
La differenza è che se il risultato della tua query ti dovesse tornare
200.000 records, nel primo caso dovresti pupparti 200.000 record ogni volta
che generi una nuova pagina, mentre nell'altro caso ti tornerebbero solo -
diciamo - 20 record che ti servono per la pagina specifica. :-O
Capito il concetto?
--
-.. --- -- .. --.. .. ---
-.. . -- .. -.-. .... . .-.. .. ...
"Verdelli Christian" <""chrissy\"@(none)> wrote in message
news:3daac7c1$0$231$4d4e...@read.news.it.uu.net...


 wrote in message
news:Pine.LNX.4.21.021014...@localhost.localdomain...


Mi sono scaricato il modulo Storable, sembra interessante.
Se comunque volessi fare delle select ad ogni iterazione, dovrei
rifare ogni volta la stessa select,quindi giocare con gli
indici degli array ?
Grazie-


Non avevo letto il precedente,
con la limit posso solamente dire, ritorna i primi n campi, ma non i 
campi compresi da n ad n+ ;
Pero potrei ordinare le mie ricerche per ID ed inserire una clausola:
where (id > (id dell'ultima riga pagina precedente)) LIMIT $Offset;
Premetto che scrivo mentre penso quindi è probabile ci siano delle 
grosse c.....e!!!


 grosse c.....e!!!
Infatti! :-) LIMIT $Offset è una!
Quello che devi fare è farti dare ad esempio 20 records alla volta compresi
tra $offset e LIMIT, dove LIMIT è costante (ad esempio 20) mentre $offset
ogni volta avrà 20 numeri in più. Se tu aggiungi ad esempio offset=80 alla
query string lo prenderai da lì per sapere che la prossima SELECT dovrà
partire da 80 con LIMIT sempre il solito 20, (e aggiornerai la query con
offset=100 e così via.
NON ti consiglio di scrivere NESSUN file, per il semplice fatto che è
assurdo fare una query totale il cui risultato potrebbe essere gigantesco,
registrarlo su disco per poi andarlo a leggere lì.... magari il tipo si
legge solo le prime 2 pagine e tu hai lì un file enorme che non sai se devi
cancellare o no!
 ciao
--
-.. --- -- .. --.. .. ---
-.. . -- .. -.-. .... . .-.. .. ...
"Verdelli Christian" <""chrissy\"@(none)> wrote in message
news:3dac1802$0$222$4d4e...@read.news.it.uu.net...


 
LIMIT in MySql puo' funzionare in questo modo:
LIMIT x, y
x = offset.
y = numero record da leggere.
Qui trovi una descrizione migliore dell mia :)
http://www.mysql.com/doc/en/SELECT.html
Quindi, se non ho capito male, quello che 
"potresti" fare e' passare al cgi 
(per ogni successiva pagina)
la stessa query ed il nuovo offset.
Nel programma e' sufficente ricostruire
la SELECT modificando l'offset di LIMIT.
Marco
P.S.
sperando di non essere troppo OT :)

O visto che esiste un'opzione di mysql, SQL_CALC_FOUND_ROWS
che calcola il numero di righe totali, e non solamente quelle
ritornata da LIMIT; L'opzione però e disponibile dalla versione
4.0 in poi.
Esiste qualche altro metodo per le versioni precedenti?
Grazie.
e


 
Non so' rispondere alla tua domanda,
posso solo dirti come ho risolto io in una situazione 
simile:
Il programma controlla il valore di un parametro passato
tramite form.
Se il valore e' nullo allora esegue una SELECT per calcolare
il numero totale dei record - count(id)-.
Altrimenti vuol dire che il mumero di record e' gia stato 
calcolato in predecenza ed il risultato si trova nel parametro.
Ho fatto in questo modo perche' il DB subisce variazioni
che non hanno influenza sulle query. In altre parole ripetendo 
la stessa query in momenti diversi si ottiene sempre lo stesso 
numero di record.
Forse potrebbe "funzionare" anche nel tuo caso.
Prova a postare la domanda su un gruppo piu' adatto
per esempio:
it.comp.software.database
un saluto
Marco