Su verificación si la conexión falló se reduce al código que usa la conexión. Obviamente eso no funcionará porque no es una conexión en vivo. Asegúrese de que si la conexión falla, no se alcance el código que depende de ella. (Tenga en cuenta que no estoy necesariamente defendiendo el uso de exit or die. Pueden generar una experiencia de usuario bastante mala. Pueden ser útiles, pero idealmente debería generar un mensaje mejor y dejar los errores feos para los registros [a menos que' solo está probando o es un script de línea de comando]).
En cuanto a close() (que en realidad es un alias de free()):
free() básicamente desasigna todas las cosas adjuntas al resultado. Debe comprender que hay dos (simplificación, pero sígalo) formas de recuperar filas:
Buffered - Todo se arrebata de una sola vez. En otras palabras, cuando comienza a recorrer los registros, ya están todos en la memoria. Están buffer . No se extraen del servidor cada vez que llama a fetch(), sino que se extraen de la memoria.
No almacenado en búfer:puede haber un pequeño búfer, pero esencialmente cada vez que llama a fetch(), PHP debe extraer una nueva fila de la base de datos. Al comienzo del bucle, no todos están en la memoria.
Nota interesante:se puede llamar a num_rows() en una consulta almacenada en búfer de manera muy eficiente ya que todas las filas ya están extraídas (aunque nunca debe extraer todas las filas solo para contarlas; para eso está COUNT). Las consultas no almacenadas en búfer no pueden hacer num_rows() hasta que extraen todas las filas. Lo que significa que será un error o esencialmente lo convertirá en una consulta almacenada en búfer.
De todos modos, volviendo a tu pregunta real:
free() libera cualquier cosa asociada con el objeto de resultado. En el caso de una consulta almacenada en búfer, se trata de cualquier fila que se encuentre en la memoria. En el caso de una consulta no almacenada en búfer, free() liberará las filas que puedan estar en la memoria y luego cancelará el resto de la solicitud. Básicamente es PHP diciéndole a MySQL:"Oye, ¿conoces todas esas filas que solicité? Cambié de opinión. Puedes descartar esa solicitud".
En cuanto a si deberías liberar resultados... Bueno, siempre que la variable quede fuera de alcance*, sucederá de todos modos. Sin embargo, no hay daño en hacerlo explícitamente, y en situaciones en las que una consulta puede usar mucha memoria y luego otra consulta puede usar mucha memoria, es posible que desee liberar los conjuntos solo para mantener bajo el uso de memoria. .
* O tal vez cuando finalice la solicitud. No me acuerdo de la parte superior de mi cabeza.