4

Me muestra este error:

"Warning: mysqli::query(): Couldn't fetch mysqli in C:\xampp\htdocs\prac_01\html\php\tabla.php on line 28

Fatal error: Uncaught Error: Call to a member function fetch_assoc() on null in C:\xampp\htdocs\prac_01\html\php\tabla.php:29 Stack trace: 0 {main} thrown in C:\xampp\htdocs\prac_01\html\php\tabla.php on line 29"

Este es mi código:

    $query="SELECT * FROM table_3";
    $resultado= $conexion->query($query);
    while($row= $resultado->fetch_assoc()){

Gracias de antemano.

Edito (código conexión):

<?php
    $usuario = "root";
    $password = "";
    $servidor = "localhost";
    $basededatos = "test_02";
    $mysqli = new mysqli("localhost", "root", "", "test_02");
    $conexion = mysqli_connect( $servidor, $usuario, "" ) or die ("Error: No se ha podido conectar al servidor.");
    $db = mysqli_select_db( $conexion, $basededatos ) or die ( "Error: No se ha podido conectar a la base de datos." );
    mysqli_close( $conexion );
?>
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
Breath
  • 43
  • 4
  • 1
    Hola @Breath, puedes poner tu código donde tengas la conexión? – DevMind Nov 19 '18 at 12:28
  • 1
    Ya lo añadí al cuerpo del hilo. Perdón, tuve problemas para añadir el código completo. – Breath Nov 19 '18 at 12:31
  • 1
    Esta línea sobra: `$db = mysqli_select_db( $conexion, $basededatos ) or die ( "Error: No se ha podido conectar a la base de datos." );` (ya seleccionaste la base de datos en el comando `new`) ... y además, estás cerrando la conexión nada más abrirla: `mysqli_close( $conexion );`, por lo que en cualquier código la conexión será nula. Tienes que cerrarla del otro lado, una vez hayas hecho la consulta y obtenido los datos. – A. Cedano Nov 19 '18 at 12:32
  • 1
    Cierto eso que dice @A.Cedano – DevMind Nov 19 '18 at 12:33
  • 1
    @A.Cedano Gracias por tu respuesta. Entonces, ¿debería eliminar esa línea y colocar el cierre de conexión más adelante? – Breath Nov 19 '18 at 12:35
  • 1
    Sí, debes cerrarla en el código que usa la conexión, después de haber obtenido los datos. Tienes más fallos. Por ejemplo, aquí: `$mysqli = new mysqli("localhost", "root", "", "test_02");` ya deberías tener un objeto de conexión. Usa solamente eso: `$mysqli` y olvídate de todo lo demás, lo puedes borrar. Luego en tu código usas la variable `$mysqli` o la cambias por `$conexion`. En realidad estás conectando dos veces como bien apunta @foursixnine – A. Cedano Nov 19 '18 at 12:36
  • 1
    Muchas gracias, @A.Cedano . Estoy de prácticas y no tengo ninguna base de PHP ni de ningún lenguaje. Estoy intentando aprender buscando en internet y debo tener mil fallos. Muchas gracias por vuestra paciencia. – Breath Nov 19 '18 at 12:42
  • 1
    Bienvenido. Aquí aprenderás mucho y cuando te bases en código antiguo o inseguro (que abunda mucho por ahí en tutoriales) aquí habrá alguien que te dirá: *Oye, ese código está obsoleto, o es inseguro, mejor implementa esta solución*. De modo que estás en uno de los mejores sitios para aprender. Saludos. – A. Cedano Nov 19 '18 at 12:55
  • 4
    Posible duplicado de [¿Por qué recibo el error "Couldn't fetch mysqli"?](https://es.stackoverflow.com/questions/14130/por-qu%c3%a9-recibo-el-error-couldnt-fetch-mysqli) – foursixnine Nov 19 '18 at 16:02

2 Answers2

7

Realmente estás creando dos conexiones.

Una aquí:

$mysqli = new mysqli("localhost", "root", "", "test_02");

Y otra aquí:

$conexion = mysqli_connect( $servidor, $usuario, "" ) or die ("Error: No se ha podido conectar al servidor.");
$db = mysqli_select_db( $conexion, $basededatos ) or die ( "Error: No se ha podido conectar a la base de datos." );

Luego, estás cerrando una de las conexiones que creas y que es precisamente la que usas del otro lado:

mysqli_close( $conexion );

Recomendaría que

Uses una sola conexión, dando preferencia al estilo orientado a objetos1. Y que uses las variables, si las has declarado es para usarlas:

<?php
$usuario = "root";
$password = "";
$servidor = "localhost";
$basededatos = "test_02";
$mysqli = new mysqli($servidor, $usuario, $password, $basededatos);
/*Esto es importante para evitar problemas con acentos*/
$mysqli->set_charset("utf8");
?>

Ya que hemos dejado el nombre de la conexión como $mysqli, entonces en el código usarás ese nombre.

$query="SELECT * FROM table_3";
$resultado= $mysqli->query($query);  //aquí usamos ahora $mysqli
while($row= $resultado->fetch_assoc()){
    //manejar resultados
}
/*Es aquí donde hay que cerrar la conexión*/
$mysqli->close();

Notas:

1 En muchos aspectos PHP admite dos estilos de programación: procedural y orientado a objetos, tal es el caso de mysqli. No se recomienda mezclar estilos. Aunque el código funciona, se hace difícil de mantener y de comprender. El estilo orientado a objetos es más moderno, más intuitivo y más elegante que el estilo procedural, requiere menos código (muchas funciones del estilo procedural son horriblemente extensas). Aunque eres libre de elegir uno u otro estilo, recomendaría siempre usar el estilo orientado a objetos. Para más detalles sobre esto puedes consultar esta respuesta.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
2

Es posible que estes cerrando la conexion antes de ejecutar el query. Preferiblemente asegurate de añadirlo al final de tu codigo.

Tambien parece (segun lo que leo) que tienes codigo procedural y codigo orientado a objetos mezclado. Revisa los ejemplos en el manual de PHP: http://php.net/manual/es/mysqli.query.php que quizas te den un poco mas de luz en lo que estas intentando hacer.