Last 5.3 release ever available: PHP 5.3.29 - 5.3 now EOL

mysqli_stmt::store_result

mysqli_stmt_store_result

(PHP 5)

mysqli_stmt::store_result -- mysqli_stmt_store_resultTransfiere un conjunto de resultados desde una sentencia preparada

Descripción

Estilo orientado a objetos

bool mysqli_stmt::store_result ( void )

Estilo por procedimientos

bool mysqli_stmt_store_result ( mysqli_stmt $stmt )

Se debe llamar a mysqli_stmt_store_result() para cada consulta que produzca con éxito un conjunto de resultados (SELECT, SHOW, DESCRIBE, EXPLAIN), y únicamente si se quiere almacenar en buffer el conjunto de resultados completo en el cliente, por lo que las llamadas subsuguientes a mysqli_stmt_fetch() devolverán datos almacenados en buffer.

Nota:

No es necesario llamar a mysqli_stmt_store_result() para otras consultas, pero si se hace, no perjudicará al rendimiento en ningún caso. Se puede detectar si la consulta produjo un conjunto de resultados comprobando si mysqli_stmt_result_metadata() devolvió NULL.

Parámetros

stmt

Sólo estilo por procediminetos: Un identificador de declaraciones devuelto por mysqli_stmt_init().

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Ejemplos

Ejemplo #1 Estilo orientado a objetos

<?php
/* Abrir una conexión */
$mysqli = new mysqli("localhost""mi_usuario""mi_contraseña""world");

/* comprobar la conexión */
if (mysqli_connect_errno()) {
    
printf("Falló la conexión: %s\n"mysqli_connect_error());
    exit();
}

$consulta "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
if (
$sentencia $mysqli->prepare($consulta)) {

    
/* ejecutar la consulta */
    
$sentencia->execute();

    
/* almacenar el resultado */
    
$sentencia->store_result();

    
printf("Número de filas: %d.\n"$sentencia->num_rows);

    
/* liberar el resultado */
    
$sentencia->free_result();

    
/* cerrar la sentencia */
    
$sentencia->close();
}

/* cerrar la conexión */
$mysqli->close();
?>

Ejemplo #2 Estilo por procedimientos

<?php
/* Open a connection */
/* Abrir una conexión */
$enlace mysqli_connect("localhost""mi_usuario""mi_contraseña""world");

/* comprobar la conexión */
if (mysqli_connect_errno()) {
    
printf("Falló la conexión: %s\n"mysqli_connect_error());
    exit();
}

$consulta "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
if (
$sentencia mysqli_prepare($enlace$consulta)) {

    
/* ejecutar la consulta */
    
mysqli_stmt_execute($sentencia);

    
/* almacenar el resultado */
    
mysqli_stmt_store_result($sentencia);

    
printf("Number of rows: %d.\n"mysqli_stmt_num_rows($sentencia));

    
/* liberar el resultado */
    
mysqli_stmt_free_result($sentencia);

    
/* cerrar la sentencia */
    
mysqli_stmt_close($sentencia);
}

/* cerrar la conexión */
mysqli_close($enlace);
?>

El resultado de los ejemplos serían:

Número de filas: 20.

Ver también

add a note add a note

User Contributed Notes 5 notes

up
1
pcc at pccglobal dot com
4 years ago
When using prepare to prepare a statement to retrieve LOBs the method order matters.
Also, method 'store_result()' must be called and be called in correct order.
Failure to observe this causes PHP/MySQLi to crash or return an erroneous value.
The proper procedure order is: prepare -> execute -> store_result -> bind -> fetch
The following applies to a Windows SBS server running IIS/6.0 + PHP 5.2.1
MySQL server version 5.0.26-community-nt, client version 5.0.51a

<?php
$database
= "test" ;
$table = "test" ;
$column = "flongblob" ;
$mysqli = new mysqli("localhost", "root", "<secret_password>", $database);
// Proper procedure order: prepare -> execute -> store_result -> bind -> fetch
$stmt = $mysqli->prepare("SELECT `$column` FROM `$table`") ;
$stmt->execute();
$stmt->store_result();
// Fetch a record. Bind the result to a variable called 'value' and fetch.
$stmt->bind_result($value) ;
$res = $stmt->fetch() ;
if(
$res)
{
 
// strlen($value) should have LOB length, not 1 or zero.
 
echo "$column data length is " . strlen($value) . " bytes.\n" ;
}
else
{
  echo ((
false !== $res) ? "End of data" : $stmt->error) . "\n" ;
  break ;
}
// Fetch another record.
$res = $stmt->fetch() ;
if(
$res)
{
 
// strlen($value) should have LOB length, not 1 or zero.
 
echo "$column data length is " . strlen($value) . " bytes.\n" ;
}
else
{
  echo ((
false !== $res) ? "End of data" : $stmt->error) . "\n" ;
  break ;
}
$stmt->close() ;
$mysqli->close() ;
exit ;
?>

The above example should output:
  flongblob data length is 932353 bytes.
  flongblob data length is 867300 bytes.

If wrong procedure order MySQLi crashes or outputs:
  flongblob data length is 0 bytes.
  flongblob data length is 867300 bytes.
up
1
neromir at hotmail dot com
5 years ago
The wording above, in the initial description of the function, can be confusing (quoted below). 

"You must call mysqli_stmt_store_result() for every query that successfully produces a result set (SELECT, SHOW, DESCRIBE, EXPLAIN), and only if you want to buffer the complete result set by the client, so that the subsequent mysqli_stmt_fetch() call returns buffered data. "

I had initially understood the part saying "and only if you want to buffer..." to mean that it was only necessary to call this function if you wanted to buffer the result set.  This, however, is not the case, and the misunderstanding caused me quite a bit of grief. 

So, to clarify for anyone suffering from the same misunderstanding, you ALWAYS must call this function for every query that produces a result set (as listed in the parentheses of the quote above), as far as I can tell.
up
0
Lars Gyrup Brink Nielsen
10 months ago
Actually, mysqli_stmt_result_metadata() returns FALSE, not NULL, when the query/statement doesn't produce a result set. You would have to check the if the $mysqliObject->error is an empty string to see whether the FALSE return means that the query does not produce a result set or that an error occured.
up
0
Typer85 at gmail dot com
7 years ago
In response to the note below me for the claim that mysqli_fetch_fields is not compatible with prepared statements.

This is untrue, it is but you have to do a little extra work. I would recommend you use a wrapper function of some sort to take care of the dirty business for you but the basic idea is the same.

Let's assume you have a prepared statement like so. I am going to use the procedural way for simplicity but the same idea can be done using the object oriented way:

<?php

// Connect Blah Blah Blah.

$connectionLink = mysqli_connect( .... );

// Query Blab Blah Blah.

$query = "Select `Id` From `Table` Where `Id` = ?";

// Prepare Query.

$prepareObject = mysqli_prepare( $connectionLink , $query );

// Bind Query.

mysqli_stmt_bind_param( $prepareObject , 'i' , 1 );

// Execute Query.

mysqli_stmt_execute( $prepareObject );

?>

Now all the above is fine and dandy to anyone familiar with using prepared statements, but if I want to use mysqli_fetch_fields or any other function that fetches meta information about a result set but does not work on prepared statements?

Enter the special function mysqli_stmt_result_metadata. It can be used as follows, assume the following code segment immediatley follows that of the above code segment.

<?php

$metaData
= mysqli_stmt_result_metadata( $prepareObject );

// I Can Now Call mysqli_fetch_fields using the variable
// $metaData as an argument.

$fieldInfo = mysqli_fetch_fields( $metaData );

// Or Even This.

$fieldInfo = mysqli_num_fields( $metaData );

?>

Take a look at the Manual entry for mysqli_stmt_result_metatdata function for full details on how to expose it with prepared statements.

Good Luck,
up
0
UCFirefly (at) yahoo.com
8 years ago
fetch_fields() does not seem to be compatible with prepared statements like those used here. Makes things difficult if you're using a wildcard. I guess that's better for security in some obscure way.

-Alex Boese
To Top