SunshinePHP Developer Conference 2015

mysqli::use_result

mysqli_use_result

(PHP 5)

mysqli::use_result -- mysqli_use_result Готовит результирующий набор на сервере к использованию

Описание

Объектно-ориентированный стиль

mysqli_result mysqli::use_result ( void )

Процедурный стиль

mysqli_result mysqli_use_result ( mysqli $link )

Используется для подготовки к использованию результирующего набора последнего запроса, запущенного функцией mysqli_real_query().

Чтобы результаты запроса стали доступны, после самого запроса необходимо вызывать либо эту функцию, либо mysqli_store_result(). Также вызов какой-либо из них предотвратит отказ следующих запросов на этом же соединении.

Замечание:

mysqli_use_result() не передает весь результирующий набор на клиента, а следовательно невозможно воспользоваться функцией mysqli_data_seek(), чтобы перемещаться по нему. Для этого нужно воспользоваться функцией mysqli_store_result(). mysqli_use_result() не следует использовать, если на стороне клиента данные результирующего набора долго обрабатываются, так как это задерживает работу сервера и не дает другим процессам обновлять таблицы, данные из которых есть в результирующем наборе.

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

Возвращает небуферизованный объект результата запроса или FALSE в случае ошибки.

Примеры

Пример #1 Пример использования mysqli::use_result()

Объектно-ориентированный стиль

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Не удалось подключиться: %s\n"mysqli_connect_error());
    exit();
}

$query  "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* выполняем мультизапрос */
if ($mysqli->multi_query($query)) {
    do {
        
/* получаем первый результирующий набор */
        
if ($result $mysqli->use_result()) {
            while (
$row $result->fetch_row()) {
                
printf("%s\n"$row[0]);
            }
            
$result->close();
        }
        
/* печатаем разделитель */
        
if ($mysqli->more_results()) {
            
printf("-----------------\n");
        }
    } while (
$mysqli->next_result());
}

/* закрываем соединение */
$mysqli->close();
?>

Процедурный стиль

<?php
$link 
mysqli_connect("localhost""my_user""my_password""world");

/* проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Не удалось подключиться: %s\n"mysqli_connect_error());
    exit();
}

$query  "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* выполняем мультизапрос */
if (mysqli_multi_query($link$query)) {
    do {
        
/* получаем первый результирующий набор */
        
if ($result mysqli_use_result($link)) {
            while (
$row mysqli_fetch_row($result)) {
                
printf("%s\n"$row[0]);
            }
            
mysqli_free_result($result);
        }
        
/* печатаем разделитель */
        
if (mysqli_more_results($link)) {
            
printf("-----------------\n");
        }
    } while (
mysqli_next_result($link));
}

/* закрываем соединение */
mysqli_close($link);
?>

Результат выполнения данных примеров:

my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer

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

add a note add a note

User Contributed Notes 1 note

up
1
Anonymous
2 years ago
> One should not use mysqli_use_result() if a lot of processing on the client side is performed, since this will tie up the server and prevent other threads from updating any tables from which the data is being fetched.

Another way of understanding the "blocking" behavior of this "use_result" method is that by using this method (or the MYSQLI_USE_RESULT flag on the "query" method), if attempting to run a second query of any kind - updates, inserts, selects, or other - while still working with these first results, the second query will fail.  Checking mysqli->error, you should get a "Commands out of sync" error on the second query call.

However, if you use the "store_result" method (or the default MYSQLI_STORE_RESULT flag on the "query" method) instead, the second query will execute just fine.

Just to demonstrate this "blocking" behavior of this "use_result" method, the second query on line 7 below would otherwise fail if you instead used "use_result" on line 3:

<?php
$mysqli
->real_query('SELECT * FROM `test`');
$query = $mysqli->store_result();
while (
$row = $query->fetch_assoc()) {
   
$id = (int) $row['id'];
   
$query2 = $mysqli->query("UPDATE `test` SET `label` = md5(rand()) WHERE `id` = $id");
}
?>
To Top