UTNianos

Versión completa: Fatal error: Call to a member function prepare() on a non-object in
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Soy nuevo en POO y PDO , estoy haciendo un sistema sencillo bibliotecario y ando algo desesperado. Tengo este error:

Fatal error: Call to a member function prepare() on a non-object in /var/www/op/DatosLibros.php on line 35

DatosLibros.php


<?php
class DatosLibros
{
private $cadenaConexion;
private $user;
private $password;
private $objetoConexion;

public function __construct($cadenaConexion,$user,$password)
{
$this->cadenaConexion=$cadenaConexion;
$this->user=$user;
$this->password=$password;
}
public function conectar ()
{
try
{
$this->objetoConexion= new PDO ($this->cadenaConexion,$this->user,$this->password);
$this->objetoConexion->setAttribute(PDO::ATTR_EARMODE,PDO::EARMODE_EXCEPTION);
}
catch (PDOException $ex)
{
echo "Se ha presentado un problema a la hora de conectar con la base de datos";
}
}
public function desconectar ()
{
$this->objetoConexion=null;
}
public function ejecutar ($strComando)
{
try
{
$ejecutar = $this->objetoConexion->prepare($strComando);
$ejecutar->execute();
$rows= $ejecutar->fetchAll();
}
catch (PDOException $ex)
{
throw $ex;
}
}
}
?>



Esta es la linea del error


$ejecutar = $this->objetoConexion->prepare($strComando);


Este archivo hereda de DatosLibros.php y se llama NegociosLibros.php


<?php
include_once ("DatosLibros.php");

class capaNegocios
{
public $codigo_libro;
public $nombre_libro;
public $descripcion_libro;
public $autor_libro;
public $categoria_libro;
public $editorial_libro;
public $cantidad_libro;
public $objetoDatos;

public function __construct($codigo_libro,$nombre_libro,$descripcion_libro,$autor_libro,$categoria_libro,$editorial_libro,$cantidad_libro)
{
$this->codigo_libro=$codigo_libro;
$this->nombre_libro=$nombre_libro;
$this->descripcion_libro=$descripcion_libro;
$this->autor_libro=$autor_libro;
$this->categoria_libro=$categoria_libro;
$this->editorial_libro=$editorial_libro;
$this->cantidad_libro=$cantidad_libro;
$this->objetoDatos=new DatosLibros ('mysql:host=localhost;dbname=b','root','');
}

public function insertar()
{
try
{
$this->objetoDatos->conectar();
$this->objetoDatos->ejecutar("insert into libros(codigo_libro,nombre_libro,descripcion_libro,categoria_libro,editorial_libro,cantidad_libro) values('$this->codigo_libro','$this->nombre_libro','$this->descripcion_libro','$this->autor_libro','$this->categoria_libro','$this->editorial_libro','$this->cantidad_libro')");
$this->objetoDatos->desconectar();
}
catch (PDOException $ex)
{
throw $ex;
}
}
public function eliminar()

{
$this->objetoDatos->conectar();
$this->objetoDatos->ejecutar("delete from libros where codigo_libro=$this->codigo_libro");
$this->objetoDatos->desconectar();
}

public function modificar()
{
$this->objetoDatos->conectar();
$this->objetoDatos->ejecutar("update libros set cantidad_libro='$this->cantidad_libro' where codigo_libro=$this->codigo_libro)");
$this->objetoDatos->desconectar();
}

public function mostrar()
{
$this->objetoDatos->conectar();
$fila->$this->objetoDatos->ejecutar("select * from libros where codigo=$this->codigo");
foreach($fila as $filaActual){
echo "Codigo del Libro: ",$filaActual [codigo_libro],"<br/>Nombre del Libro:",$filaActual [nombre_libro],"<br/>Descripcion:",$filaActual [descripcion_libro],"<br/>Autor:",$filaActual [autor_libro],"<br/>Categoria:",$filaActual [categoria_libro],"<br/>Editorial:",$filaActual [editorial_libro],"<br/>Cantidad de libros:",$filaActual [cantidad_libro];
echo "</br>";
}
$this->objetoDatos->desconectar();
}

}
?>

Proba haciendole var_dump o print_r a esta linea.


new PDO ($this->cadenaConexion,$this->user,$this->password)


El error que te tira es que estas llamando un metodo en algo que no es un objeto, por ejemplo, algo que es NULL porque no existe.
Eso indicaría que quizas, estas creando la conexión mal y con los parametros que le pasas a PDO te termina tirando un error.

Fijate que te llega en los parametros que le pasas al constructor. ¿Algo fuera de lo común?
Lo puse así:


var_dump( new PDO ($this->cadenaConexion,$this->user,$this->password));


Y me da el mismo error.
Da la impresión que $this->objetoConexion está en null cuando lo querés usar. Veo que siempre llamás al conectar() antes de usarlo, con lo que no debería ser eso. Asegurate que cuando intentás conectarte $this->objetoConexion quede instanciado, si no que explote así te das cuentas si el error es ese. Algo así:



<?php
public function conectar ()
{
try
{
$this->objetoConexion= new PDO ($this->cadenaConexion,$this->user,$this->password);
$this->objetoConexion->setAttribute(PDO::ATTR_EARMODE,PDO::EARMODE_EXCEPTION);
}
catch (PDOException $ex)
{
die("PDOException: " . $ex->getMessage());
}
catch (Exception $ex)
{
die("Exception: " . $ex->getMessage());
}
}
?>


(30-10-2013 10:15)Atahualpa escribió: [ -> ]Lo puse así:


var_dump( new PDO ($this->cadenaConexion,$this->user,$this->password));


Y me da el mismo error.

La idea es que postees el output que te da hacer:


var_dump($this->cadenaConexion);
var_dump($this->user)
var_dump($this->password);
var_dump( new PDO ($this->cadenaConexion,$this->user,$this->password));
die();


var_dump no hace otra cosa que dumpear la variable, es decir, te la muestra por pantalla en la pagina.
Y die() te mata la ejecucion del script. Es para que puedas ver lo que retornan esas variables, porque suena que te estan llegando en NULL y estas llamando a un metodo en algo que es null.
(30-10-2013 11:22)rulo escribió: [ -> ]
(30-10-2013 10:15)Atahualpa escribió: [ -> ]Lo puse así:


var_dump( new PDO ($this->cadenaConexion,$this->user,$this->password));


Y me da el mismo error.

La idea es que postees el output que te da hacer:


var_dump($this->cadenaConexion);
var_dump($this->user)
var_dump($this->password);
var_dump( new PDO ($this->cadenaConexion,$this->user,$this->password));
die();


var_dump no hace otra cosa que dumpear la variable, es decir, te la muestra por pantalla en la pagina.
Y die() te mata la ejecucion del script. Es para que puedas ver lo que retornan esas variables, porque suena que te estan llegando en NULL y estas llamando a un metodo en algo que es null.

Me sale lo siguiente:


string(29) "mysql:host=localhost;dbname=b" string(4) "root" string(0) "" Se ha presentado un problema a la hora de conectar con la base de datos
Fatal error: Call to a member function prepare() on a non-object in /var/www/op/DatosLibros.php on line 43


(30-10-2013 10:50)Nimix escribió: [ -> ]Da la impresión que $this->objetoConexion está en null cuando lo querés usar. Veo que siempre llamás al conectar() antes de usarlo, con lo que no debería ser eso. Asegurate que cuando intentás conectarte $this->objetoConexion quede instanciado, si no que explote así te das cuentas si el error es ese. Algo así:



<?php
public function conectar ()
{
try
{
$this->objetoConexion= new PDO ($this->cadenaConexion,$this->user,$this->password);
$this->objetoConexion->setAttribute(PDO::ATTR_EARMODE,PDO::EARMODE_EXCEPTION);
}
catch (PDOException $ex)
{
die("PDOException: " . $ex->getMessage());
}
catch (Exception $ex)
{
die("Exception: " . $ex->getMessage());
}
}
?>



Me aparece esto:

PDOException: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)
o tenes mas el user, el password, o si es correcto, no tenes permisos
(30-10-2013 17:50)Atahualpa escribió: [ -> ]Me aparece esto:

PDOException: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)

Es esto entonces. Estás intentando autenticarte en el MySQL sin usar password. Buscate en la doc. de PDO para ver cómo cambiar este setting en el componente, ahora me estoy yendo pero viene por acá la mano seguro.
Eso o simplemente no le estás pasando ninguna password al PDO =)
(30-10-2013 18:06)Nimix escribió: [ -> ]
(30-10-2013 17:50)Atahualpa escribió: [ -> ]Me aparece esto:

PDOException: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: NO)

Es esto entonces. Estás intentando autenticarte en el MySQL sin usar password. Buscate en la doc. de PDO para ver cómo cambiar este setting en el componente, ahora me estoy yendo pero viene por acá la mano seguro.
Eso o simplemente no le estás pasando ninguna password al PDO =)

Corregido. Ahora me sale esto:

Fatal error: Undefined class constant 'ATTR_EARMODE' in /var/www/op/DatosLibros.php on line 24
no existe esa constante de PDO


con todo el amor del mundo:

podrias intentar resolverlo vos y cuando no te salga, recien ahi preguntar, diciendo que hiciste para intentar corregirlo y porque no anda


googleando nada mas las constantes de pdo (al hacer pdo::X usas la constante x)

esta el listado de constantes

http://php.net/manual/en/pdo.constants.php


la que queres usar (infiero) se llama ATTR_ERRMODE, la escribiste mal
(30-10-2013 18:16)gonnza escribió: [ -> ]no existe esa constante de PDO


con todo el amor del mundo:

podrias intentar resolverlo vos y cuando no te salga, recien ahi preguntar, diciendo que hiciste para intentar corregirlo y porque no anda


googleando nada mas las constantes de pdo (al hacer pdo::X usas la constante x)

esta el listado de constantes

http://php.net/manual/en/pdo.constants.php


la que queres usar (infiero) se llama ATTR_ERRMODE, la escribiste mal

Muchas gracias. Si ya me habia dado cuenta. Solo que pongo los mensajes de error en este tema para ganar tiempo mientras busco por google.

Me salió este:

SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1
$this->objetoDatos->ejecutar("insert into libros(codigo_libro,nombre_libro,descripcion_libro,categoria_libro,editorial_libro,cantidad_libro) values('$this->codigo_libro','$this->nombre_libro','$this->descripcion_libro','$this->autor_libro','$this->categoria_libro','$this->editorial_libro','$this->cantidad_libro')");


Tenes 6 columnas y 7 valores

Aunque sea les los mensajes de error?

A nadie le gusta laburar por otro gratis...
Gracias. Casualmente estaba viendo esto pensando que era el problema pero tienes razón.
http://htmlfixit.com/cgi-tutes/tutorial_..._Count.php

Que inutil me siento. Parece que me tengo que graduar de pelotudo.

Muchas gracias a todos por tomarse la molestia de ayudarme.

Un abrazo.
A todos nos cuesta empezar
Disculpe que los moleste de nuevo.

Tenia este problema: Invalid argument supplied for foreach()

Asi que vi los foreach reciben solo arrays y le puse un if(is_array($fila)){ ....

El problema que tengo es que no se como hacer para que $fila sea un array. Ya que debería mostrarme la informacion que pongo ahí.


public function mostrar()
{
$this->objetoDatos->conectar();
$fila=$this->objetoDatos->ejecutar("select * from libros where codigo_libro=$this->codigo_libro");
if(is_array($fila)){
foreach($fila as $filaActual){
echo "Codigo del Libro: ",$filaActual [codigo_libro],"<br/>Nombre del Libro:",$filaActual [nombre_libro],"<br/>Descripcion:",$filaActual [descripcion_libro],"<br/>Autor:",$filaActual [autor_libro],"<br/>Categoria:",$filaActual [categoria_libro],"<br/>Editorial:",$filaActual [editorial_libro],"<br/>Cantidad de libros:",$filaActual [cantidad_libro];
echo "</br>";
}
}
$this->objetoDatos->desconectar();
}

}

Páginas: 1 2
URLs de referencia