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

search for in the

Mysqli> <mysql_thread_id
[edit] Last updated: Fri, 17 May 2013

view this page in

mysql_unbuffered_query

(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_querySendet eine SQL Anfrage an MySQL, ohne Ergebniszeilen abzuholen und zu puffern.

Beschreibung

resource mysql_unbuffered_query ( string $query [, resource $Verbindungs-Kennung ] )

mysql_unbuffered_query() sendet die SQL Anfrage query an MySQL, ohne dass die Datensätze des Ergebnisses automatisch geholt und gepuffert werden, wie es bei der Verwendung von mysql_query() der Fall ist. Dies spart eine erhebliche Menge an Speicher bei SQL Anfragen ein, die große Ergebnismengen liefern und sie können unmittelbar mit dem Anfrageergebnis arbeiten, sobald der erste Datensatz gefunden wurde: Sie müssen nicht darauf warten, bis die gesamte SQL Anfrage abgeschlossen ist. Zur Nutzung von mysql_unbuffered_query() mit verschiedenen Datenbanken gleichzeitig zugegriffen, muss der optionale Parameter Verbindungs-Kennung angegeben werden.

Parameter-Liste

query

Die auszuführende SQL Abfrage.

Werte innerhalb der Abfrage sollten mit korrekt maskiert sein.

Verbindungs-Kennung

Die MySQL-Verbindung. Wird die Verbindungskennung nicht angegeben, wird die letzte durch mysql_connect() geöffnete Verbindung angenommen. Falls keine solche Verbindung gefunden wird, wird versucht, eine Verbindung aufzubauen, wie es beim Aufruf von mysql_connect() ohne Angabe von Argumenten der Fall wäre. Falls zufällig keine Verbindung gefunden oder aufgebaut werden kann, wird eine Warnung der Stufe E_WARNING erzeugt.

Rückgabewerte

Für SELECT, SHOW, DESCRIBE oder EXPLAIN Anweisungen gibt mysql_unbuffered_query() eine Kennung resource bei Erfolg zurück oder FALSE bei Fehlern.

Für alle anderen von SQL Anweisungen wie INSERT, UPDATE, DELETE, DROP, etc, gibt mysql_unbuffered_query() TRUE bei Erfolg zurück oder FALSE bei Fehlern.

Anmerkungen

Hinweis:

Die Vorteile von mysql_unbuffered_query() haben ihren Preis: Auf ein Ergebnis von mysql_unbuffered_query() können die Funktionen mysql_num_rows() und mysql_data_seek() nicht angewendet werden. Ausserdem müssen Sie sicherstellen, dass Sie alle Zeilen des Ergebnisses einer ungepufferteten SQL Anfrage abgeholt haben. Erst dann können Sie eine neue SQL Anfrage bei Nutzung derselben Verbindung Verbindungs-Kennung an MySQL absetzen.

Siehe auch



Mysqli> <mysql_thread_id
[edit] Last updated: Fri, 17 May 2013
 
add a note add a note User Contributed Notes mysql_unbuffered_query - [9 notes]
up
0
crazyone at crazycoders dot net
4 years ago
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.
up
-1
shaner at accretivetg dot com
9 years ago
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;
    }
  }
}
?>
up
0
post at jfl dot dk
9 years ago
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.
up
0
frappyjohn at dos2linux dot org
10 years ago
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 ...
up
0
david at php dot net
11 years ago
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.
up
-1
silvanojr at gmail dot com
7 years ago
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.
up
-1
andre dot steffens at adress-research dot de
8 years ago
If you use mysql_ping() to check the connection, the resultset from mysql_unbuffered_query() will be kill.
up
-1
steve_stockman at mac dot symantec dot com
9 years ago
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');
}
?>
up
-1
Anonymous
9 years ago
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.

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