(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_queryПосылает запрос MySQL без авто-обработки результата и его буферизации


resource mysql_unbuffered_query ( string $query [, resource $link_identifier = NULL ] )

mysql_unbuffered_query() посылает запрос MySQL query без автоматической обработки и буферизации её результата, в отличие от функции mysql_query(). Это позволяет сохранить достаточно большое количество памяти для SQL-запросов, возвращающих большое количество данных. Кроме того, вы можете начать работу с полученными данными сразу после того, как первый ряд был получен: вам не приходится ждать до конца SQL-запроса. При использовании mysql_unbuffered_query() с несколькими соединениями MySQL, вы должны указать необязательный параметр link_identifier.

Список параметров


Запускаемый SQL-запрос.

Данные в запросе должны быть корректно проэкранированы.


Соединение MySQL. Если идентификатор соединения не был указан, используется последнее соединение, открытое mysql_connect(). Если такое соединение не было найдено, функция попытается создать таковое, как если бы mysql_connect() была вызвана без параметров. Если соединение не было найдено и не смогло быть создано, генерируется ошибка уровня E_WARNING.

Возвращаемые значения

Для SELECT, SHOW, DESCRIBE и EXPLAIN запросов mysql_unbuffered_query() возвращает resource в случае успеха, или FALSE в случае ошибки.

Для остальных типов SQL-запросов, UPDATE, DELETE, DROP и т.д., mysql_unbuffered_query() возвращает TRUE в случае успеха и FALSE в случае ошибки.



Однако, плюсы использования mysql_unbuffered_query() имеют свою цену: вы не можете использовать функции mysql_num_rows() и mysql_data_seek() с результатом запроса, возвращённым этой функцией, пока не будут получены все ряды. Кроме того, вы должны будете обработать все ряды запроса до отправки нового запроса, используя тот же link_identifier.

Смотрите также


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.
2002-05-18 00:25:44
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 ...
2003-02-18 00:21:30
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:

// 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 );
2003-05-21 19:45:49
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.
2003-11-29 19:57:22
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.
2008-05-27 12:47:59

    Поддержать сайт на родительском проекте КГБ