Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Invalid
    • Affects Version/s: 2.3.1
    • Fix Version/s: None
    • Component/s: None
    • Security Level: All
    • Labels:
      None

      Description

      Hi,

      It's impossible to set custom instance of PDO using "pdo" parameter in connection params. Its cause errors like this:

      Argument 1 passed to Doctrine\DBAL\Cache\ResultCacheStatement::__construct() must be an instance of Doctrine\DBAL\Driver\Statement, instance of PDOStatement given

      Change "Statement $stmt" to just "$stmt" in Doctrine\DBAL\Cache\ResultCacheStatement constructor parameter list sloved problem.

      Kind regards,
      Michał Dobaczewski

        Activity

        Hide
        beberlei Benjamin Eberlei added a comment -

        You need to set the statement to get it working:

        $pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Doctrine\DBAL\Driver\PDOStatement', array()));
        
        Show
        beberlei Benjamin Eberlei added a comment - You need to set the statement to get it working: $pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('Doctrine\DBAL\Driver\PDOStatement', array()));
        Hide
        mdobak Michał Dobaczewski added a comment -
        <?php
        use Doctrine\ORM\Tools\Setup;
        use Doctrine\ORM\EntityManager;
        
        require __DIR__ . '/Doctrine/ORM/Tools/Setup.php';
        require __DIR__ . '/Entities/Foo.php';
        
        Doctrine\ORM\Tools\Setup::registerAutoloadPEAR();
        
        $paths = array("Entities");
        $isDevMode = false;
        
        $pdoInstance = new PDO('mysql:host=localhost;dbname=mydb', 'root', 'mypass');
        
        // the connection configuration
        $dbParams = array(
            'driver'   => 'pdo_mysql',
            'pdo'      => $pdoInstance
        );
        
        $config = Setup::createConfiguration($isDevMode);
        $driverImpl = $config->newDefaultAnnotationDriver('/Entities');
        $config->setMetadataDriverImpl($driverImpl);
        
        $em = EntityManager::create($dbParams, $config);
        
        $query = $em->createQuery('SELECT e FROM Foo e');
        $query->useResultCache(true);
        $query->setResultCacheLifetime(3600);
        $query->setResultCacheDriver($em->getConfiguration()->getQueryCacheImpl());
        
        // Below line is important. It force query to use SQLWalker which use ResultCacheStatement.
        $query->setHint($query::HINT_CUSTOM_TREE_WALKERS, array('\Doctrine\ORM\Tools\Pagination\CountWalker'));
        
        $query->getResult();
        

        Foo is whatever correct entity.

        Show
        mdobak Michał Dobaczewski added a comment - <?php use Doctrine\ORM\Tools\Setup; use Doctrine\ORM\EntityManager; require __DIR__ . '/Doctrine/ORM/Tools/Setup.php'; require __DIR__ . '/Entities/Foo.php'; Doctrine\ORM\Tools\Setup::registerAutoloadPEAR(); $paths = array( "Entities" ); $isDevMode = false ; $pdoInstance = new PDO('mysql:host=localhost;dbname=mydb', 'root', 'mypass'); // the connection configuration $dbParams = array( 'driver' => 'pdo_mysql', 'pdo' => $pdoInstance ); $config = Setup::createConfiguration($isDevMode); $driverImpl = $config->newDefaultAnnotationDriver('/Entities'); $config->setMetadataDriverImpl($driverImpl); $em = EntityManager::create($dbParams, $config); $query = $em->createQuery('SELECT e FROM Foo e'); $query->useResultCache( true ); $query->setResultCacheLifetime(3600); $query->setResultCacheDriver($em->getConfiguration()->getQueryCacheImpl()); // Below line is important. It force query to use SQLWalker which use ResultCacheStatement. $query->setHint($query::HINT_CUSTOM_TREE_WALKERS, array('\Doctrine\ORM\Tools\Pagination\CountWalker')); $query->getResult(); Foo is whatever correct entity.
        Hide
        ocramius Marco Pivetta added a comment -

        Michał Dobaczewski can you provide the code to reproduce this then?

        Show
        ocramius Marco Pivetta added a comment - Michał Dobaczewski can you provide the code to reproduce this then?
        Hide
        mdobak Michał Dobaczewski added a comment -

        I checked the code again and I discovered, that happens If you use Doctrine\ORM\Query\Exec\SingleSelectExecutor with cache but is still a bug. Sorry to confuse you.

        Show
        mdobak Michał Dobaczewski added a comment - I checked the code again and I discovered, that happens If you use Doctrine\ORM\Query\Exec\SingleSelectExecutor with cache but is still a bug. Sorry to confuse you.
        Hide
        ocramius Marco Pivetta added a comment -

        Weird... Just went through the code and everything looks fine (See `Doctrine\DBAL\DriverManager#getConnection()`)

        Can you check the spl_object_hash of your PDO instance and the one in the DBAL driver? What's your `Connection#getDriver()`?

        Show
        ocramius Marco Pivetta added a comment - Weird... Just went through the code and everything looks fine (See `Doctrine\DBAL\DriverManager#getConnection()`) Can you check the spl_object_hash of your PDO instance and the one in the DBAL driver? What's your `Connection#getDriver()`?
        Hide
        mdobak Michał Dobaczewski added a comment -

        I have simple configuration without anything unusual based on code from this page:

         
        [...]
        
        $pdoInstance = new PDO('mysql:host=localhost;dbname=somedb', 'root', 'mypassword');
        
        [...]
        
        $connection['driver'] = 'pdo_mysql';
        $connection['pdo']    = $pdoInstance; 
        
        [...]
        
        $config = Setup::createConfiguration();
        
        [ Setup annotation driver, cache setup etc. ]
        
        $entityManager = EntityManager::create($connection, $config,  $evm);
        

        And now every Doctrine action which use database cause errors. If write this configuration:

        $connection['driver']   = 'pdo_mysql';
        $connection['user']     = 'root';
        $connection['password'] = 'mypassword';
        

        everything works.

        Show
        mdobak Michał Dobaczewski added a comment - I have simple configuration without anything unusual based on code from this page : [...] $pdoInstance = new PDO('mysql:host=localhost;dbname=somedb', 'root', 'mypassword'); [...] $connection['driver'] = 'pdo_mysql'; $connection['pdo'] = $pdoInstance; [...] $config = Setup::createConfiguration(); [ Setup annotation driver, cache setup etc. ] $entityManager = EntityManager::create($connection, $config, $evm); And now every Doctrine action which use database cause errors. If write this configuration: $connection['driver'] = 'pdo_mysql'; $connection['user'] = 'root'; $connection['password'] = 'mypassword'; everything works.
        Hide
        ocramius Marco Pivetta added a comment -

        Could you expose your current config?

        Show
        ocramius Marco Pivetta added a comment - Could you expose your current config?
        Hide
        mdobak Michał Dobaczewski added a comment -

        Maybe buld custom driver will be better solution but as long this option is in documentation it should work or it should be deleted from documentation.

        Show
        mdobak Michał Dobaczewski added a comment - Maybe buld custom driver will be better solution but as long this option is in documentation it should work or it should be deleted from documentation.
        Hide
        ocramius Marco Pivetta added a comment -

        Shouldn't you build the driver with your PDO instance?

        Show
        ocramius Marco Pivetta added a comment - Shouldn't you build the driver with your PDO instance?

          People

          • Assignee:
            beberlei Benjamin Eberlei
            Reporter:
            mdobak Michał Dobaczewski
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: