|
|
 |
mysql_unbuffered_query (PHP 4 >= 4.0.6, PHP 5) mysql_unbuffered_query -- Send an SQL query to MySQL, without fetching and buffering the result rows Descriptionresource mysql_unbuffered_query ( string query [, resource link_identifier] )
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.
Parameters
- query
A SQL query
-
link_identifier
The MySQL connection. If the
link identifier is not specified, the last link opened by
mysql_connect() is assumed. If no such link is found, it
will try to create one as if mysql_connect() was called
with no arguments. If by chance no connection is found or established, an
E_WARNING level warning is generated.
Return Values
For SELECT, SHOW, DESCRIBE or EXPLAIN statements,
mysql_query()
returns a resource on success, or FALSE on
error.
For other type of SQL statements, UPDATE, DELETE, DROP, etc,
mysql_query() returns TRUE on success
or FALSE on error.
NotesNote:
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.
User Contributed Notes
mysql_unbuffered_query
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.)
$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 07: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:
// 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
18-Feb-2003 12: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.
chabotc at reviewboard dot com
21-Aug-2001 04:21
Stefan,
unbuffered query sends a query to the server, and does not first download the results before sending them to the end-user (php in this case).
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.
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.
However, when using different db connections, it all works ofcource ...
For more information, please refer to the mysql manual, they have a lot of docs on query & unbuffered queries (the php api is just a basic wrapper around there native api's).
| |