Jump to content

[SOLVED] Trying to get property of non-object error


spedax

Recommended Posts

  $sql = "SELECT * FROM users WHERE username LIKE '". $username . "' LIMIT 1";
  $result_array = user::find_by_sql($sql);
  $user = array_shift($result_array);
  print_r($user);
  
  if ($user->username !== $username && $password == $password2 )  {

 

when I print out $user I get this:

 

User Object ( [id] => 5 [username] => test [password] => test [level] => 1 [email] => test@test.com )

 

I get an error on line 17 ( last line of code)

 

error:

notice: Trying to get property of non-object in C:\wamp\www\cms\pages\register.php on line 17

 

anyone got any idea what this could be?

 

It says its not an object while it is one...

 

any help is appriciated!

 

addional code:

 

user class

 

<?php
class User extends DatabaseObject {

protected static $table_name="users";
protected static $db_fields = array('id', 'username', 'password', 'level', 'email', 'squad_id');

var $id;
var $username;
var $password;
var $level;
        var $email;

static function authenticate($username="", $password="") {
    global $database;
    $username = $database->escape_value($username);
    $password = $database->escape_value($password);

    $sql  = "SELECT * FROM users ";
    $sql .= "WHERE username = '{$username}' ";
    $sql .= "AND password = '{$password}' ";
    $sql .= "LIMIT 1";
    $result_array = self::find_by_sql($sql);
	return !empty($result_array) ? array_shift($result_array) : false;
}
    
    function join_date() {
        $join_date = strftime("$d/$m/$y",$this->timestamp);
        return $join_date;
    }
}
?>

 

database object class

 

<?php
// If it's going to need the database, then it's 
// probably smart to require it before we start.
require_once(LIB_PATH.DS.'database.php');

class DatabaseObject {

    public static function find_all() {
        return static::find_by_sql("SELECT * FROM ".static::$table_name);
  }
  
  public static function find_by_id($id=0) {
    $result_array = static::find_by_sql("SELECT * FROM ".static::$table_name." WHERE id={$id} LIMIT 1");
        return !empty($result_array) ? array_shift($result_array) : false;
  }
  
      public static function find_by_sql($sql="") {
        global $database;
        $result_set = $database->query($sql);
        $object_array = array();
        while ($row = $database->fetch_array($result_set)) {
          $object_array[] = static::instantiate($row);
        }
        return $object_array;
      }

    public static function count_all() {
      global $database;
      $sql = "SELECT COUNT(*) FROM ".static::$table_name;
    $result_set = $database->query($sql);
      $row = $database->fetch_array($result_set);
    return array_shift($row);
    }

    private static function instantiate($record) {
    $class_name = get_called_class();
    $object = new $class_name;
    
        foreach($record as $attribute=>$value){
          if($object->has_attribute($attribute)) {
            $object->$attribute = $value;
          }
        }
        return $object;
    }
    
    private function has_attribute($attribute) {
      // We don't care about the value, we just want to know if the key exists
      // Will return true or false
      return array_key_exists($attribute, $this->attributes());
    }

    protected function attributes() { 
        // return an array of attribute names and their values
      $attributes = array();
      foreach(static::$db_fields as $field) {
        if(property_exists($this, $field)) {
          $attributes[$field] = $this->$field;
        }
      }
      return $attributes;
    }
    
    protected function sanitized_attributes() {
      global $database;
      $clean_attributes = array();
      // sanitize the values before submitting
      // Note: does not alter the actual value of each attribute
      foreach($this->attributes() as $key => $value){
        $clean_attributes[$key] = $database->escape_value($value);
      }
      return $clean_attributes;
    }
    
    public function save() {
      // A new record won't have an id yet.
      return isset($this->id) ? $this->update() : $this->create();
    }
    
    public function create() {
        global $database;
        // Don't forget your SQL syntax and good habits:
        // - INSERT INTO table (key, key) VALUES ('value', 'value')
        // - single-quotes around all values
        // - escape all values to prevent SQL injection
        $attributes = $this->sanitized_attributes();
      $sql = "INSERT INTO ".static::$table_name." (";
        $sql .= join(", ", array_keys($attributes));
      $sql .= ") VALUES ('";
        $sql .= join("', '", array_values($attributes));
        $sql .= "')";
      if($database->query($sql)) {
        $this->id = $database->insert_id();
        return true;
      } else {
        return false;
      }
    }

    public function update() {
      global $database;
        // Don't forget your SQL syntax and good habits:
        // - UPDATE table SET key='value', key='value' WHERE condition
        // - single-quotes around all values
        // - escape all values to prevent SQL injection
        $attributes = $this->sanitized_attributes();
        $attribute_pairs = array();
        foreach($attributes as $key => $value) {
          $attribute_pairs[] = "{$key}='{$value}'";
        }
        $sql = "UPDATE ".static::$table_name." SET ";
        $sql .= join(", ", $attribute_pairs);
        $sql .= " WHERE id=". $database->escape_value($this->id);
      $database->query($sql);
      return ($database->affected_rows() == 1) ? true : false;
    }

    public function delete() {
        global $database;
        // Don't forget your SQL syntax and good habits:
        // - DELETE FROM table WHERE condition LIMIT 1
        // - escape all values to prevent SQL injection
        // - use LIMIT 1
      $sql = "DELETE FROM ".static::$table_name;
      $sql .= " WHERE id=". $database->escape_value($this->id);
      $sql .= " LIMIT 1";
      $database->query($sql);
      return ($database->affected_rows() == 1) ? true : false;
    
        // NB: After deleting, the instance of User still 
        // exists, even though the database entry does not.
        // This can be useful, as in:
        //   echo $user->first_name . " was deleted";
        // but, for example, we can't call $user->update() 
        // after calling $user->delete().
    }
}

 

database object

 

<?php
require_once(LIB_PATH.DS."config.php");

class MySQLDatabase {

private $connection;
public $last_query;
private $magic_quotes_active;
private $real_escape_string_exists;

  function __construct() {
    $this->open_connection();
	$this->magic_quotes_active = get_magic_quotes_gpc();
	$this->real_escape_string_exists = function_exists( "mysql_real_escape_string" );
  }

public function open_connection() {
	$this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
	if (!$this->connection) {
		die("Database connection failed: " . mysql_error());
	} else {
		$db_select = mysql_select_db(DB_NAME, $this->connection);
		if (!$db_select) {
			die("Database selection failed: " . mysql_error());
		}
	}
}

public function close_connection() {
	if(isset($this->connection)) {
		mysql_close($this->connection);
		unset($this->connection);
	}
}

public function query($sql) {
	$this->last_query = $sql;
	$result = mysql_query($sql, $this->connection);
	$this->confirm_query($result);
	return $result;
}

public function escape_value( $value ) {
	if( $this->real_escape_string_exists ) { // PHP v4.3.0 or higher
		// undo any magic quote effects so mysql_real_escape_string can do the work
		if( $this->magic_quotes_active ) { $value = stripslashes( $value ); }
		$value = mysql_real_escape_string( $value );
	} else { // before PHP v4.3.0
		// if magic quotes aren't already on then add slashes manually
		if( !$this->magic_quotes_active ) { $value = addslashes( $value ); }
		// if magic quotes are active, then the slashes already exist
	}
	return $value;
}

// "database-neutral" methods
  public function fetch_array($result_set) {
    return mysql_fetch_array($result_set);
  }
  
  public function num_rows($result_set) {
   return mysql_num_rows($result_set);
  }
  
  public function insert_id() {
    // get the last id inserted over the current db connection
    return mysql_insert_id($this->connection);
  }
  
  public function affected_rows() {
    return mysql_affected_rows($this->connection);
  }

private function confirm_query($result) {
	if (!$result) {
    $output = "Database query failed: " . mysql_error() . "<br /><br />";
    $output .= "Last SQL query: " . $this->last_query;
    die( $output );
	}
}

}

$database = new MySQLDatabase();
$db =& $database;

?>

Link to comment
Share on other sites

Some things to look for would be where the object was initiated. That instance is only aviable with in the scope of which it was initialized. Thus if it was initialized in the main script it would not be aviable inside of a function or a class with out being passed into the function or class.

http://www.php.net/manual/en/language.variables.scope.php

Remember variable scope also applies to objects.

Link to comment
Share on other sites

Im kinda confused, it it was a scope issue I would assume he wouldnt find the class or the variable, but he actually does. Could be im wrong thou, kinda a newbie with OOP, objects,scopes....

 

thanks for the fasy reply.

Link to comment
Share on other sites

<?php
// Remember to give your form's submit tag a name="submit" attribute!
if (isset($_POST['submit'])) { // Form has been submitted.

  $username = trim($_POST['username']);
  $password = trim($_POST['password']);
  $password2 = trim($_POST['password2']);    
  $email =    trim($_POST['email']);
  
    // see if row already excist by first getting it out of the DB and then comparing it to the given username
    
  $sql = "SELECT * FROM users WHERE username LIKE '". $username . "' LIMIT 1";
  $result_array = user::find_by_sql($sql);
  $user = array_shift($result_array);
  print_r($user);
  
  if ($user->username !== $username && $password == $password2 )  {
// create new user if username doesnt excist and given passwords are equal
$new_user = new User();
$new_user->username = $username;
$new_user->password = $password;
$new_user->email = $email;
$new_user->level = 1;
$new_user->create();

$new_user_profile = new UserProfile();
$new_user_profile->id = $new_user->id;
$new_user_profile->active = 0;
$new_user_profile->create();

$new_user_stats = new UserStats();
$new_user_stats->id = $new_user->id;
$new_user_stats->timestamp_created = time();
$new_user_stats->create();

    echo output_message("User has been created! <br/>");   
    echo output_message( '<a href="index.php?">Index</a>');   

  }
   if ($user->username == $username )  {
    echo output_message("username already excists!"); 
    ?>
        <h2>register</h2>
        <form action="index.php?pg=register" method="post">
          <table>
            <tr>
              <td>Username:</td>
              <td>
                <input type="text" name="username" maxlength="30" value="<?php echo htmlentities($username); ?>" />
              </td>
            </tr>
            <tr>
              <td>Password:</td>
              <td>
                <input type="password" name="password" maxlength="30" value="<?php echo htmlentities($password); ?>" />
              </td>
            </tr>
            <tr>
              <td>Password again:</td>
              <td>
                <input type="password" name="password2" maxlength="30" value="<?php echo htmlentities($password2); ?>" />
              </td>
            </tr>
            <tr>
                        <tr>
              <td>Email:</td>
              <td>
                <input type="text" name="email" maxlength="30" value="<?php echo htmlentities($email); ?>" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <input type="submit" name="submit" value="register" />
              </td>
            </tr>
          </table>
        </form>
    <?php  
  }
  elseif ($password != $password2)  {
    echo output_message("Passwords are not equal!"); 
        ?>
        <h2>register</h2>
        <form action="index.php?pg=register" method="post">
          <table>
            <tr>
              <td>Username:</td>
              <td>
                <input type="text" name="username" maxlength="30" value="<?php echo htmlentities($username); ?>" />
              </td>
            </tr>
            <tr>
              <td>Password:</td>
              <td>
                <input type="password" name="password" maxlength="30" value="<?php echo htmlentities($password); ?>" />
              </td>
            </tr>
            <tr>
              <td>Password again:</td>
              <td>
                <input type="password" name="password2" maxlength="30" value="<?php echo htmlentities($password2); ?>" />
              </td>
            </tr>
            <tr>
                        <tr>
              <td>Email:</td>
              <td>
                <input type="text" name="email" maxlength="30" value="<?php echo htmlentities($email); ?>" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <input type="submit" name="submit" value="register" />
              </td>
            </tr>
          </table>
        </form>
    <?php
  }
}
else {
$username = "";
$password = "";
$password2 = "";   
$email =  "";
?>
        <h2>register</h2>
        <form action="index.php?pg=register" method="post">
          <table>
            <tr>
              <td>Username:</td>
              <td>
                <input type="text" name="username" maxlength="30" value="<?php echo htmlentities($username); ?>" />
              </td>
            </tr>
            <tr>
              <td>Password:</td>
              <td>
                <input type="password" name="password" maxlength="30" value="<?php echo htmlentities($password); ?>" />
              </td>
            </tr>
            <tr>
              <td>Password again:</td>
              <td>
                <input type="password" name="password2" maxlength="30" value="<?php echo htmlentities($password2); ?>" />
              </td>
            </tr>
            <tr>
              <td>Email:</td>
              <td>
                <input type="text" name="email" maxlength="30" value="<?php echo htmlentities($email); ?>" />
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <input type="submit" name="submit" value="register" />
              </td>
            </tr>
          </table>
        </form>
        <?php
}
        ?>

 

and that one is included to index

 

<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
require_once("inc/initialize.php"); 
require_once("templates/dev/header.php"); ?>

<div id="sideBar">
    <div class="panel">
        <h4>Sidebar</h4> 
    </div>
</div>

<div id="sideBarright"> 
    <div class="panel"> 
        <h4>Sidebar</h4> 
    </div>
</div>  
<div id="content"> 
<?php
  
if (isset($_GET[ACTION]) && $_GET[ACTION] != "") {

$action = $_GET[ACTION];

if (file_exists('pages/'.$action.'.php')) {

require_once('pages/'.$action.'.php');

} 
elseif (!file_exists('pages/' .$action. '.php')) {

echo 'Page you are requesting doesn´t exist';

}

} else {
    $test = $session->is_logged_in();
    if ( $test != true){
        echo '<a href="index.php?' . ACTION . '=login">Login</a> <br/>';
        echo 'or <a href="index.php?' . ACTION . '=register">register</a>';
    }
    else {
        echo "Your logged in <br />";
        echo '<a href="index.php?' . ACTION . '=logout">Logout</a>';
    }
}
?> 
</div>
<?php require_once("templates/dev/footer.php"); ?>

 

and the classes are included here

 

<?php

// Define the core paths
// Define them as absolute paths to make sure that require_once works as expected

// DIRECTORY_SEPARATOR is a PHP pre-defined constant
// (\ for Windows, / for Unix)
defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);

defined('SITE_ROOT') ? null : 
define('SITE_ROOT','C:'.DS.'wamp'.DS.'www'.DS.'cms');

defined('LIB_PATH') ? null : define('LIB_PATH', SITE_ROOT.DS.'inc');

// load config file first
require_once(LIB_PATH.DS.'config.php');

// load basic functions next so that everything after can use them
require_once(LIB_PATH.DS.'functions.php');

// load core objects
require_once(LIB_PATH.DS.'session.php');
require_once(LIB_PATH.DS.'database.php');
require_once(LIB_PATH.DS.'database_object.php');

// load database-related classes

//require_once(LIB_PATH.DS.'news.php'); 
  
require_once(LIB_PATH.DS.'user.php');   
require_once(LIB_PATH.DS.'user_profile.php'); 
require_once(LIB_PATH.DS.'user_stats.php');     
?>

Link to comment
Share on other sites

The method returns an array.  Have you tried

 

$user[0]->username

 

??

 

Also, there are several questionable things going on in general, including:

 

1. Mixing PHP 4 and PHP 5 OO syntax

2. User allowing direct public access to its properties

3. User being a child of DatabaseObject

4. Using array_key_exists() on an object, which is deprecated behavior as of 5.3.  Using property_exists(), or, even better, the Reflection API is the way to go here.

Link to comment
Share on other sites

Fatal error: Cannot use object of type User as array in C:\wamp\www\cms\pages\register.php on line 16

 

code :

 

 if ($user[0]->username == $username )  

 

mind if I send you a pm, I have some questions about the things you said.

 

Thanks for the hints!

Link to comment
Share on other sites

thanks, that actually seemed to work. No idea whats going on thou, going to look into it ( if I do the same thing on another class it does return as an object in an array ... very strange )

 

gone make this topic solved. thanks again.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.