Skip to content

Loading…

DDC-2218: Unable to set custom PDO instance #2915

Closed
doctrinebot opened this Issue · 10 comments

2 participants

@doctrinebot

Jira issue originally created by user mdobak:

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

@doctrinebot

Comment created by @ocramius:

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

@doctrinebot

Comment created by mdobak:

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.

@doctrinebot

Comment created by @ocramius:

Could you expose your current config?

@doctrinebot

Comment created by mdobak:

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.

@doctrinebot

Comment created by @ocramius:

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

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

@doctrinebot

Comment created by mdobak:

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.

@doctrinebot

Comment created by @ocramius:

[~mdobak] can you provide the code to reproduce this then?

@doctrinebot

Comment created by mdobak:

<?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.

@doctrinebot

Comment created by @beberlei:

You need to set the statement to get it working:

$pdo->setAttribute(PDO::ATTR*STATEMENT*CLASS, array('Doctrine\DBAL\Driver\PDOStatement', array()));
@doctrinebot

Issue was closed with resolution "Invalid"

@beberlei beberlei was assigned by doctrinebot
@doctrinebot doctrinebot closed this
@doctrinebot doctrinebot added the Bug label
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.