php mysqli_stmt bind_result array
Ejemplo de cómo usar bind_result vs get_result (5)
Creo que el ejemplo 2 solo funcionará así, porque store_result y get_result obtienen la información de la tabla.
Así que elimine
/* Store the result (to get properties) */
$stmt->store_result();
Y cambia el orden un poco. 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();
Me gustaría ver un ejemplo de cómo llamar usando bind_result
vs. get_result
y cuál sería el propósito de usar uno sobre el otro.
También los pro y los contras de usar cada uno.
¿Cuál es la limitación de usar cualquiera y hay una diferencia?
Ejemplos que puede encontrar en las respectivas páginas del manual.
Mientras que los pro 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 utilizando feo bind_result.
De todos modos, si su idea es usar cualquiera de las funciones directamente 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, en realidad no importa, cuál usar, excepto por el hecho de que necesitará diez veces más código para implementar bind_result.
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 para $query1
usando bind_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 para $query2
usando get_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_result
con *
. Sin embargo, get_result
funciona para ambos, pero bind_result
es más simple y elimina parte del desorden con $row[''name'']
.
bind_result ()
Pros:
- Más simple
- No hay necesidad de meterse con
$row[''name'']
- Utiliza
fetch()
Contras:
- No funciona con consultas SQL que usan
*
get_result ()
Pros:
- Funciona con todas las declaraciones SQL
- Utiliza
fetch_assoc()
Contras:
- Debe perder el tiempo con las variables de matriz
$row[]
- No tan ordenado
- requiere controlador nativo de MySQL ( mysqlnd )
La principal diferencia que he notado es que bind_result()
le da el error 2014
, cuando intenta codificar $ stmt anidado dentro de otro $ stmt , que se va a buscar (sin mysqli::store_result()
):
Preparar el error: (2014) Los comandos no están sincronizados; 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; }
get_result () ahora solo está disponible en PHP instalando el controlador nativo de MySQL (mysqlnd). En algunos entornos, puede que no sea posible o deseable instalar mysqlnd.
No obstante, puede utilizar mysqli para hacer consultas ''select *'' y obtener los resultados con los nombres de campo, aunque es un poco más complicado que usar get_result (), e implica el uso de 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 hace una simple consulta ''select *'', y muestra los resultados (con los nombres de las columnas) en una tabla HTML.