0

Tengo el siguiente error:

Fatal error: Uncaught Error: Call to a member function prepare() on null in "La ruta"

Pero estoy usando casi el mismo código en las 2 diferentes partes que muestro debajo, ¿cómo podría solucionarlo? el error esta en:

$consult = $conn->prepare('SELECT id,descripcion,fecha FROM publicaciones');

Mas abajo uso lo mismo y no me da error:

<?php

require '../Servicios/DataBase.php';
require '../Usuario/usuario.php';
require '../Manage/Public.php';
require '../Publicaciones/publicaciones.php';

session_start();

function MostrarPublicacion(){
    $listpublicaciones = array();
    $consult = $conn->prepare('SELECT id,descripcion,fecha FROM publicaciones');
    $consult->execute(); 

    $result = $consult->fetch(PDO::FETCH_ASSOC);

    foreach($result as $item){
        array_push($listpublicaciones, $item);
    }
    return $listpublicaciones;
}

if(isset($_SESSION['usuarioid'])){
    $consult = $conn->prepare('SELECT id,nombre,apellido,correo,clave FROM usuario WHERE id=:id');
    $consult->bindParam(':id',$_SESSION['usuarioid']);
    $consult->execute(); 
    $usuario = new Usuario();
    $result = $consult->fetch(PDO::FETCH_ASSOC);
    if(count($result) > 0){
        $usuario->id = $result['id'];
        $usuario->Nombre = $result['nombre'];
        $usuario->Apellido = $result['apellido'];
    }
    $publicar = new Publica();
   // $publicar->MostrarPublicacion();
Israel-ICM
  • 3,258
  • 17
  • 15
  • 25
Verlyn Luna
  • 163
  • 6
  • Tal y como dice el error. En el momento en que uno de los valores llega NULL, fallará. Lo que debes hacer, es que solo avance a esa parte, si es que lo que llega no es NULL. – Excorpion Nov 16 '20 at 17:08
  • `Call to a member function prepare() on null ` -> Llamas a `prepare()` en un objeto que está a `null`, da igual que tengas el mismo código, el null no es un objeto de conexión – Benito-B Nov 16 '20 at 17:10
  • Dado que usas PDO, construye un condicional para evaluar y obtener el error exacto que genera el problema, de esta forma: **`if(!$consulta) { print_r($conn->errorInfo()); }`** una vez hecho eso edita tu pregunta y agrega el mensaje de error – BetaM Nov 16 '20 at 17:25
  • Aquí [puedes leer mas al respecto de **`errorInfo()`**](https://www.php.net/manual/es/pdo.errorinfo.php) – BetaM Nov 16 '20 at 17:28
  • 1
    La conexión no está disponible dentro de la función `MostrarPublicacion()`, solo agrega `global $conn;` antes de preparar la consulta. Referencia: [Ámbito de variables](https://www.php.net/manual/es/language.variables.scope.php) – Triby Nov 16 '20 at 17:42
  • Ten en cuenta que `MostrarPublicacion()` es una función, y que `$conn`, aunque sea válida, no será reconocida en dicha función **porque no se la estás pasando**, en las funciones de PHP las variables tienen un ámbito local, por tanto, para poder usar `$conn` dentro de `MostrarPublicacion()` tienes que declarar la función así: `function MostrarPublicacion($conn) {` y luego, cuando llamas la función, tienes que pasarle la conexión, por ejemplo, primero el archivo donde se conecta: `require '../Servicios/DataBase.php';`y luego, en la llamada: `MostrarPublicacion($conn);` – A. Cedano Nov 16 '20 at 17:43
  • @Triby no recomendaría el uso de `global`. Ver la pregunta [*¿Por qué es considerado una mala práctica utilizar variables globales?*](https://es.stackoverflow.com/q/29177/29967) y sus respuestas. – A. Cedano Nov 16 '20 at 17:46
  • Efectivamente, @A.Cedano, tengo claro el concepto, pero la solución ideal no sería simplemente pasar la conexión como parámetro, porque programar por procedimientos no puede considerarse dentro de las _"buenas prácticas"_. En todo caso, debería migrar a programación orientada a objetos. – Triby Nov 16 '20 at 18:03
  • @Triby, pasar la conexión es menos malo que hacer uso de global. Está claro que migrar a un modelo POO es mejor, pero eso se aleja del problema concreto planteado aquí. Aunque POO no es magia, he visto más de una vez código basado en POO que haría extender una clase `Publicacion` de PDO pensando que de ese modo el código está bien montado y es más fácil, lo cual es un grave error de concepto. – A. Cedano Nov 16 '20 at 18:24
  • @A.Cedano, así es, _pasar la conexión **es menos malo** que hacer uso de global_, pero sigue tratándose de una variable _global_, que puede ser sobrescrita en otro contexto y generar casi los mismos problemas que el uso de `global $variable;`. Creo que la parte importante es que nuestros comentarios están enfocados a que OP sepa porqué la variable no está disponible dentro de la función; conforme avance en sus conocimientos, seguramente irá aprendiendo sobre buenas prácticas y mejorando el código. – Triby Nov 16 '20 at 18:32
  • Realmente no @Triby, cuando tú pasas en parámetro tienes control siempre de lo que estás pasando y de lo que ocurre con ese parámetro dentro de la función. Tú decides si anulas o no la variable, o si la reutilizas para hacer otra cosa. Cuando usas global ese control no es tan evidente. Además, hay otros problemas que provoca global pero no es el tema aquí para profundizar en ellos. Digo esto para que no quede la idea de que pasar por parámetros es lo mismo que global, no, no es lo mismo. – A. Cedano Nov 16 '20 at 18:35
  • @A.Cedano, no es lo mismo, pero sigue siendo un origen de problemas muy similares entre ambas opciones y, a fin de cuentas, son solo opiniones. – Triby Nov 16 '20 at 18:40
  • @A.Cedano, de hecho, en tu respuesta de la pregunta enlazada hablas de "Pequeñas excepciones" y, definitivamente, esta aplica perfectamente en ese segmento. – Triby Nov 16 '20 at 18:46

0 Answers0