Cuándo cerrar Declaración Preparada

3 minutos de lectura

Avatar de usuario de Tarik
Tarik

¿Cuándo cerrar declaraciones preparadas en PHP?

Ejemplo:

    $query = "insert into web_reviews (title,added_date,reviewer_home_url,read_more_link,summary) values(?,?,?,?,?)";
    $stmt = $this->db->prepare($query);
    $stmt->bind_params($this->title,$this->added_date,$this->reviewer_home_url,$this->read_more,$this->summary);
    $stmt->execute() or die("Cannot add the date to the database, please try again.");
    $stmt->close();

    $stmt = $this->db->prepare("select id from web_reviews where title = ? and read_more = ?");
    $stmt->bind_params($this->title,$this->read_more);
    $stmt->execute();
    $stmt->bind_results($web_review_id);
    $stmt->close();

debo usar $stmt->close(); ¿aquí?

Editar:

Lo que está escrito en el Manual de PHP y también un comentario del manual dice:

Cierra una instrucción preparada. mysqli_stmt_close() también desasigna el identificador de declaración. Si la sentencia actual tiene resultados pendientes o no leídos, esta función los cancela para que se pueda ejecutar la siguiente consulta.

Comentario:

si está repitiendo una declaración en un ciclo usando bind_param y así sucesivamente dentro de él para una operación más grande. Pensé que sería bueno limpiarlo con stmt->close. pero se estropeaba siempre con un error después de aprox. 250 operaciones. Como lo probé con stmt->reset, funcionó para mí.

  • Tengo curiosidad por lo mismo… ¡Viendo este hilo!

    – Drewdin

    8 de julio de 2011 a las 23:05

Ese es un buen uso de cerrar, especialmente porque planea hacer otra consulta. Tanto con las declaraciones de PDO como con las declaraciones de MySQLi, encuentro que errar por el lado de la limpieza casi siempre es lo mejor: elimina posibles errores en el futuro.

En cuanto a los señores con 250 operaciones… No veo cuál es el caso de uso real. ¿Por qué necesita consultar la base de datos 250 veces diferentes? ¿Por qué no puede consultar la base de datos una vez con 250 registros? O, más probablemente, ¿por qué no puede consultar la base de datos 25 veces con 10 registros?

  • ¿Dices que solo es bueno para la limpieza? Porque tengo el problema de que cuando uso dos declaraciones de preparación sin cerrar la primera, aparece un error (consulte stackoverflow.com/questions/37164371/…). No estoy muy seguro de por qué, porque nunca he leído que esto sea crucial.

    – Adán

    12 de mayo de 2016 a las 8:34

No puedo comentar actualmente, así que solo estoy proporcionando una respuesta. Cuando ejecuta una declaración preparada que consulta la base de datos para obtener un resultado, no ejecutará otra consulta a menos que elimine el resultado actual que está almacenando. $resultado = $stmt->get_result(). En segundo lugar, si necesita guardar el resultado de la primera consulta para usarlo más tarde, le recomiendo usar dos conjuntos de resultados. El primero almacena el resultado de la primera ejecución de $stmt y el segundo para la segunda ejecución. Es posible que esto no responda la pregunta directamente, pero puede ayudar a alguien.

¿Ha sido útil esta solución?