Skip to content

Commit

Permalink
Merge pull request #3088 from corphi/fix-pdo-fetch-mode-bc
Browse files Browse the repository at this point in the history
Fix #3082: Add BC for PDO-only fetch modes
  • Loading branch information
Majkl578 authored Apr 7, 2018
2 parents eb09c94 + 47755a7 commit d4a96de
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 2 deletions.
20 changes: 18 additions & 2 deletions lib/Doctrine/DBAL/Driver/PDOStatement.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
use Doctrine\DBAL\FetchMode;
use Doctrine\DBAL\ParameterType;
use PDO;
use const E_USER_DEPRECATED;
use function sprintf;
use function trigger_error;

/**
* The PDO implementation of the Statement interface.
Expand Down Expand Up @@ -213,7 +216,13 @@ public function fetchColumn($columnIndex = 0)
private function convertParamType(int $type) : int
{
if (! isset(self::PARAM_TYPE_MAP[$type])) {
throw new \InvalidArgumentException('Invalid parameter type: ' . $type);
// TODO: next major: throw an exception
@trigger_error(sprintf(
'Using a PDO parameter type (%d given) is deprecated and will cause an error in Doctrine 3.0',
$type
), E_USER_DEPRECATED);

return $type;
}

return self::PARAM_TYPE_MAP[$type];
Expand All @@ -231,7 +240,14 @@ private function convertFetchMode(?int $fetchMode) : ?int
}

if (! isset(self::FETCH_MODE_MAP[$fetchMode])) {
throw new \InvalidArgumentException('Invalid fetch mode: ' . $fetchMode);
// TODO: next major: throw an exception
@trigger_error(sprintf(
'Using a PDO fetch mode or their combination (%d given)' .
' is deprecated and will cause an error in Doctrine 3.0',
$fetchMode
), E_USER_DEPRECATED);

return $fetchMode;
}

return self::FETCH_MODE_MAP[$fetchMode];
Expand Down
54 changes: 54 additions & 0 deletions tests/Doctrine/Tests/DBAL/Functional/PDOStatementTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace Doctrine\Tests\DBAL\Functional;

use Doctrine\DBAL\Driver\PDOConnection;
use Doctrine\DBAL\Schema\Table;
use Doctrine\Tests\DbalFunctionalTestCase;
use PDO;
use function extension_loaded;

class PDOStatementTest extends DbalFunctionalTestCase
{
protected function setUp()
{
if (! extension_loaded('pdo')) {
$this->markTestSkipped('PDO is not installed');
}

parent::setUp();

if (! $this->_conn->getWrappedConnection() instanceof PDOConnection) {
$this->markTestSkipped('PDO-only test');
}

$table = new Table('stmt_test');
$table->addColumn('id', 'integer');
$table->addColumn('name', 'text');
$this->_conn->getSchemaManager()->dropAndCreateTable($table);
}

/**
* @group legacy
* @expectedDeprecation Using a PDO fetch mode or their combination (%d given) is deprecated and will cause an error in Doctrine 3.0
*/
public function testPDOSpecificModeIsAccepted()
{
$this->_conn->insert('stmt_test', [
'id' => 1,
'name' => 'Alice',
]);
$this->_conn->insert('stmt_test', [
'id' => 2,
'name' => 'Bob',
]);

$data = $this->_conn->query('SELECT id, name FROM stmt_test ORDER BY id')
->fetchAll(PDO::FETCH_KEY_PAIR);

self::assertSame([
1 => 'Alice',
2 => 'Bob',
], $data);
}
}

0 comments on commit d4a96de

Please sign in to comment.