Fatal error: Call to a member function bind_param() on a non-object

Divo1984

Erfahrenes Mitglied
Hallo,

ich habe folgende Klassen:

PHP:
class DB{
	protected $host;
	protected $database;
	protected $user;
	protected $pw;
	
	protected $db;
	
	public function user_conn(){
		$this->host="localhost";
		$this->database="...";
		$this->user="...";
		$this->pw="...";
		
		$db = new mysqli($this->host, $this->user, $this->pw, $this->database);
		
		if ($db->connect_error){
			printf(
					"Can't connect to MySQL Server. Errorcode: %s\n",
					mysqli_connect_error());
			exit;
		}
		return $db;		
	}
}

und

PHP:
class eMailManager{
	public function __construct($db){
		if(is_object($db))
			$this->db=$db;
	}
	
	public function ValidateeMail($email){
		if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
			return FALSE;
		}
		return TRUE;
	}
	
	public function eMailexist($email){
		$a=$this->db->user_conn();
		$stmt=$a->prepare("SELECT b_userid FROM b_user WHERE b_email =?");
		$stmt->bind_param("s", $email);
		$stmt->execute();
		$stmt->store_result();
		$anz=$stmt->num_rows;
		if($anz>0){
			return TRUE;
		}
		return FALSE;
	}
}

bei der Zweiten, läuft alles einwandfrei aber hier:

PHP:
once 'classes/sub_classes/class_UserManagement.php';
require_once 'classes/sub_classes/class_PasswortManager.php';
require_once 'classes/sub_classes/class_NamesManager.php';
require_once 'classes/sub_classes/class_PlacesManager.php';
require_once 'classes/sub_classes/class_eMailManager.php';
require_once 'classes/sub_classes/class_Rulez.php';
require_once 'classes/sub_classes/class_Street.php';
class Register{
	//Variablen anlegen
	public $anmeldefehler;
	public $lenghterror;
	public $symbolerror;
	public $exist;
	public $pwlenghterror;
	public $pwsymbolerror;
	public $pwnumerror;
	public $vnamespaceerror;
	public $vnamesymbolerror;
	public $vnamecharserror;
	public $nnamesymbolerror;
	public $nnamespaceerror;
	public $nnamecharserror;
	public $placeerror;
	public $emailfiltererror;
	public $emailexist;
	public $rulezaceptet;
	public $streeterror;
	public $hnrerror;
	public $anmeldung;
	
	public function __construct($db){
		if(is_object($db))
			$this->db=$db;
		//Klassen einbinden
		$this->userman=new UserManagement($this->db);
		$this->pw=new PasswortManager();
		$this->name=new NamesManager($this->db);
		$this->place=new PlacesManager();
		$this->email=new eMailManager($this->db);
		$this->rulez=new Rulez($this->db);
		$this->street= new Street();
		
		//Variablen vorbereiten
		$this->anmeldefehler=FALSE;
		$this->lenghterror="";
		$this->symbolerror="";
		$this->exist="";
		$this->pwlenghterror="";
		$this->pwsymbolerror="";
		$this->pwnumerror="";
		$this->vnamespaceerror="";
		$this->vnamesymbolerror="";
		$this->vnamecharserror="";
		$this->nnamesymbolerror="";
		$this->nnamespaceerror="";
		$this->nnamecharserror="";
		$this->placeerror="";
		$this->emailfiltererror="";
		$this->emailexist="";
		$this->rulezaceptet="";
		$this->streeterror="";
		$this->hnrerror="";
		$this->anmeldung=FALSE;
		
	}
	
	public function CheckAnmeldung($user, $pw, $vname, $nname, $place, $street, $hnr, $email, $rulez){
		//Usernamen überprüfen
		if($this->userman->PrufLenght($user)!==TRUE){
			$this->lenghterror="Bitte wählen Sie einen Namen mit 8 - 16 Zeichen!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->userman->CheckSymbols($user)!==TRUE){
			$this->symbolerror="Mehr als 2 Sonderzeichen, sind im Usernamen nicht gestattet!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->userman->UserExist($user)!==FALSE){
			$this->exist="Dieser Username ist bereits vergeben!";
			$this->anmeldefehler=TRUE;
		}
		//Passwort überprüfen
		if($this->pw->PrufLenght($pw)!==TRUE){
			$this->pwlenghterror="Bitte wählen Sie ein Passwort mit 8-20 Zeichen!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->pw->CheckPWSymbols($pw)!==TRUE){
			$this->pwsymbolerror="Es sind keine Sonderzeichen im Passwort gestattet!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->pw->CheckNum($pw)!==TRUE){
			$this->pwnumerror="Zur Sicherheit sollten Sie ein Passwort mit mindestens 2 Zahlen wählen!";
			$this->anmeldefehler=TRUE;
		}
		//Vornamen überprüfen
		if($this->name->CheckSymbols($vname)!==TRUE){
			$this->vnamesymbolerror="Mehr als 2 Sonderzeichen, sind im Vornamen nicht gestattet!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->name->CheckWhitespaces($vname)!==TRUE){
			$this->vnamespaceerror="Bitte geben Sie Ihren Vornamen ein!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->name->CheckChars($vname)!==TRUE){
			$this->vnamecharserror="Mehr als 20 Zeichen, sind im Vornamen nicht gestattet!";
			$this->anmeldefehler=TRUE;
		}
		//Nachnamen prüfen
		if($this->name->CheckSymbols($nname)!==TRUE){
			$this->nnamesymbolerror="Mehr als 2 Sonderzeichen, sind im Nachnamen nicht gestattet!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->name->CheckWhitespaces($nname)!==TRUE){
			$this->nnamespaceerror="Bitte geben Sie Ihren Nachnamen ein!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->name->CheckChars($nname)!==TRUE){
			$this->nnamecharserror="Mehr als 20 Zeichen, sind im Nachnamen nicht gestattet!";
			$this->anmeldefehler=TRUE;
		}
		if($this->place->CheckSymbols($place)!==TRUE){
			$this->placeerror="Mehr als 2 Sonderzeichen, sind im Wohnort nicht gestattet!";
			$this->anmeldefehler=TRUE;
		}
		if($this->email->ValidateeMail($email)!==TRUE){
			$this->emailfiltererror="Bitte geben Sie eine korrekte eMail Adresse ein!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->email->eMailexist($email)!==FALSE){
			$this->emailexist="Diese eMailadresse ist bereits vergeben!";
			$this->anmeldefehler=TRUE;
		}
		if($this->street->CheckWhitespaces($street)!==TRUE){
			$this->streeterror="Bitte geben Sie Ihre Strasse ein!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->street->CheckEingabe($street)!==TRUE){
			$this->streeterror="Mehr als 3 Sonderzeichen, ist in der Strasse nicht gestattet!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->street->CheckWhitespaces($hnr)!==TRUE){
			$this->streeterror="Bitte geben Sie Ihre Hausnummer ein!";
			$this->anmeldefehler=TRUE;
		}
		elseif($this->street->CheckEingabe($hnr)!==TRUE){
			$this->streeterror="Mehr als 1 Sonderzeichen, ist in der Hausnummer nicht gestattet!";
		}
		if($this->rulez->TestIfAcepted($rulez)!==TRUE){
			$this->rulezaceptet="Bitte <b>lesen</b> und akzeptieren Sie unsere Regeln!";
			$this->anmeldefehler=TRUE;
		}
		return $this->anmeldefehler;
		return $this->lenghterror;
		return $this->symbolerror;
		return $this->exist;	
		return $this->pwlenghterror;
		return $this->pwsymbolerror;
		return $this->pwnumerror;
		return $this->vnamesymbolerror;
		return $this->vnamespaceerror;
		return $this->vnamecharserror;
		return $this->emailfiltererror;
		return $this->rulezaceptet;	
	}
	
	public function GenCode($email){
		$this->code=md5($email . time());
		return $this->code;
	}
	
	public function RegisterUser($user, $pw, $vname, $nname, $g_tag, $g_mon, $g_jahr, $zip, $city, $street, $hnr, $email){
		//Passwort verschlüsseln
		$this->pw=md5($pw);
		//Identifikationscode generieren
		$this->code=$this->GenCode($email);
		//Addresse zusammensetzen
		$this->addres=$street." ".$hnr;
		//In die DB eintragen
		$a=$this->db->user_conn();

		$stmt=$a->prepare("INSERT INTO b_user (b_user_status, b_uname, b_password, b_email, b_code, b_vname, b_nname, b_zip, b_city, b_address, b_last_ip, b_last_action)
									  VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
		
		$stmt->bind_param("issssssissss", 1, $user, $this->pw, $email, $this->code, $vname, $nname, $zip, $city, $this->address, $_SERVER['REMOTE_ADDR'], "Registrierung");
		$stmt->execute();
		if(($stmt->affected_rows)!=0){
			$this->anmeldung=TRUE;
		}
	}		
}

bekomme ich bei der Funktion RegisterUser() immer die folgende Ausgabe:

Fatal error: Call to a member function bind_param() on a non-object

nun frage ich mich warum? Könnt ihr mir da helfen?
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

bekommst du mit diesem Code den gleichen Fehler?
PHP:
$stmt = $a->prepare("SELECT b_userid FROM b_user WHERE b_email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->close();

Kann es sein dass die Verbindungsdaten falsch sind oder (halte ich für wahrscheinlicher) das mysqli-Object nicht richtig ankommt. Probier vielleicht mal direckt in der eMailexist-Funktion:
PHP:
$a = new mysqli("localhost", "...", "...", "...");

Gruß javaDeveloper2011
 
Zuletzt bearbeitet von einem Moderator:
Was ist, wenn $db kein Object ist? Dann hagelt es nur noch Errors, weil jede Query fehl schlägt. Ferner gehören die Methoden und Params in der DB-Klasse als statisch deklariert.

Das:

PHP:
$a=$this->db->user_conn();

ist auch irgendwie Unsinnig, weil im Construct schon $this->db = $db zugewiesen wurde
 
Zurück