Skip to content

Loading…

DDC-55: Query paramater mapping error #5056

Closed
doctrinebot opened this Issue · 5 comments

1 participant

@doctrinebot

Jira issue originally created by user mcurcio:

It seems as though the query parameters start from '1' (?0 throws an exception), whereas the Query#_prepareParams function starts counting from 0.

Code:
$query = $this->em->createQuery('SELECT s FROM Session s WHERE s.id = ?1');

echo $query->getSQL();

$session = $query->execute(array($id));
print_r($session);

Output:
SELECT s0.id AS id0, s0_.data AS data1, s0_.created AS created2, s0_.accessed AS accessed3 FROM Session s0_ WHERE s0.id = ?

Warning: Invalid argument supplied for foreach() in Doctrine/ORM/Query.php on line 222

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1' in Doctrine/DBAL/Connection.php:602
Stack trace:
#0 Doctrine/DBAL/Connection.php(602): PDO->query('SELECT s0_.id A...')
#1 Doctrine/ORM/Query/Exec/SingleSelectExecutor.php(42): Doctrine\DBAL\Connection->execute('SELECT s0_.id A...', Array)
#2 Doctrine/ORM/Query.php(198): Doctrine\ORM\Query\Exec\SingleSelectExecutor->execute(Object(Doctrine\DBAL\Connection), Array)
#3 Doctrine/ORM/AbstractQuery.php(461): Doctrine\ORM\Query->_doExecute(Array)
#4 classes/SessionManager.php(35): Doctrine\ORM\AbstractQuery->execute(A in /var/www/tec-expo.com/development/libraries/Doctrine/DBAL/Connection.php on line 602

@doctrinebot

Comment created by romanb:

This:

$query->execute(array($id));

is the same as this:

$query->execute(array(0 => $id));

is the same as this:

$query->setParameter(0, $id);
$query->execute();

Hence the error. We should probably check for isset($params[0]) in execute() and throw an exception in this case.

To get it to work, either use:

$query->execute(array(1 => $id));

or

$query->setParameter(1, $id);
$query->execute(); // or $query->getResult()
@doctrinebot

Comment created by mcurcio:

While I have since discovered the "colon-mapping" scheme, for the users who would prefer this mapping method, why not allow the zero position? Starting the count from zero would allow the simple execute() mechanism that I was trying, and while not very clear, might be useful for certain cases.

@doctrinebot

Comment created by romanb:

Fixed now. A meaninfgul exception is thrown.

Starting from 0 would be unintuitive as even PDO starts to count from 1.

@doctrinebot

Issue was closed with resolution "Fixed"

@doctrinebot doctrinebot added this to the 2.0-ALPHA3 milestone
@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.