downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Mysqli> <mysql_thread_id
[edit] Last updated: Fri, 23 Mar 2012

view this page in

mysql_unbuffered_query

(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_queryWysyła zapytanie do serwera MySQL nie pobierając i nie buforując wyniku

Opis

resource mysql_unbuffered_query ( string $zapytanie [, resource $identyfikator_połączenia ] )

mysql_unbuffered_query() wysyła zapytanie SQL do serwera MySQL, nie pobierając i nie buforując wyników zapytań, w przeciwieństwie do mysql_query(). To oszczędza znaczną ilość pamięci w zapytaniach SQL, które generują duże zbiory wynikowe. Można pracować na zbiorze wynikowym natychmiast po pobraniu pierwszego rekordu. Nie trzeba czekać, aż zapytanie SQL zostanie w bazie danych wykonane do końca. Aby posługiwać się funkcją mysql_unbuffered_query() z kilkoma połączeniami do baz danych, należy podawać opcjonalny parametr identyfikator_połączenia określający, które połączenie ma zostać wykorzystane.

Parametry

zapytanie

Zapytanie SQL do wykonania

Dane w zapytaniu powinny być poprzedzone poprawnymi znakami ucieczki.

identyfikator_połączenia

Połączenie MySQL. Jeśli identyfikator połączenia nie zostanie podany, użyte zostanie ostatnie połączenie otwarte przez mysql_connect(). Jeśli połączenie takie nie zostanie znalezione, funkcja spróbuje nawiązać połączenie tak, jakby wywołana została funkcja mysql_connect() bez argumentów. Jeśli żadne połączenie nie zostanie znalezione lub nawiązane, wygenerowany zostanie błąd poziomu E_WARNING.

Zwracane wartości

Dla wyrażeń SELECT, SHOW, DESCRIBE lub EXPLAIN, mysql_unbuffered_query() zwraca zasób w przypadku sukcesu lub FALSE gdy nastąpi niepowodzenie.

Dla innych typów wyrażeń SQL, UPDATE, DELETE, DROP, etc, mysql_unbuffered_query() zwróci TRUE w przypadku powodzenia lub FALSE gdy nastąpi błąd.

Notatki

Informacja:

Oprócz korzyści, funkcja mysql_unbuffered_query() wprowadza pewne ograniczenia: nie można użyć funkcji mysql_num_rows() i mysql_data_seek() na zbiorze wynikowym, zwróconym przez mysql_unbuffered_query(). Trzeba także pobrać wszystkie wiersze ze zbioru wynikowego niebuforowanego zapytania SQL przed wysłaniem kolejnego.

Zobacz też:



Mysqli> <mysql_thread_id
[edit] Last updated: Fri, 23 Mar 2012
 
add a note add a note User Contributed Notes mysql_unbuffered_query
crazyone at crazycoders dot net 27-May-2008 11:47
You are NOT required to read all rows from the resultset when using unbuffered query, you may opt out at any time and use mysql_free_result. Imagine looking at 1 million row when the first 50 suffice? Just free the result and you are good to go again.
silvanojr at gmail dot com 12-May-2006 04:02
Note:  The benefits of mysql_unbuffered_query() come at a cost: You cannot use mysql_num_rows() and...

but it looks like you can use SQL_CALC_ROWS on MySQL to get the total rows without the limit.
andre dot steffens at adress-research dot de 08-Oct-2004 08:18
If you use mysql_ping() to check the connection, the resultset from mysql_unbuffered_query() will be kill.
steve_stockman at mac dot symantec dot com 01-Apr-2004 04:19
If you are going to do a large query, but are concerned about blocking access to the table during an unbuffered query, why not go through a temporary table? (Of course, this is predicated on the current user having permission to create tables.)

<?php
$dbQuery
= "SELECT something ...";
if (
mysql_query ("CREATE TEMPORARY TABLE MyQuery $dbQuery")) {
   
$numRows = mysql_affected_rows();
    if (
$numRows == 0) {
       
/* handle empty selection */
   
} else {
       
$result = mysql_unbuffered_query ('SELECT * FROM MyQuery');
       
/* handle result */
   
}
   
mysql_query ('DROP TABLE MyQuery');
}
?>
post at jfl dot dk 29-Nov-2003 06:57
If using optimized MyISAM tables I guess there is a big advantage with this function as it is possible to do selects and inserts on the same time as long as no rows in the table gets updated.
14-Jun-2003 12:35
The other hand should really be, that the table remains locked until all rows have been retrieved, right?  This is a very important thing to mention, you could tie up the whole database with a lock.
shaner at accretivetg dot com 21-May-2003 06:45
Regarding bailing on a really large result, while doing an unbuffered query, there _is_ a way to do this: kill the thread and exit your processing loop.  This, of course, requires having a separate database link.  Something like below does the trick:

<?php
// a db link for queries
$lh  = mysql_connect( 'server', 'uname', 'pword' );
// and a controller link
$clh = mysql_connect( 'server', 'uname', 'pword', true );

if (
mysql_select_db ( 'big_database', $lh ) )
{
 
$began  time();
 
$tout   = 60 * 5; // five minute limit
 
$qry    = "SELECT * FROM my_bigass_table";
 
$rh     = mysql_unbuffered_query( $qry, $lh );
 
$thread = mysql_thread_id ( $lh );
  while (
$res = mysql_fetch_row( $rh ) )
  {
   
/* do what you need to do
     * ...
     * ...
     */
   
if ( ( time() - $began ) > $tout )
    {
     
// this is taking too long
     
mysql_query( "KILL $thread", $clh );
      break;
    }
  }
}
?>
frappyjohn at dos2linux dot org 17-Feb-2003 11:21
Don't let the two hands confuse you, these are both advantages (they should really be on the same hand):

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 ...
david at php dot net 17-May-2002 11:25
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.

 
show source | credits | sitemap | contact | advertising | mirror sites