0

I am using a script to cache statically DB and PDO statements executed.

here it is

    <?php
    require_once 'ExceptionHandler.php';
    final class Database {

    private static $db = "test";
    private static $host = "localhost";
    private static $username = "root";
    private static $password = "";

    private static $dbConn = null;
    private static $queryCatch = array();
    private static function CONNECT()
    {
        if(self::$dbConn === null)
        {
            $connUrl = "mysql:host=".self::$host.";dbname=".self::$db;
            self::$dbConn = new PDO($connUrl,self::$username,self::$password,array(PDO::ATTR_PERSISTENT => true));
        }
    }

    public static function query($sql)
    {
        Database::CONNECT();

        if(isset(self::$queryCatch[$sql]) && is_object(self::$queryCatch[$sql]))
        {
            $query = self::$queryCatch[$sql];
        }
        else
        {
            $query = self::$dbConn->prepare($sql);
            self::$queryCatch[$sql] = $query;
        }

        $numargs = func_num_args();
        $arg_list = func_get_args();
        //start from 1st parameter as 0th parameter is the query
        for ($i = 1; $i < $numargs; $i++) {

            if(is_int($arg_list[$i]))
            {
                $query->bindParam($i,$arg_list[$i],PDO::PARAM_INT);
            }
            else 
            {
                $query->bindParam($i,$arg_list[$i],PDO::PARAM_STR);
            }
        }

        $query->execute();

        return $query;
    }
}

?>

I wanted to make this not just statically in page caching but a global $_SESSION caching

But the following changed to my connect method is not helping

private static function CONNECT()
{
    if(self::$dbConn === null)
    {
        if(isset($_SESSION['X_DB_CONN']))
        {
            self::$dbConn = $_SESSION['X_DB_CONN'];echo "session cache hit";
        }
        else 
        {
            $connUrl = "mysql:host=".self::$host.";dbname=".self::$db;
            self::$dbConn = new PDO($connUrl,self::$username,self::$password,array(PDO::ATTR_PERSISTENT => true));
            $_SESSION['X_DB_CONN'] = self::$dbConn;
            if(isset($_SESSION['test']))
            {
                echo ":)";
                $_SESSION['test'] = "OO";
            }

            echo "session cache NOT hit";
        }
    }
}  

I have started the session properly. To Give proof and stating my problem:

The $_SESSION['test'] is set from another page to ":)". And :) is the output from the if statement on this page.

Beides always

session cache NOT hit

is displayed

This is the output by the standard php error console

Fatal error: Exception thrown without a stack frame in Unknown on line 0

I have included the session_start() so that shouldn't be the problem

1 Answer 1

1

You can't cache objects, resourses or handlers this way. Because this is pointer (or link) to the system resource, not an actual resource. So when when you cache it, you cache link, and of course after refresh link will be broken.

PDO::ATTR_PERSISTENT => true would be really enough.

Sign up to request clarification or add additional context in comments.

2 Comments

so is my assumption that a PDO returns an object wrong? and it only returns an handler?
So an object is created in the server/system and then pHp returns this object's pointer to the script?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.