Saltar al contenido

Declaración preparada de MySQLI: num_rows & fetch_assoc

Te recomendamos que revises esta solución en un ambiente controlado antes de enviarlo a producción, un saludo.

Solución:

Busqué durante mucho tiempo pero nunca encontré la documentación necesaria para responder correctamente, pero investigué.

$stmt->get_result() reemplazar $stmt->store_result() para este propósito. Entonces, si vemos

$stmt_result = $stmt->get_result();
var_dump($stmt_result);

obtenemos

object(mysqli_result)[3]
  public 'current_field' => int 0
  public 'field_count' => int 10
  public 'lengths' => null
  public 'num_rows' => int 8  #That we need!
  public 'type' => int 0

Por lo tanto, propongo la siguiente solución genérica. (Incluyo el informe de error que uso)

#Prepare stmt or reports errors
($stmt = $mysqli->prepare($query)) or trigger_error($mysqli->error, E_USER_ERROR);

#Execute stmt or reports errors
$stmt->execute() or trigger_error($stmt->error, E_USER_ERROR);

#Save data or reports errors
($stmt_result = $stmt->get_result()) or trigger_error($stmt->error, E_USER_ERROR);

#Check if are rows in query
if ($stmt_result->num_rows>0) 

  # Save in $row_data[] all columns of query
  while($row_data = $stmt_result->fetch_assoc()) 
    # Action to do
    echo $row_data['my_db_column_name_or_ALIAS'];
  

 else 
  # No data actions
  echo 'No data here :(';

$stmt->close();

$result = $stmt->execute(); /* function returns a bool value */

referencia: http://php.net/manual/en/mysqli-stmt.execute.php

así que es suficiente para escribir $stmt->execute(); para la ejecución de la consulta.


La idea básica es seguir lo siguiente secuencia :
1. hacer una conexión. (ahora, mientras usa el método sqli o PDO, realiza la conexión y se conecta con la base de datos en un solo paso)
2. preparar la plantilla de consulta
3. enlazar los parámetros con la variable
4. (establezca los valores para la variable si no está configurado o si desea cambiar los valores) y luego ejecute su consulta.
5. Ahora busque sus datos y haga su trabajo.
6. Cierre la conexión.


/*STEP 1*/
$mysqli = mysqli_connect($servername,$usrname,$pswd,$dbname);
/*STEP 2*/
$stmt = $mysqli->prepare("SELECT * FROM licences WHERE generated = ?");
/*Prepares the SQL query, and returns a statement handle to be used for further operations on the statement.*/
//mysqli_prepare() returns a statement object(of class mysqli_stmt) or FALSE if an error occurred.
/* STEP 3*/
$stmt->bind_param('i', $core['id']);//Binds variables to a prepared statement as parameters
/* STEP 4*/
$result = $stmt->execute();//Executes a prepared Query
/* IF you wish to count the no. of rows only then you will require the following 2 lines */
$stmt->store_result();//Transfers a result set from a prepared statement
$count=$stmt->num_rows;
/*STEP 5*/
//The best way is to bind result, its easy and sleek
while($data = $stmt->fetch()) //use fetch() fetch_assoc() is not a member of mysqli_stmt class
 //DO what you wish
  //$data is an array, one can access the contents like $data['attributeName']

Se debe llamar a mysqli_stmt_store_result() para (SELECCIONAR, MOSTRAR, DESCRIBIR, EXPLICAR), si se desea almacenar en búfer el resultado completo establecido por el cliente, de modo que la siguiente llamada a mysqli_stmt_fetch() devuelva datos almacenados en búfer.
No es necesario llamar a mysqli_stmt_store_result() para otras consultas, pero si lo hace, no dañará ni causará ningún rendimiento notable en todos los casos.
–referencia: php.net/manual/en/mysqli-stmt.store-result.php
y http://www.w3schools.com/php/php_mysql_prepared_statements.asp
Uno debe buscar la referencia anterior que enfrenta un problema con respecto a esto. Es posible que mi respuesta no sea perfecta, las personas pueden mejorar mi respuesta …

Su problema aquí es que para hacer un fetch->assoc()primero debe obtener un conjunto de resultados de una declaración preparada usando:

http://php.net/manual/en/mysqli-stmt.get-result.php

Y adivine qué: esta función solo funciona si está utilizando el controlador nativo de MySQL o “mysqlnd”. Si no lo está utilizando, obtendrá el mensaje “Error fatal”.

Aquí puedes ver las comentarios y valoraciones de los usuarios

Al final de todo puedes encontrar las notas de otros gestores de proyectos, tú aún puedes insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *