Ejemplo de cómo utilizar bind_result vs get_result

83

Me gustaría ver un ejemplo de cómo llamar usando bind_resultvs. get_resulty cuál sería el propósito de usar uno sobre el otro.

También los pros y los contras de usar cada uno.

¿Cuál es la limitación de usar cualquiera y hay alguna diferencia?

Arian Faurtosh
fuente

Respuestas:

198

El factor decisivo para mí es si llamo a mis columnas de consulta usando *.

Usar bind_result()sería mejor para esto:

// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';

Usar get_result()sería mejor para esto:

// Use get_result() with fetch_assoc() 
$query2 = 'SELECT * FROM table WHERE id = ?';

Ejemplo 1 de $query1usobind_result()

$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Store the result (to get properties) */
   $stmt->store_result();

   /* Get the number of rows */
   $num_of_rows = $stmt->num_rows;

   /* Bind the result to variables */
   $stmt->bind_result($id, $first_name, $last_name, $username);

   while ($stmt->fetch()) {
        echo 'ID: '.$id.'<br>';
        echo 'First Name: '.$first_name.'<br>';
        echo 'Last Name: '.$last_name.'<br>';
        echo 'Username: '.$username.'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Ejemplo 2 de $query2usoget_result()

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
   /*
        Binds variables to prepared statement

        i    corresponding variable has type integer
        d    corresponding variable has type double
        s    corresponding variable has type string
        b    corresponding variable is a blob and will be sent in packets
   */
   $stmt->bind_param('i',$id);

   /* execute query */
   $stmt->execute();

   /* Get the result */
   $result = $stmt->get_result();

   /* Get the number of rows */
   $num_of_rows = $result->num_rows;



   while ($row = $result->fetch_assoc()) {
        echo 'ID: '.$row['id'].'<br>';
        echo 'First Name: '.$row['first_name'].'<br>';
        echo 'Last Name: '.$row['last_name'].'<br>';
        echo 'Username: '.$row['username'].'<br><br>';
   }

   /* free results */
   $stmt->free_result();

   /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();

Como puede ver, no puede usar bind_resultcon *. Sin embargo, get_resultfunciona para ambos, pero bind_resultes más simple y elimina parte del lío $row['name'].


bind_result ()

Pros:

  • Más simple
  • No hay necesidad de meterse con $row['name']
  • Usos fetch()

Contras:

  • No funciona con consultas SQL que usan *

get_result ()

Pros:

  • Funciona con todas las declaraciones SQL
  • Usos fetch_assoc()

Contras:

  • Debe jugar con variables de matriz $row[]
  • No tan ordenado
  • requiere controlador nativo de MySQL ( mysqlnd )
Arian Faurtosh
fuente
8
Dios mío, desearía encontrar estas preguntas y respuestas ANTES de vincular todo a un archivo $row[]. ¡Gracias por la explicación detallada! Una advertencia; según el manual get_result () solo
Sablefoste
2
@SableFoste ¡Correcto! Y eso significa ... tienes que meterte con las configuraciones ... así que ... usa bind_result.
prueba
1
para todos aquellos en los que el método get_result () no funciona: stackoverflow.com/questions/8321096/…
Karl Adler
3
get_result () tampoco funcionó para mí para el segundo ejemplo: seguí devolviendo False y errno = 0 (sin error). La eliminación de la llamada store_result () lo solucionó.
winwaed
1
@Black almacena las propiedades de la consulta ... como el número de filas devueltas, etc.
Arian Faurtosh
2

Puede encontrar ejemplos en las respectivas páginas del manual.

Si bien los pros y los contras son bastante simples:

  • get_result es la única forma sensata de manejar los resultados
  • sin embargo, no siempre está disponible y su código debe tener un respaldo usando ugly bind_result.

De todos modos, si su idea es utilizar cualquiera de las funciones correctamente en el código de la aplicación, esta idea es incorrecta. Sin embargo, siempre que los tenga encapsulados en algún método para devolver sus datos de la consulta, realmente no importa cuál usar, salvo por el hecho de que necesitará diez veces más código para implementar bind_result.

Tu sentido común
fuente
1
<b> Error fatal </b>: llamada al método indefinido mysqli_stmt :: get_result () el código anterior da tal error
Kissa Mia
1
Lo siento, pero no encuentro que bind_result () sea feo ... ¿Puedes explicar dónde está la fealdad?
Samuel Ramzan
1

La principal diferencia que he notado es que bind_result()le da un error 2014, cuando intenta codificar $ stmt anidado dentro de otro $ stmt , que se está recuperando (sin mysqli::store_result()):

Preparación fallida: (2014) Comandos desincronizados; no puedes ejecutar este comando ahora

Ejemplo:

  • Función utilizada en el código principal.

    function GetUserName($id)
    {
        global $conn;
    
        $sql = "SELECT name FROM users WHERE id = ?";
    
        if ($stmt = $conn->prepare($sql)) {
    
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->bind_result($name);
    
            while ($stmt->fetch()) {
                return $name;
            }
            $stmt->close();
        } else {
            echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
        }
    }
    
  • Código principal.

    $sql = "SELECT from_id, to_id, content 
            FROM `direct_message` 
            WHERE `to_id` = ?";
    if ($stmt = $conn->prepare($sql)) {
    
        $stmt->bind_param('i', $myID);
    
        /* execute statement */
        $stmt->execute();
    
        /* bind result variables */
        $stmt->bind_result($from, $to, $text);
    
        /* fetch values */
        while ($stmt->fetch()) {
            echo "<li>";
                echo "<p>Message from: ".GetUserName($from)."</p>";
                echo "<p>Message content: ".$text."</p>";
            echo "</li>";
        }
    
        /* close statement */
        $stmt->close();
    } else {
        echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    }
    
Norman Edance
fuente
En realidad, esto no es del todo cierto ... no está usando bind_resultcorrectamente
Arian Faurtosh
1
Si lo usa $stmt->store_result(), le permitirá hacerlo anidado $stmtdentro de otro$stmt
Arian Faurtosh
@ArianFaurtosh, ¿qué estoy haciendo mal? La documentación sobre mysqli_stmt::bind_resultPHP.net no me dice nada sobre mi error ... ¿O es una buena práctica de usar $stmt->store_result()?
Norman Edance
@ArianFaurtosh, pensé que si mysql_store_result ()envía un conjunto de resultados grande, puede convertirse en un problema, ¿o me equivoco? Sí, para este ejemplo tal vez no sea tan importante, sin embargo ... De todos modos, gracias por corregirme :)
Norman Edance
1

get_result () ahora solo está disponible en PHP mediante la instalación del controlador nativo de MySQL (mysqlnd). En algunos entornos, puede que no sea posible o deseable instalar mysqlnd.

No obstante, aún puede usar mysqli para hacer consultas 'select *' y obtener los resultados con los nombres de los campos, aunque es un poco más complicado que usar get_result () e implica usar la función call_user_func_array () de php. Vea el ejemplo en Cómo usar bind_result () en lugar de get_result () en php, que realiza una consulta simple de 'seleccionar *' y genera los resultados (con los nombres de las columnas) en una tabla HTML.

mti2935
fuente
0

Creo que el ejemplo 2 solo funcionará así, porque store_result y get_result obtienen la información de la tabla.

Así que quita

/* Store the result (to get properties) */
$stmt->store_result();

Y cambia un poco el orden. Este es el resultado final:

$query2 = 'SELECT * FROM table WHERE id = ?'; 
$id = 5;

if($stmt = $mysqli->prepare($query)){
 /*
    Binds variables to prepared statement

    i    corresponding variable has type integer
    d    corresponding variable has type double
    s    corresponding variable has type string
    b    corresponding variable is a blob and will be sent in packets
 */
$stmt->bind_param('i',$id);

/* execute query */
$stmt->execute();

/* Get the result */
$result = $stmt->get_result();

/* Get the number of rows */
$num_of_rows = $result->num_rows;

while ($row = $result->fetch_assoc()) {
    echo 'ID: '.$row['id'].'<br>';
    echo 'First Name: '.$row['first_name'].'<br>';
    echo 'Last Name: '.$row['last_name'].'<br>';
    echo 'Username: '.$row['username'].'<br><br>';
}

/* free results */
$stmt->free_result();
Coolen
fuente