| Bug #40740 | PDO::execute() errors when parameters are used in LIMIT clause | ||||
|---|---|---|---|---|---|
| Submitted: | 6 Mar 2007 5:13pm UTC | Modified: | 23 Sep 2009 9:13pm UTC | ||
| From: | phpbugs at filofox dot com | Assigned to: | wez | ||
| Status: | No Feedback | Category: | PDO related | ||
| Version: | 5.2.1 | OS: | Linux Debian Sarge 3.1 | ||
| Votes: | 56 | Avg. Score: | 4.6 ± 0.6 | Reproduced: | 50 of 52 (96.2%) |
| Same Version: | 23 (46.0%) | Same OS: | 9 (18.0%) | ||
[23 Mar 2007 3:12pm UTC] vrana@php.net
Emulation is wrong if it doesn't work. Numbers after LIMIT should not be quoted.
[29 Aug 2008 1:46am UTC] jmalis at malisphoto dot com
This problem is still not fixed in PHP 5.2.6
[2 Nov 2008 3:43am UTC] dev at bcdiv dot com
PHP v 5.2.6 MySQL v 5.0.51b-community-nt Vista Ultimate SP1 Similar (though not exactly) usage of PDO to run a stored procedure w/ a parameter that sets the number in a limit clause does not replicate error. $dbc = new DBO; $dbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sproc = $dbc->prepare(“CALL spLimitProc ?”); $sproc->bindParam(1,$limit, PDO::PARAM_INT); $result = $sproc->execute(); Result returns table rows as expected (similar to direct MySQL sproc call). Perhaps resolved or not experienced across platforms?
[4 Nov 2008 3:25pm UTC] felipe@php.net
Please try using this CVS snapshot: http://snaps.php.net/php5.2-latest.tar.gz For Windows: http://windows.php.net/snapshots/
[12 Nov 2008 1:00am UTC] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".
[26 Nov 2008 10:57am UTC] miha dot vrhovnik at domenca dot si
I re-compiled pdo and pdo_mysql from 5.2.7 RC4 and overwritten libraries from php 5.2.6. Is this enough? If it is, then this issue is not fixed.
[18 Feb 2009 8:51am UTC] nduteil at freedev dot org
Hi, Still not fixed in the 5.2.8 release. If PDOStatement::bindParam or PDOStatement::bindValue is used to specified the parameter type (ie : PDO::PARAM_INT) everything works as expected. Not forcing the parameter type to integer generates an error in Mysql.
[16 Jun 2009 5:49pm UTC] tony at tonybibbs dot com
Same issue on 5.3.0RC2 using pretty much the same code in the initial bug report.
[22 Aug 2009 5:59am UTC] marcel dot esser at gmail dot com
Same problem on 5.2.6, Ubuntu Jaunty.
[26 Aug 2009 4:36pm UTC] seb117 at free dot fr
I don't understand why this bug does not solved ? It's very important, and we don't use PDO properly with this bug.
[8 Sep 2009 12:56pm UTC] weblab dot solutions at gmail dot com
Try PHP 5.2.9 & 5.3.0 - get the same exception.
[8 Sep 2009 1:00pm UTC] weblab dot solutions at gmail dot com
And I really surprised this issue not fixed for more than 2 year.
[23 Sep 2009 9:13pm UTC] uw@php.net
Can we close it as a duplicate and if favour of http://bugs.php.net/bug.php?id=44639 ?

Description: ------------ The following emerged after upgrading from 5.2.0 to 5.2.1 and has been checked in both versions: the error only occurs in 5.2.1 . When passing parameters into a LIMIT clause using PDO::execute(), it appears that PDO is quoting the parameters, which causes MYSQL to throw an error. FYI: PDO_MYSQL is built against MySQL client library 5.0.18. Reproduce code: --------------- $dbh = new PDO('mysql:localhost;dbname=my_db', 'user', '' ); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try{ $query = $dbh->prepare( 'SELECT * FROM some_table LIMIT :start, :limit' ); if ( $query->execute ( array ( 'start' => 0, 'limit' => 10 ) ) ) { while ( $row = $query->fetch ( PDO::FETCH_ASSOC ) ) { print_r($row); } $query->closeCursor(); } } catch( Exception $e ){ print_r( $e ); } Expected result: ---------------- A number of rows are returned. Actual result: -------------- An exception is thrown: PDOException Object ( [message:protected] => 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 ''0', '10'' at line 1 [string:private] => [code:protected] => 42000 [file:protected] => [my_file].php [line:protected] => 19 [trace:private] => Array ( [0] => Array ( [file] => [my_file].php [line] => 19 [function] => execute [class] => PDOStatement [type] => -> [args] => Array ( [0] => Array ( [start] => 0 [limit] => 10 ) ) ) ) [errorInfo] => Array ( [0] => 42000 [1] => 1064 [2] => 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 ''0', '10'' at line 1 ) )