2

Por medio de uso de $_SESSION guardo un objeto que que se conecta a la base de datos, ello con el fin de mantener mantener conexión a la base de datos mientras el usuario se encuentre inciado sesión.

Cuando mando a llamar a la base de datos desde otro script PHP me manda mysqli_query(): Couldn't fetch mysqli.

Agradecería mucha su ayuda.

Aca el codigo:

login.php

$db = new DataBase();

$user = array(
"nombre"=>"Juan",
"id" => "123456"
);

$_SESSION["usr"] = array( 
        "nombre" => $usr["nombre"],
        "id" => $usr["id"],
        "db" => serialize($db)
    );

myArticles.php

session_start();
$db =  unserialize($_SESSION["usr"]["db"]);
$art = $db->getAllArticlesView($_SESSION["usr"]["id"]);

DabaBase.php

    class DataBase(){
...

      function getAllArticlesView($userId){
            if($this->erroDB) return false;

            //Se obtienen todos los articulos
            $consulta = "SELECT titulo, categoria, fecha, img_describe FROM articulo WHERE id = '{$userId}'; ";
            $respuesta = mysqli_query($this->conexion, $consulta);
            if($respuesta == false) return false;

            $respuesta = mysqli_fetch_all($respuesta);
            return $respuesta;
        }
   ...

    }

Cuando mando a llamar a getAllArticles() me sale Warning: mysqli_query(): Couldn't fetch mysqli cuando el método llega a la línea donde manda a llamar a la función mysqli_query()

Tal vez la lógica que uso no sea la correcta, quería evitar estar creando y cerrando conexón con la base datos por cada escript que se conecte a la base de datos. Agradecería mucho sus comentarios al respecto de ésto.

  • 1
    Posible duplicado de [Warning: mysqli::query(): Couldn't fetch mysqli](https://es.stackoverflow.com/questions/214994/warning-mysqliquery-couldnt-fetch-mysqli) – BetaM Nov 24 '19 at 16:13
  • No aportas el código completo así que no se si el error es lo que voy a decirte: considera añadir session_start() en todo fichero en el que quieras usar las variables session, incluído en el fichero login ya que ahí haces una asignación. – track3r Nov 24 '19 at 18:19
  • Creo que te equivocas en esto: *`Tal vez la lógica que uso no sea la correcta, quería evitar estar creando y cerrando conexón con la base datos por cada escript que se conecte a la base de datos.`* Es mucho más costoso y quizá más peligroso, estar cargando con una conexión a la base de datos para arriba y para abajo. Es mucho más simple conectar allí donde necesites y punto. Imagina un contexto de usuarios concurrentes donde diez mil usuarios se conecta cada uno y carga con la conexión manteniéndola activa para hacer algo con ella dentro de 5, 10 o 20 minutos o 1 hora... Saca tus conclusiones. – A. Cedano Nov 24 '19 at 18:52

1 Answers1

0

No todos los objetos pueden ser serializados. En general, los objetos internos de PHP, incluyendo el resource devuelto al abrir una conexión MySQLi no son serializables a menos que implementen la interfaz Serializable, que no es el caso.

PHP está pensado como un ciclo que recrea todo en cada request. Abrir una conexión es barato. Las conexiones abiertas a la BBDD "durmiendo" en cambio son un recurso escaso.

ffflabs
  • 21,223
  • 25
  • 48