Fatal error prepare() non-object. Weet niet water fout is

Status
Niet open voor verdere reacties.

killer4all2

Gebruiker
Lid geworden
26 mei 2009
Berichten
449
Goeden dag,

Momenteel ben ik bezig met het leren van oop programmeren en dit gaat mij goed af tot nu toe. Ik heb alleen 1 ding wat ik snap.

Waarom werkt het eerste script wel en het tweede script niet? De eerst is bedoeld om te controleren of de combinatie tussen het ingevulde passwoord en username in de database bestaat en returned dan true or false.

De tweede doet dit ook alleen dan controleert hij voor email en antwoord. Het zijn beide varchars in de database. Bij validate login zou er bijvoorbeeld een waarde meekomen als. $user = "username" en bij $pass = "password". Bij validate recover zou dan meekomen $email = "mijnemail@email.com", $question = "vraag", $answer="antwoord";

(momenteel word er nog niks gedaan met $question omdat ik eerst graag wou weten waarom dit niet werkt voordat ik verder ga met het bouwen van meerdere functionaliteiten)

Ik heb al aardig wat op internet gezocht, maar het word mij niet echt duidelijk waarom dit niet werkt. Van de error die weergeven word, word ik ook niet veel wijzer. Ik hoop dat jullie mij kunnen helpen.

Alvast bedankt!,
Gr Rowan

Error:
Code:
Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\icms\models\m_auth.php on line 83
Call Stack
#	Time	Memory	Function	Location
1	0.0007	689752	{main}( )	..\recover.php:0
2	0.0039	743120	Auth->validateRecover( )	..\recover.php:27

PHP:
$Database = new mysqli($server, $user, $pass, $db);

[1]
PHP:
function validateLogin($user, $pass)
	{
		//acces database
		global $Database;
		
		// create query
		if($stmt = $Database->prepare("SELECT * FROM users WHERE username = ? AND password = ?"))
		{
			$stmt->bind_param("ss", $user, md5($pass . $this->salt));
			$stmt->execute();
			$stmt->store_result();
			
			// check for num_rows
			if($stmt->num_rows() > 0)
			{
				// succes
				$stmt->close();
				return TRUE;
			}
			else
			{
				$stmt->close();
				return FALSE;
			}
		}
		else
		{
			die("ERROR: Could not prepare MySqli statement");
		}
	}

[2]
PHP:
function validateRecover($email, $question, $answer)
    {
        //acces database
        global $Database;
        
        //create query
        if($stmt = $Database->prepare("SELECT * FROM users WHERE email = ? AND answer = ?"))
        {
            $stmt->bind_param("ss", $email, $answer);
            $stmt->execute();
            $stmt->store_result();
            
            //check for num_rows if there are any results
            if($stmt->num_rows() > 0)
            {
                $stmt->close();
                return TRUE;
            }
            else
            {
                $stmt->close();
                return FALSE;
            }
        }
        else
        {
            die("ERROR: Could not prepare MySqli statement");
        }
    }

Gehele class
PHP:
<?php
 
/*
    Authorization Class
    Deal with auth tasks
*/
 
class Auth
{
    private $salt = 'j4H9?s0d';
    
    /*
        Constructor
    */
    
    function __construct()
    {
    }
    
    /*
        Login functions
    */
    
    function validateLogin($user, $pass)
    {
        //acces database
        global $Database;
        
        // create query
        if($stmt = $Database->prepare("SELECT * FROM users WHERE username = ? AND password = ?"))
        {
            $stmt->bind_param("ss", $user, md5($pass . $this->salt));
            $stmt->execute();
            $stmt->store_result();
            
            // check for num_rows
            if($stmt->num_rows() > 0)
            {
                // succes
                $stmt->close();
                return TRUE;
            }
            else
            {
                $stmt->close();
                return FALSE;
            }
        }
        else
        {
            die("ERROR: Could not prepare MySqli statement");
        }
    }
    
    function checkLoginStatus()
    {
        if(isset($_SESSION['loggedin']))
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    
    function logout()
    {
        session_destroy();
        session_start();
    }
    
    /*
        Account functions
    */
    
    function validateRecover($email, $question, $answer)
    {
        //acces database
        global $Database;
        
        //create query
        if($stmt = $Database->prepare("SELECT * FROM users WHERE email = ? AND answer = ?"))
        {
            $stmt->bind_param("ss", $email, $answer);
            $stmt->execute();
            $stmt->store_result();
            
            //check for num_rows if there are any results
            if($stmt->num_rows() > 0)
            {
                $stmt->close();
                return TRUE;
            }
            else
            {
                $stmt->close();
                return FALSE;
            }
        }
        else
        {
            die("ERROR: Could not prepare MySqli statement");
        }
    }
}
 
?>
 
Laatst bewerkt:
Op welke regel komt php de error tegen?
en zet ff je hele class online!
 
Op verzoek de hele class

Error:
Code:
Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\icms\models\m_auth.php on line 83
Call Stack
#	Time	Memory	Function	Location
1	0.0007	689752	{main}( )	..\recover.php:0
2	0.0039	743120	Auth->validateRecover( )	..\recover.php:27

Class
PHP:
<?php

/*
	Authorization Class
	Deal with auth tasks
*/

class Auth
{
	private $salt = 'j4H9?s0d';
	
	/*
		Constructor
	*/
	
	function __construct()
	{
	}
	
	/*
		Login functions
	*/
	
	function validateLogin($user, $pass)
	{
		//acces database
		global $Database;
		
		// create query
		if($stmt = $Database->prepare("SELECT * FROM users WHERE username = ? AND password = ?"))
		{
			$stmt->bind_param("ss", $user, md5($pass . $this->salt));
			$stmt->execute();
			$stmt->store_result();
			
			// check for num_rows
			if($stmt->num_rows() > 0)
			{
				// succes
				$stmt->close();
				return TRUE;
			}
			else
			{
				$stmt->close();
				return FALSE;
			}
		}
		else
		{
			die("ERROR: Could not prepare MySqli statement");
		}
	}
	
	function checkLoginStatus()
	{
		if(isset($_SESSION['loggedin']))
		{
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
	
	function logout()
	{
		session_destroy();
		session_start();
	}
    
    /*
        Account functions
    */
    
    function validateRecover($email, $question, $answer)
    {
        //acces database
        global $Database;
        
        //create query
        if($stmt = $Database->prepare("SELECT * FROM users WHERE email = ? AND answer = ?"))
        {
            $stmt->bind_param("ss", $email, $answer);
            $stmt->execute();
            $stmt->store_result();
            
            //check for num_rows if there are any results
            if($stmt->num_rows() > 0)
            {
                $stmt->close();
                return TRUE;
            }
            else
            {
                $stmt->close();
                return FALSE;
            }
        }
        else
        {
            die("ERROR: Could not prepare MySqli statement");
        }
    }
}

?>
 
ten eerst,
waarom maak je de database connection niet in je construct?

private $_db = NULL;

function __construct()
{
$this->_db = global $database;
}

is meer OOP style.

ergens in je database class gaat er iets mis met je samen voegen van je variables
iets in bind_paras zit iets niet goed.

wat als je
if($stmt = $Database->prepare("SELECT * FROM users WHERE email = :email AND answer = :answer")) {
$stmt->bindParam(':email', $email);
$stmt->bindParam(':answer', $answer);

in plaats van
if($stmt = $Database->prepare("SELECT * FROM users WHERE email = ? AND answer = ?"))
{
$stmt->bind_param("ss", $email, $answer);
 
Bedankt voor je reacties!

Ik ga het meteen even proberen :)

$this->_db = global $database; <- dit kan trouwens niet :P Dan krijg je unexpected T_global

EDIT:
Dit is wat ik door krijg. Precies dezelfde error. Ik heb nog even laten echo'en welke argumenten hij mee krijgt:


Code:
email =antwoord
answer =email
( ! ) Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\icms\models\m_auth.php on line 85
Call Stack
#	Time	Memory	Function	Location
1	0.0004	689752	{main}( )	..\recover.php:0
2	0.0014	744848	Auth->validateRecover( )	..\recover.php:27

PHP:
  //create query
       if($stmt = $Database->prepare("SELECT * FROM users WHERE email = :email AND answer = :answer")) {
        
            $stmt->bindParam(':email', $email);
            $stmt->bindParam(':answer', $answer); 
            $stmt->execute();
            $stmt->store_result();
 
Laatst bewerkt:
Je moet er voor zorgen dat je $Database als eerste in je script is aangemaakt, ik heb zo'n vermoeden dat dit niet het geval is.

Daarnaast, waarom geen Singleton object van je database maken? Dan hoef je niet de "vieze" global te gebruiken :)
 
Bedankt voor je reactie! :)

Het punt is dat validation login wel werkt en validaterecover niet terwijl ze zo goed als het zelfde zijn. Vandaar dat ik de error niet snap. Ik heb al van alles geprobeerd te veranderen qua notatie, Maar dit heeft niet mogen baten. De global is misschie niet netjes op het moment, maar veroorzaakt niet deze error :)
 
Bedankt voor je reactie! :)

Het punt is dat validation login wel werkt en validaterecover niet terwijl ze zo goed als het zelfde zijn. Vandaar dat ik de error niet snap. Ik heb al van alles geprobeerd te veranderen qua notatie, Maar dit heeft niet mogen baten. De global is misschie niet netjes op het moment, maar veroorzaakt niet deze error :)

Nou dat denk ik wel, omdat de error is "Call to a member function prepare() on a non-object", wat betekent dat $Database geen object is (ik vermoed zelfs dat 'ie null is).
 
Ik kan op dit moment niks testen aangezien mijn pc er mee gestopt is en ik wacht op mijn nieuwe pc (die ik hoop vandaag binnen te krijgen). Gelukkig heb ik nog backups van het systeem. Ik denk persoonlijk niet dat hij null is omdat hij wel werkt bij functie 1, alleen niet bij functie 2. Daarom snap ik niet helemaal wat er fout gaat. Zodra ik mijn nieuwe computer binnen heb zou ik even nagaan of hij null is ja of de nee.

Bedankt voor je reactie! :)
 
Je kan trouwens snel kijken wat er in $Database zit, door net voor de betreffende foute regel een "var_dump($Database);" neer te zetten. Wellicht biedt dat licht in de duisternis ;)
 
#opgelost

Bedankt he! Heel handig zo'n var dump ^^ Hij bleek inderdaad leeg te zijn en diep ergens in een ander script niet gefineerd te zijn zoals je zij. Het geen dat ik gepost had klopte overigens, de definitie van $Database bleek gewoon niet opgegeven te zijn op deze pagina.

Ik ga nu maar is de oop notatie gebruiken voor de database. Ik weet nu in ieder geval wat er fout was! :) Zo leer je altijd wat! :D

Bedankt!

#opgelost
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan