Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major 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
        Marco Pivetta added a comment -

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

        Show
        Marco Pivetta added a comment - Shouldn't you build the driver with your PDO instance?
        Hide
        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
        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
        Marco Pivetta added a comment -

        Could you expose your current config?

        Show
        Marco Pivetta added a comment - Could you expose your current config?
        Hide
        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
        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
        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
        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
        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
        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
        Marco Pivetta added a comment -

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

        Show
        Marco Pivetta added a comment - Michał Dobaczewski can you provide the code to reproduce this then?
        Hide
        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
        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
        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
        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()));

          People

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

            Dates

            • Created:
              Updated:
              Resolved: