Newsgroup: it.comp.www.php
Titolo: mysql_query vs mysql_unbuffered_query : dubbio esistenziale

Ciao ng.
Sarà la giornata ma rileggendo il manuale di php mi è sorto un dubbio
esistenziale (infatti è da un po' che programmo in php con mysql, non dovrei
avere di questi quesiti!!! boh, sarà giornata!)
La domanda è che differenza c'è tra mysql_query e mysql_unbuffered_query?
Per quanto ne sò io il primo dovrebbe eseguire la query e restituire i
risultati (nel senso che li bufferizza permettendone la lettura con le altre
funzioni mysql_*) mentre il secondo dovrebbe eseguire la query e non
restituire nulla!
Però leggendo il manuale sembra che queste due righe siano equivalenti:
mysql_query ( 'UPDATE prova SET campo=10', $idDb, MYSQL_STORE_RESULT)
mysql_unbuffered_query ('UPDATE prova SET campo=10', $idDb,
MYSQL_USE_RESULT)
E sembra che anche queste due siano equivalenti:
mysql_query ( 'UPDATE prova SET campo=10', $idDb, MYSQL_USE_RESULT)
mysql_unbuffered_query ('UPDATE prova SET campo=10', $idDb,
MYSQL_STORE_RESULT)
E' vero? (O semplicemente ho bisogno di ferie?)
Grazie, ciao!

 restituire nulla!
il manuale on line è molto chiaro:
CITE:
  mysql_unbuffered_query() sends a SQL query query to MySQL, without 
fetching and buffering the result rows automatically, as mysql_query() 
does. On the one hand, this saves a considerable amount of memory with 
SQL queries that produce large result sets. On the other hand, you can 
start working on the result set immediately after the first row has been 
retrieved: you don't have to wait until the complete SQL query has been 
performed. When using multiple DB-connects, you have to specify the 
optional parameter link_identifier.
     Note: The benefits of mysql_unbuffered_query() come at a cost: You 
cannot use mysql_num_rows() and mysql_data_seek() on a result set 
returned from mysql_unbuffered_query(). You also have to fetch all 
result rows from an unbuffered SQL query, before you can send a new SQL 
query to MySQL.
Ciao Gianfranzo
-- 
ICQ#: 21258924 Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo è contro la guerra
"dopo tutto, gli angeli non sono altro che dei volatili" D. Pennac

 performed.
Questo significa che le query eseguite con mysql_query vengono eseguite in
modo asincrono? Significa cioè che se eseguo una UPDATE con mysql_query e
subito di seguito eseguo una SELECT  non è detto che la SELECT restituisca
le righe già modificate?
Non hai riportato il manuale in modo molto completo!  ;-)
In particolare manca questa frase che è quella che mi ha tratto in inganno:
[CITE]
Il parametro opzionale modo_risultato può essere MYSQL_USE_RESULT e
MYSQL_STORE_RESULT. Il valore predefinito è MYSQL_USE_RESULT, quindi il
risultato non è bufferato. Vedere anche mysql_query() per la controparte di
questo comportamento.
Cosa significa?
E per quel che riguarda gli esempi di codice che ho riportato si comportano
effettivamente come dico io?
Grazie dell'attenzione.
    Ciao

 effettivamente come dico io?
in ulteriore conferma ho trovato questa nota, spero ti aiuti a chiarire 
la questione:
You are absolutely required to retrieve all rows in the result set 
(option 'a' in the first comment). If you fail to do so, PHP will do so 
for you, and will emit a NOTICE warning you of the fact. From the MySQL 
API, "Furthermore, you must retrieve all the rows even if you determine 
in mid-retrieval that you've found the information you were looking for. ".
Also note that if you are using this function, you should be quick about 
processing the result set, or you will tie up the MySQL server (other 
threads will be unable to write to the tables you are reading from).
If you want to be able to 'abort' mid result-set or if you want to do 
lengthy processing on the results, you are misunderstanding the purpose 
of this function.
Also note that UPDATE queries etc return no result set, so this function 
is only useful for SELECT etc.


.>>>On the one hand, this saves a considerable amount of memory with
.>>>SQL queries that produce large result sets.
.>>
.>>Fin qui è chiaro: non restituisce i risultati e quindi è più veloce
.>
.>in più dice che i risultati sono diponibili a partire dalla prima riga
.>estratta, e che non sono nella struttura associativa che crea
.mysql_query()
.Più che altro (correggimi se sbaglio) dice che "risparmia un bel po' di
.memoria nel caso di query che producono set di risultati (record) molto
.grandi.
.>>>On the other hand, you can
.>>>start working on the result set immediately after the first row has been
.>>>retrieved: you don't have to wait until the complete SQL query has been
.>>>performed.
.>>
.>>Questo significa che le query eseguite con mysql_query vengono eseguite
.in
.>>modo asincrono? Significa cioè che se eseguo una UPDATE con mysql_query
.e
.>>subito di seguito eseguo una SELECT  non è detto che la SELECT
.restituisca
.>>le righe già modificate?
.>
.>mi pare che le update non producono resultset, quindi il problema non si
.>pone.
.Non è questo che ho detto; ho semplicemente ipotizzato l'eventualità che:
.1. eseguo una UPDATE utilizzando mysql_query
.2. eseguo una SELECT dei record modificati al punto 1
.3. mi rendo conto che i record non hanno ancora subito le modifiche in
.quanto mysql_query funziona in modo asincrono (al contrario con
.mysql_unbuffered_query "you don't have to wait until the complete SQL query
.has been performed" quindi mysql_unbuffered_query è sincrona)
.E' giusto? Può accadere tutto questo?
.
.>mi pare che aggiungi altro a quello che è scritto:
.>dice solo che non è stato creato il buffer completo della query, i
.>risultati sono disponibili man mano che vengono prelevati, li devi
.>prendere uno a uno e fare quello che ti serve, ti dice pure che non puoi
.>fare altre query fino a che non hai consumato tutti altrimenti perdi i
.>risultati per cui, ti cito un commento del manuale on line:
.>
.>So what it means is that -normaly- you could do this:
.>
.>$res1 = mysql_query("select some",$db_conn);
.>while ($row = mysql_fetch_row($res)) {
.>   $res2 = mysql_query("select some other",$db_conn);
.>   // do some other stuff
.>}
.>
.>With an unbuffered query you could NOT do this, the result set from
.>$res1 would be LOST on the second query.
.Questo mi è stato utile, mi sono chiarito un paio di cose!
.
.>However, it does not mean you -have- to fetch all rows ... just that the
.>API does not save the result set in memory for you.
.>
.>quindi se fai una query con mysqlquery() viene creata una "struttura" in
.>memoria che rappresenta il resultset della query, se la fai unbuffered
.>questa struttura non c'è per cui se fai una seconda query sulla stessa
.>connessione perdi la prima.
.Chiarissimo a parte il fatto che: d'accordo se la faccio unbuffered la
query
.successiva sovvrascrive i risultato della prima... Ma se non eseguo nessuna
.query dopo quella unbuffered i dati li ho a disposizione tanto quanto con
.una query buffered! Giusto?
.
.>>Non hai riportato il manuale in modo molto completo!  ;-)
.>>In particolare manca questa frase che è quella che mi ha tratto in
.inganno:
.>>[CITE]
.>>Il parametro opzionale modo_risultato può essere MYSQL_USE_RESULT e
.>>MYSQL_STORE_RESULT. Il valore predefinito è MYSQL_USE_RESULT, quindi il
.>>risultato non è bufferato. Vedere anche mysql_query() per la controparte
.di
.>>questo comportamento.
.>>
.>>Cosa significa?
.>>E per quel che riguarda gli esempi di codice che ho riportato si
.comportano
.>>effettivamente come dico io?
.>
.>in ulteriore conferma ho trovato questa nota, spero ti aiuti a chiarire
.>la questione:
.>
.>You are absolutely required to retrieve all rows in the result set
.>(option 'a' in the first comment). If you fail to do so, PHP will do so
.>for you, and will emit a NOTICE warning you of the fact. From the MySQL
.>API, "Furthermore, you must retrieve all the rows even if you determine
.>in mid-retrieval that you've found the information you were looking for.
.".
.>
.>Also note that if you are using this function, you should be quick about
.>processing the result set, or you will tie up the MySQL server (other
.>threads will be unable to write to the tables you are reading from).
.>
.>If you want to be able to 'abort' mid result-set or if you want to do
.>lengthy processing on the results, you are misunderstanding the purpose
.>of this function.
.>
.>Also note that UPDATE queries etc return no result set, so this function
.>is only useful for SELECT etc.
.Ok...
.Però ancora non hai considerato le mie ultime righe!!!
.Ti giro la domanda: che differenza c'è tra l'utilizzo del parametro
.MYSQL_USE_RESULT e l'utilizzo invece di MYSQL_STORE_RESULT? (ti faccio
.notare che questo parametro esiste sia nelle unbuffered che nelle
buffered!)

 buffered!)
ascolta, ma in quale manuale trovi il terzo parametro della mysql_query 
o mysql_unbuffered_query io davvero non trovo quel parametro.
anche nelle API mysql sono descritte le due funzioni mysql_use_result e 
mysql_store_result, ma appunto sono funzioni e non parametri....e nel 
manuale di php non le trovo proprio neanche on line...
parli delle funzioni mysqli di php 5?
da: 
http://it.php.net/manual/en/function.mysqli-query.php
mysqli_query
(PHP 5 CVS only)
mysqli_query -- Performs a query on the database
Description
resource mysqli_query ( resource link, string query [, int resultmode])
The mysqli_query() function is used to simplify the act of performing a 
query against the database represented by the link parameter. 
Functionally, using this function is identical to calling 
mysqli_real_query() followed either by mysqli_use_result() or 
mysqli_store_result() where query is the query string itself and 
resultmode is either the constant MYSQLI_USE_RESULT or 
MYSQLI_STORE_RESULT depending on the desired behavior. By default, if 
the resultmode is not provided MYSQLI_STORE_RESULT is used.
qui non esiste la mysql_unbuffered_query e quindi hanno risolto in 
questo modo adottando un parametro opzionale in mysqli_query
pensavo che invece ti ponessi il problema del perchč esistono i due 
sistemi buffered e unbuffered
Ciao Gianfranzo
-- 
ICQ#: 21258924 Nick Gianfranzo
Home page 
http://www.gianfranzo.it
Gianfranzo č contro la guerra


 manuale di php non le trovo proprio neanche on line...
Guarda 
http://it2.php.net/manual/it/function.mysql-query.php
 e
http://it2.php.net/manual/it/function.mysql-unbuffered-query.php
; in
entrambi il parametro modo_risultato è quello di cui parlo io.