Foros del Web » Programando para Internet » PHP »

Problema Call to a member function bind_param() on a non-object

Estas en el tema de Problema Call to a member function bind_param() on a non-object en el foro de PHP en Foros del Web. Hola que tal ? Bueno basicamente mi problema es un problema de conexion.. pues pasa lo siguiente Tengo dos funciones uno para insertar y otro ...
  #1 (permalink)  
Antiguo 15/12/2011, 12:17
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Problema Call to a member function bind_param() on a non-object

Hola que tal ?

Bueno basicamente mi problema es un problema de conexion.. pues pasa lo siguiente

Tengo dos funciones uno para insertar y otro para mostrar las cuales al momento de iniciar la clase el metodo construct pasa el valor de conexion.



Código PHP:
require_once("Conexion.php"):

class 
clase{
    
    private 
$mysqli;
    
    public function 
__construct()
    {
        
$this->mysqli=Conectar::conexion(); // Conexion mysqli proveniente de la clase conexion.
        
        
// METODO CONSTRTUCTR

    
public function get_datos($par// obtiene datos
    
{
       
$mysqli=$this->mysqli;
       
$sql="select * from tabla where nomkey= ? ";
       
$stmt=$mysqli->prepare($sql);
       
$stmt->bind_param('s',$par);
           
//ETC
       
    
//end method  
     
    
public function insert($si,$no// inserta datos
    
{
        
        
$mysqli=$this->mysqli;
        
$sql="insert into tabla values (null,?,?,now(),now(),'jpg')";
        
$as=$mysqli->prepare($sql);
        
var_dump($as);
        
$as->bind_param("ss",$si,$no);
               
//ETC

    
}
    
}
// end class usuario

$user=new Usuario();
?> 
El problema es el siguiente ...

La primera funcion me resulta perfecta...

Y al ejecutar la segunda (Insertar) Me sale el error:
Problema Call to a member function bind_param() on a non-object
..

En la segunda funcion hice un var_dump de stmt y me vuelca NULL.

osea que $mysqli->prepare() no le esta entregando el valor a $stmt.

$mysqli=$this->mysqli;
$stmt=mysqli->prepare(); // NULL


Lo extraño es que hago lo mismo en la funcion 1 y si lo toma .

... funcion1()
{
$mysqli=$this->mysqli;
$stmt=mysqli=prepare(); // PERFECTO!}
}

funcion2()
{
$mysqli=$this->mysqli;
$stmt=mysqli=prepare(); // NULL
}
  #2 (permalink)  
Antiguo 15/12/2011, 20:04
Avatar de leo_  
Fecha de Ingreso: abril-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 11
Respuesta: Problema Call to a member function bind_param() on a non-object

Hola hice
Código PHP:
Ver original
  1. <?php
  2. function insertar($nombre, $tmp = null){
  3. $mysqli = new mysqli('host','user','password','db');
  4. $sql = "insert into usuarios values (?,?)";
  5. $stmt = $mysqli->prepare($sql);
  6.  
  7. $stmt->bind_param("ss",$tmp,$nombre);
  8. $stmt->execute();
  9.  
  10. echo $stmt->affected_rows."\n";
  11. }
  12.  
  13. insertar("Rosario Del Rio");
  14. insertar("Jorge Manso");
Y funciono sin problemas lo q se me ocurre es q quizas el usuario q estas usando para la conexion no tenga permisos para insertar en la tabla. Si no es eso fijate si podes separar el codigo para insertar en otro archivo y probar esa parte nomas me parece q a lo mejor te conviene ir a tomar un poco de aire y despues retomar en una de esas.. bueno q tengas suerte. Saludos.
  #3 (permalink)  
Antiguo 15/12/2011, 20:46
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Problema Call to a member function bind_param() on a non-object

Si campeon!... el problema no radica en eso...
el problema es el siguiente..

la clase conexion esta en otro archivo..
y esta es statica.. por lo cual no requiero de instanciarla..

en otro archivo requiero a el de la conexion.

ahora creo una clase
y creo un construct.

el construct al momento de iniciarse recibe elmetodo estatico. asi :

private $mysqli;
public function __construc()
{
$this->mysqli=Conectar::conexion();
}

Luego hago dos funciones:

funcion1()
{
mysqli=$this->mysqli; // hago referencia al atributo iniciado
}

funcion2()
{
mysqli=$this->mysqli; // hago referencia al atributo iniciado
}

es ahi el problema. :).. pero no se en que fallo, pues la primera funcion si me funciona.. y la segunda no..

pero si no ejecuto la primera... la funcion 2 realiza todo.
  #4 (permalink)  
Antiguo 15/12/2011, 21:05
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 14 años, 11 meses
Puntos: 322
Respuesta: Problema Call to a member function bind_param() on a non-object

¿Cómo está esto? Debe darte error.
Código PHP:
Ver original
  1. $stmt=mysqli=prepare();
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #5 (permalink)  
Antiguo 15/12/2011, 21:16
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Incorrecta metodologia ?

Hola que tal?
Tengo un fallo en mi codigo el cual quisiera saber en que parte es.
En este codigo...tengo dos funciones y solo me funciona la primera funcion, la segunda no!..
pero si no ejecuto la primera, la segunda se ejecuta perfectamente.
Es una o la otra, este el el problema.

En un archivo tengo solo la clase conexion :
Código PHP:
class Conectar{

public static function 
conexion()    
    {
    
        
define('_HOST','localhost');//Host MYSQL
        
define('_USER','usuario');//Usuario MYSQL    
        
define('_PASS','pass');//Password mysql
        
define('_DB','db');    //base de datos MYSQL
               
$conexion=new MySQLi(_HOST,_USER,_PASS,_DB);
        
        return 
$conexion;
    }
// end method conexion
}// fin clase conectar 
Como pueden ver, no la convierto en obj pues solo tiene un metodo statico.

En otro archivo. tengo esto .

Código PHP:
require_once('conexion.php');


class 
Usuario{
    
    private 
$mysqli;
    
    
    public function 
__construct()
    {
        
$this->mysqli=Conectar::conexion(); // Conexion mysqli proveniente de la clase conexion.
        
}

   public function 
get_datos($id)
{
       
$mysqli=$this->mysqli;
          
// ETC
//end method  

public function insert($dato)
{
    
$mysqli=$this->mysqli;
//ETC
}// end method

$usuario = new Usuario(); 
Como pueden ver, la clase usuario obtiene el valor de la conexion a travez del metodo estatico.

Si yo ejecuto los dos metodos

$usuario->get_datos(); // Se ejecuta perfecto
$usuario->insert(); // No se ejecuta.

Pero si no ejecuto el primero, Si se ejecuta el segundo..
En otras palabras los dos no pueden funcionar al mismo tiempo, es uno, o el otro.


El codigo en si esta bien, asi que solo me queda pensar en la metodologia que estoy usando para la conexion....

Me pueden dar sus sugerencias y opiniones?
Muchas gracias!
  #6 (permalink)  
Antiguo 15/12/2011, 21:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Incorrecta metodologia ?

En esencia el código es correcto, sin embargo es complicado adivinar el error sin conocer el código real que utilizas.

O sea, el problema no está en la conexión sino en la forma en que ejecutas las consultas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 15/12/2011, 21:52
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Problema Call to a member function bind_param() on a non-object

AJJAJ si ahí hay un error el cual tipie mal aca en el foro... sorry !
pero en mi codigo esta bien.

Como dije anteriormente..
Si ejecuto las dos funciones al mismo tiempo solo me ejecuta la primera.
Y si no ejecuto la primera, me ejecuta la segunda.

Estoy seguro que hay un fallo en como hago el "enlace de una clase con la otra con static."

Ya que probe haciendo una colaboracion de objetos y funciona perfectamente.
Pero aun estoy metido el motivo por el cual No me funciona asi.

Muchas gracias soul por tu tiempo!.
  #8 (permalink)  
Antiguo 15/12/2011, 21:56
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Incorrecta metodologia ?

El primer metodo obtiene datos :

Código PHP:
public function get_datos($nu)
    {
       
$mysqli=$this->mysqli;
       
$sql="select * from table where nu= ? ";
       
$stmt=$mysqli->prepare($sql);
       
$stmt->bind_param('s',$nomkey);
      
//ETC ...

El segundo metodo inserta esto:

p
Código PHP:
ublic function insert($d,$n)
    {
        
        
$mysqli=$this->mysqli;
        
$sql="insert into table values (null,?,?,now(),now(),'jpg')";
        
$stmt=$mysqli->prepare($sql);
        
$stmt->bind_param("ss",$d,$n);
          
/*etc ... en las dos funciones llego hasta aqui ya que el metodo 
numero dos en ejecutar me imprime aqui 
el error ... : Call to a member function bind_param() on a non-object */

Como dije anteriormente :

Si yo ejecuto los dos metodos

$usuario->get_datos(); // Se ejecuta perfecto
$usuario->insert(); // No se ejecuta.

Pero si no ejecuto el primero, Si se ejecuta el segundo..
En otras palabras los dos no pueden funcionar al mismo tiempo, es uno, o el otro.
  #9 (permalink)  
Antiguo 15/12/2011, 21:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Incorrecta metodologia ?

Sigues omitiendo información, no es bueno asumir que conocemos a lo que te refieres cuando haces "etc", de verdad procura mostrar el código completo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 15/12/2011, 22:02
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Incorrecta metodologia ?

... Pete.. no hay problema en escribirlo jaja pero la ejecucion del codigo no llega mas alla.
Como lo escibi arriva me arroja un error en $stmt->bind_param().
  #11 (permalink)  
Antiguo 15/12/2011, 22:17
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Incorrecta metodologia ?

Hmm... pues bueno, te toca entonces revisar la documentación.

Supongo que el método prepare() no está creando el objeto necesario para el siguiente método.

Te toca depurar la consulta y ver si obtienes algo más de información, así a secas es como si creyeras que podemos "descubrir" un posible problema con escueto detalle.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 15/12/2011, 22:47
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Incorrecta metodologia ?

Pate, para demostrate que no es el codigo, hice una colaboracion de objetos. y me funciona perfectamente..

En ves de hacer esto

Código PHP:
private $mysqli;

public function 
__construct()
{
$this->mysqli=Conectar::conexion();

hago esto:

Código PHP:
private $mysqli;

public function 
__construct()
{
$this->mysqli=new Conexion();


y en los metodos insert y get en vez de hacer esto :

$mysqli=$this->mysqli;

lo hago asi

$mysqli=$this->mysqli->conexion();

Con esto podemos sacar como conclucion que el codigo no es lo que falla, si no la manera en que pasamos la conexion.

Pero quisiera saber .. por que el primer escript falla :(


Gracias PATE por tu tiempo una vez mas !
  #13 (permalink)  
Antiguo 15/12/2011, 23:12
 
Fecha de Ingreso: diciembre-2008
Ubicación: Cordoba
Mensajes: 127
Antigüedad: 15 años, 4 meses
Puntos: 17
Respuesta: Incorrecta metodologia ?

tu estilo de programar, es desastroso.. a eso le llamas colaboracion de objetos XD
  #14 (permalink)  
Antiguo 15/12/2011, 23:17
 
Fecha de Ingreso: agosto-2011
Mensajes: 161
Antigüedad: 12 años, 8 meses
Puntos: 7
Respuesta: Incorrecta metodologia ?

Cita:
Iniciado por McPinkY18 Ver Mensaje
tu estilo de programar, es desastroso.. a eso le llamas colaboracion de objetos XD
Lo siento, no soy experimentado, alomejor mi estilo de programar si es desastrozo,
Pero, me podrias responder la pregunta planteada :) ?

Gracias por tu tiempo.




PD: Lo llamo colaboracion de objetos, pues... es una colaboraion entre objetos :)
o segun tu, que es?

Lo hice para demostrar que el codigo no es el que falla.
  #15 (permalink)  
Antiguo 16/12/2011, 09:21
Avatar de leo_  
Fecha de Ingreso: abril-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 11
Respuesta: Problema Call to a member function bind_param() on a non-object

Hola mira lo hice asi conexion.class.php
Código PHP:
<?php
class conexion{
    public static function 
conectar(){
        return new 
mysqli("host","user","pass","db");
    }
}
index.php
Código PHP:
<?php

require_once('conexion.class.php');

class 
usuario{
    private 
$mysqli;
    public function 
__construct(){
        
$this->mysqli conexion::conectar();
    }
    public function 
get_datos($par){
        
$mysqli $this->mysqli;
        
$sql "select * from usuarios where id = ?";
        
$stmt $mysqli->prepare($sql);
        
$stmt->bind_param("s",$par);
        
$stmt->execute();
        
$stmt->bind_result($id,$nombre);
        if(
$stmt->fetch()){
            
$tmp[] = array($id=>$nombre);
        };
        
$stmt->close();
        return (isset(
$tmp)) ? $tmp null;
    }
    public function 
insertar($nombre,$id null){
        
$mysqli $this->mysqli;
        
$sql "insert into usuarios values (?,?)";
        
$stmt $mysqli->prepare($sql);
        
$stmt->bind_param("ss",$id,$nombre);
        
$stmt->execute();
        
$return $stmt->insert_id;
        
$stmt->close();
        return 
$return;
    }
}

$usuario = new usuario();
$usuario->insertar("Juan Roman Riquelme");
$data $usuario->get_datos("s");
echoe($data);
$tmp $usuario->insertar("Hugo Benjamin Ibarra");
$data $usuario->get_datos($tmp);
echoe($data);

function 
echoe($data){
    echo 
"<pre>";
    
print_r($data);
    echo 
"</pre>";
}
Y tampoco me dio problemas incluso probe primero una despues la otra y viceversa y nada. ¿Dentro de esas funciones no estaras haciendo $mysqli->close()? Sino ni idea.. Saludos.

Etiquetas: call, function, incorrecta, metodologia, mysql, sql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:16.