views:

38

answers:

1

Ok, I hope I've got everything listed up nicely before posting this question because I've found bits and pieces of a solution here and there but no real answer to my issue.

1: I'm using a singleton MySQL connection with mysqli, not using stored procedures;

2: I found code online explaining session_set_save_handler and have embedded it as a class called MySqlSessionStore;

3: in my DB class there is this public function:

public function escapeStringForDB($input)
 {
  return $this->_link->real_escape_string($input);
 }

and $this->_link = new mysqli($host, $user, $password, $database)

4:$db = MySQL::getInstance(array(DB_SERVER, DB_USER, DB_PASS, DB_NAME)); This is how I call the static DB function (nothing out of the ordinary here)

Problem: everything works until I uncomment $id = $db->escapeStringForDB($id);, then the following error occurs:

Call to a member function real_escape_string() on a non-object

Example code from MySqlSessionStore:

function read($id)
{
    $db = MySQL::getInstance(array(DB_SERVER, DB_USER, DB_PASS, DB_NAME));
    $id = $db->escapeStringForDB($id);
    $db->query("SELECT data FROM sessions WHERE BINARY id = '". $id ."'");
    //echo "SELECT data FROM sessions WHERE id = '". $id ."'";
    $result = $db->fetch();


    if(isset($result) && !empty($result))
    {
        return $result->data;
    }
    //MUST send an empty string if no session data
    return "";
}

Other questions, remarks:

  • I'm using session_regenerate_id() but apparently this needs to be removed with session_set_save_handler;
  • Where exactly do I put session_write_close(); ? I've got it in the destructor of my db class, but maybe that isn't the way to go;
  • I'm using this without harm on other projects, but here it seems the session handler behavior is different and confusing me :)

Thanks in advance, if you need more info I'll gladly provide it.

A: 

This should work:

public function escapeStringForDB($input)
{ 
   $this->connect(); 
   return $this->_link->real_escape_string($input); 
}
Mchl
I didn't declare it as static, only the instance is.
qwertzman
Apparently the read function from the custom session handler passes a string, causing the error. I'm unsure how to proceed with type casting or any other conversion I'd have to do...
qwertzman
I hope some PHP OOP expert can give me some insight on this - I'm assuming it has something to do with the $id being serialized or not? The read() function is the only one producing this problem: escaping works in all other custom session handler the functions.
qwertzman
If it was a singleton pattern, the _link variable should've been static. What's the code of `MySQL::getInstance()` ?
Mchl
I based my code on this article:http://www.devshed.com/c/a/PHP/Building-a-Singleton-Database-with-Restrictive-Constructors-in-PHP-5/1/ - you can find the code you requested on this page.thanks for your timeI should also add that making it static doesn't solve my problem.
qwertzman
I updated the answer to match the code from devshed. Try now.
Mchl