Jump to content

Need help with OOP


eldan88
Go to solution Solved by Barand,

Recommended Posts

Hey Guys. I am trying to echo out all the username's from the user's table using object oriented style.. However i am having trouble with this one.Its not echoing out when I run the following code.

IT keeps on giving me this error message "Fatal error: Call to undefined method MySQLDatabase::fetch_assoc()"

$find_all  = User::find_all();
while($user = $database->fetch_assoc())  {
      echo "User"  . $user['username'];
}

Here is my find all method

    
    public static function find_all() {
        global $database;
        $result_set = $database->query("SELECT * FROM users");
        return $result_set; 
        
    }

And my database query method in the database class

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

Here is my full Database class

<?php
require('config.php');

class MySQLDatabase {
    
    private $_connection;
    public $last_query;
    private $magic_quotes_active;
    private $real_escape_string_exists;
 
    public function __construct() {
        $this->_connection =  new mysqli('localhost', 'root', 'root', 'sandbox', '8080');
        if(!$this->_connection) {die('Connection Error'.$_connection->connect_error );
        } else {
            $db_select = $this->_connection->select_db(DB_NAME);
        } if(!$db_select) {
            die("Database Selection Failed" . $this->_connection->error);
        }
        
           $this->magic_quotes_active = get_magic_quotes_gpc();
           $this->real_escape_string_exists = function_exists( "mysql_real_escape_string" );
    }
    
    public function query($sql) {
        $this->last_query = $sql;
        $result = $this->_connection->query($sql);
        $this->confirm_query($result);
        return $result;
    }
    
    
    
    
    //Database Nuteral Methods
    
    private function confirm_query($result){
    if(!$result) {
        $output = "Database query failed: ";
        $output .=  "Last query ". $this->last_query;
            die($output);
    
      }
    }
    
    public function num_rows($result_set) {
        $this->_connection->num_rows($result_set);
       
    }
    
    public function insert_id() {
        //Get the last ID inserted over the database 
        return $this->_connection->insert_id();
        
    }
    
    public function affected_rows() {
        return $this->_connection->affected_rows();
    }


//Database Netural Methods

    public function __clone(){} 

            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;
	               }
    
  
  
    
    public function close_connection(){
         if(isset($this->_connection)) {
        $this->_connection->close();
        unset($this->_connection);
    }
     
    }
 
}//end of class


$database = new MySQLDatabase();


?>

Link to comment
Share on other sites

It looks like you've been watching Lynda tutorials? Make sure you don't skip any of the videos and try actually MAKE SENSE of what your learning.

 

The error your getting spells it out for you, the fetch_assoc method doesnt exist.. Plain and simple, you need to add it. I will spoon feed you.

 

Add this to your database class. (I've added extras for your convenience)

public function fetch_assoc($result_set) {
	return mysql_fetch_assoc($result_set);
}
	
public function num_rows($result_set) {
	return mysql_num_rows($result_set);
}
public function fetch_array($result_set) {
	return mysql_fetch_array($result_set);
}
Link to comment
Share on other sites

  • Solution

 

It looks like you've been watching Lynda tutorials? Make sure you don't skip any of the videos and try actually MAKE SENSE of what your learning.

 

The error your getting spells it out for you, the fetch_assoc method doesnt exist.. Plain and simple, you need to add it. I will spoon feed you.

 

Add this to your database class. (I've added extras for your convenience)

public function fetch_assoc($result_set) {
	return mysql_fetch_assoc($result_set);
}
	
public function num_rows($result_set) {
	return mysql_num_rows($result_set);
}
public function fetch_array($result_set) {
	return mysql_fetch_array($result_set);
}

fetch_assoc() does exist, but it is a result object method, not a database object method.

$result = $db->query($sqlStr);  // returns result object;

you can use fetch_assoc with the result object

$row = $result->fetch_assoc();

And why would he want to add those deprecated functions of yours when he is using mysqli ?

Link to comment
Share on other sites

this thread is exactly the same issue at the start of your previous thread. which means you are not getting the gist of what is actually being returned/stored in the variables in the code.

 

you are getting an instance of a mysqli result object back from a method/function call, User::find_all(); in this case, and assigning that to a php variable $find_all. in the previous thread, you were directly calling your database class's ->query() method and storing the result object in a php variable $result.

 

so, you have instance of a result object in a variable. to access any properties/methods of that result object, you would use $variable_holding_object->some_property or $variable_holding_object->some_method();

Link to comment
Share on other sites

fetch_assoc() does exist, but it is a result object method, not a database object method.

$result = $db->query($sqlStr);  // returns result object;

you can use fetch_assoc with the result object

$row = $result->fetch_assoc();

And why would he want to add those deprecated functions of yours when he is using mysqli ?

 

Barnard! I kept on getting confused with using the MySQLDatabase class that I instantiated and the mysqli  result object, that  I needed to call. I had the same issue in the last thread you responded to as mac_gyver pointed out.

But now i fully understand the difference between the to. I have tried what you showed me and it works. Thanks again!

 

Mac_gyver. Thanks for that clear you explanation.

Link to comment
Share on other sites

encapsulation refers to enclosing, putting a shell around, isolating the code so that the only interaction with an instance of the class is though it's public methods/properties. once you have written and tested the code for a class, you should not need to remember (or document) anything about the actual internal implementation, just that it has methods/properties, what those methods accept as inputs, and what values are returned by the methods/properties.

 

in short, you should be able to search through the main code in a program and find all the interaction with any class just by searching for the variable holding the instance of the class.

 

by using the global keyword to bring a variable into the class, this isolation, general purpose nature, is broken. you must now remember that any one class needs you to set up an external variable and what the names are of all the global variable's for all the different classes that are using global variables in. you have also tied the class to using a specific external variable name, so it's not possible for you to us that variable name for anything else in the main code or for you to make additional instances of a class that needs a different value in a global variable.

 

an example. your class is apparently a user class. what happens when you need two (or more) instances of your user class (you are writing a user administration page where one instance is the admin, another instance is the user he is editing), each with a different database or requiring a different database connection? using the global keyword creates a bunch of more work to accomplish this. however, if the code is written without using the global keyword, all you need to do is create another instance of your database class for the different database/connection, i.e. $db2, then create another instance of your user class, where you pass the database connection into the user class either in the constructor or through a specific setter method.

Edited by mac_gyver
Link to comment
Share on other sites

In short, never, ever, ever use 'global' for anything, regardless if you're writing OO or procedural code. And if you're using a resource (book, tutorial, video, etc.) that has 'global' in its code, consider that resource suspect.

 

'global' is a sign of doing it wrong.

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.