Newsgroup: it.comp.www.php
Titolo: query MySQL (peso dati)

Ciao,
so che la domanda potrà apparire stupida.
una volta interrogato un db, esiste la possibilità di sapere quale è
il peso in Kb di quanto il db restituisce?
Grazie.

 il peso in Kb di quanto il db restituisce?
Per quale motivo ti serve di saperlo?
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

> Per quale motivo ti serve di saperlo?
 
Mi interesserebbe per un uso combinato con AMFPHP

 Mi interesserebbe per un uso combinato con AMFPHP
Fa finta che io non sappia che cosa sia AMFPHP e per quale motivo ti
dovrebbe servire di sapere quanti dati ti restituisce MySQL.
-- 
I am what I am, I do what I can


 dovrebbe servire di sapere quanti dati ti restituisce MySQL.
Hai ragone, ti chiedo scusa.
AMFPHP è il porting in PHP (open-source) di una applicazione
commerciale (Flash Remoting) creata da Macromedia per permettere a
Flash di caricare dati binari piuttosto che stringhe ASCII: di fatto,
in precedenza, per leggere dati provenienti dall'esterno, un file swf
doveva avere istanziato al proprio interno un oggetto (tipicamente
LoadVars, ma non era/è l'unico) in grado di leggere sequenze
url-encoded di coppie nome-valore che PHP o altri linguaggi inviavano
via echo e funzioni similari. Tipicamente, una stringa come
"&prodotto=mioProdotto&costo=5000%20talleri" poteva essere letta da
Flash come:
nomeIstanzaLoadVars.prodotto
nomeIstanzaLoadVars.costo
Forse ho tralasciato qualcosa, ma penso che il nocciolo sia abbastanza
chiaro. O almeno spero.  :-)
Con Flash Remoting, la differenza è che quando tramite PHP si
interroga un db, non c'è necessità di eseguire alcun tipo di fetch
del risultato restituito: il risultato, ad esempio, di mysql_query
viene passato direttamente a Flash che provvede a farne un oggetto
RecordSet, sul quale è possibile fare una serie di operazioni (sort, e
quant'altro), indipendentemente dal db (cioè, il db non va
necessariamente re-interrogato per ottenere risultati, che possono
essere "filtrati" in qualche modo).
Perché la curiosità di cui alla domanda del primo post. Perché i
dati possono essere tanti e sapendo quale è la quantità di dati in
arrivo e la velocità di scaricamento mi sarebbe possibile fare dei
calcoli per costruire una sorta di preloader percentuale (una cosa è
se sono 10Kb di dati, altra se sono molti di più e l'utente, in
quest'ultimo caso, avrebbe la sensazione di essere stato abbandonato:
questo è ovviabile in altre maniere, ma mi interesserebbe in ogni caso
sapere se è possibile ricavare il dato in qualche modo). Ho cercato,
ma ritengo non sia possibile: se però pensi che sia possibile mi
interesserebbe sapere dove cercare per studiare la cosa più a fondo.

La butto li':
Potresti calcolare quanti bytes occupa una singola riga della tua
query; poi basta un mysql_num_rows per sapere quanti record seleziona
la tua query ed una banale moltiplicazione per conoscere i bytes
totali.
Naturalmente (soprattutto se usi molti valori a lunghezza variabile) il
risultato sara' approssimato ma visto che non ti serve essere preciso
direi che potrebbe andare.
Bye

 RecordSet,
Non e' proprio cosi'. E' AMF-PHP a fare la conversione per te, non
flash. Da cui, AMF-PHP conosce la dimensione di quello che inviera',
guardati i forgenti di mysqlAdapter.php e capirai che cosa intendo.
IMHO l'unica soluzione e' quella di crearti un tuo adapter ed
utilizzarlo per ottenere un pre-calcolo del peso dei dati che verranno
inviati e poi, succesivamente, i dati stessi.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E


 inviati e poi, succesivamente, i dati stessi.
in effetti, perň, nell'API di PHP per MySQL non sembrerebbe esserci 
qualcosa che ti permetta un pre-calcolo. Cioč, credo tu possa farlo come 
dice david, ma se la ricerca dovesse essere libera e non su di una query 
specifica (tipo motore di ricerca)? Se le query sono in qualche modo 
"prevedibili" e costrette la cosa funziona.

 qualche modo "prevedibili" e costrette la cosa funziona.
Come gia' suggerito a Lotus, e' il caso che anche tu dia una occhiata
ai sorgenti di mysqlAdapter.php.
AMF-PHP estrae tutto il contenuto della query, lo elabora e lo invia
all'utente, da cui AMF-PHP sa quanto e' grande lo stream di dati che
inviera', anche con query non strutturate o campi di testo di lunghezza
variabile.
-- 
I am what I am, I do what I can


 ai sorgenti di mysqlAdapter.php.
ti riferisci a questo?
http://www.amfphp.org/apidocs//__filesource/fsource_flashservices_sql_sqlmysqlAdapter.php.html

Mauro Di Blasi wrote:

Si, come puoi vedere AMF-PHP esegue una lettura completa dei dati, al
termine della chiamata al costruttore, $this->initialData conterra'
tutti i dati del recordset. A partire da quell'array e da
$this->columnNames e $this->numRows viene costruito lo stream binario
da inviare a flash. AMF-PHP sa quanto sara' grande tale stream di dati
prima di inviarlo, e volendo uno potrebbe decidere di usare una tecnica
di pre-fetching per farsi dire, ad esempio, quanto e' grande il
risultato della richiesta (e lato server salvarne una cache sul disco),
e successivamente richiamarla nuovamente senza effettuare dinuovo la
query etc. Le soluzioni sono molteplici.


 risultato della richiesta
Setec, nutro qualche dubbio (anche irragionevole, se vuoi) e ti chiedo 
di sfatarlo. Tu dici: "AMF-PHP sa quanto sara' grande tale stream di 
dati prima di inviarlo". Non è possibile, invece, che i calcoli siano 
contemporanei all'inizio dell'invio del dato, cioè che il dato sia 
ancora da "fetchare" completamente quando arriva a Flash? Dico questo 
perché Remoting dispone di metodi per sapere quanti record ha caricato 
Flash.

 record ha caricato Flash.
Basta che guardi il codice:
 function mysqlAdapter($d) {
        while ($line = mysql_fetch_row($d)) {
            foreach($line as $key => $value) {
                $line[$key] = $value;
            } 
            $this->initialData[] = $line;
        } 
        $fieldcount = mysql_num_fields($d);
        for($i = 0; $i < $fieldcount; $i++) {
            $this->columnNames[$i] = mysql_field_name($d, $i);
        } 
        $this->numRows = mysql_num_rows($d);
    } 
Non ci sono callback, PHP non ha thread, per cui il codice del
costruttore viene eseguito completamente prima di proseguire. Flash sa
quanti record gli sono stati inviati perche' gli viene passato quanto
salvato in $this->numRows.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E


 il peso in Kb di quanto il db restituisce?
Prova in questo modo:
SELECT SUM(BIT_LENGTH('nome_campo'))/8 as byteTotal  FROM tabella
ti restituisce la lunghezza in byte della query :)
prova e facci sapere
-- 
                                  [CapoBecchino]
| --------------------------------------------- |
| hotmail/msn: capobecchino [@] hotmail [.] com |
| yahoo: capo_becchino [@] yahoo [.] it         |
| icq: 217325174                                |
| --------------------------------------------- |
!!! SODDISFATTI O RIMBORSATI !!!
Nessuno si č mai lamentato della nostra offerta 2x1. Morire in 2 e 
pagare per 1.

 salvato in $this->numRows.
esiste una lista di discussione sul prodotto, forse potrebbe aggiungersi 
ad un qualche tipo di wish-list

Tutti post molto interessanti, grazie.
C'è parecchio da studiare ma per lo meno so da dove cominciare.
Lotus
Lotus ha scritto:
