#36561 [Com]: PDO_ODBC/MSSQL does not work with bound params in subquery

From: Date: Fri, 22 Jun 2007 17:50:11 +0000
Subject: #36561 [Com]: PDO_ODBC/MSSQL does not work with bound params in subquery
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-114091@lists.php.net to get a copy of this message
ID: 36561 Comment by: blohr at triad dot rr dot com Reported By: travis at raybold dot com Status: Open Bug Type: PDO related Operating System: Windows XP PHP Version: 5.1.2 New Comment: This bug affects my app, too. I'm using PHP 5.2.3 on Windows XP Pro SP2, under both IIS 5.1 and Apache 2.2, with SQL Server 2005 Express. I don't know if it'll help or not, but here's some more reproduce code. Just fix the PDO DSN string to something valid. <?php $db = new PDO("odbc:dsn=$odbcDsn;uid=$user;pwd=$pass"); $createTable = 'CREATE TABLE ##test ( intCol int, textCol varchar(20) )'; $createTable2 = 'CREATE TABLE ##test2 ( intCol2 int, textCol2 varchar(20) )'; $db->exec($createTable); $db->exec($createTable2); $ins = $db->prepare('INSERT INTO ##test (intCol, textCol) VALUES (:i, :t)'); $ins->execute(array('i'=>1, 't'=>'A String')); $ins2 = $db->prepare('INSERT INTO ##test2 (intCol2, textCol2) VALUES (:i, :t)'); $ins2->execute(array('i'=>1, 't'=>'Another String')); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE textCol2 = :t)'); $sel->execute(array('t'=>'Another String')) or var_dump($sel->errorInfo()); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE intCol2 = :i)'); $sel->execute(array('i'=>1)) or var_dump($sel->errorInfo()); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE textCol2 = :t)'); $sel->bindValue('t', 'Another String'); $sel->execute() or var_dump($sel->errorInfo()); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE intCol2 = :i)'); $sel->bindValue('i', 1); $sel->execute() or var_dump($sel->errorInfo()); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE textCol2 = :t)'); $sel->bindValue('t', 'Another String', PDO::PARAM_STR); $sel->execute() or var_dump($sel->errorInfo()); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE intCol2 = :i)'); $sel->bindValue('i', 1, PDO::PARAM_INT); $sel->execute() or var_dump($sel->errorInfo()); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE textCol2 = :t)'); $t = 'Another String'; $sel->bindParam('t', $t, PDO::PARAM_STR); $sel->execute() or var_dump($sel->errorInfo()); $sel = $db->prepare('SELECT * FROM ##test WHERE intCol = (SELECT intCol2 FROM ##test2 WHERE intCol2 = :i)'); $i = 1; $sel->bindParam('i', $i, PDO::PARAM_INT); $sel->execute() or var_dump($sel->errorInfo()); ?> Previous Comments: ------------------------------------------------------------------------ [2007-05-24 20:50:41] travis at raybold dot com Hey Wez, I never saw the feedback til I stumbled on it today, and clearly have been able to work around this, but it does keep stopping me. It happens exactly the same if I omit the PDO::PARAM_INT as the final parameter. I am still using the branched version you gave me... I'd be happy to test with the latest if you think it might be fixed there. --Travis ------------------------------------------------------------------------ [2006-04-17 01:00:01] 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". ------------------------------------------------------------------------ [2006-04-09 07:57:01] wez@php.net Try using: $oStatement->bindParam(':TestID', $iTestID); instead of: $oStatement->bindParam(':TestID', $iTestID,PDO::PARAM_INT ); The latter is implicitly binding for output, which might be part of your problem. ------------------------------------------------------------------------ [2006-02-28 17:10:09] travis at raybold dot com Description: ------------ Connecting to a MSSQL database through PDO_ODBC, I prepare a statement with a bound parameter inside of a subquery, and get a 42000 Syntax Error when I execute it. The error indicates that it is trying to compare text. ntext or image data, but the table consists solely of one integer field. Moving the bound parameter outside of the subquery makes it work. I am using PHP 5.1.2, MSSQL 2000, Windows XP, IIS6. Configure Line: cscript /nologo configure.js "--enable-snapshot-build" "--with-gd=shared" Reproduce code: --------------- MSSQL: CREATE TABLE zTest_TBL ( TestID int NULL ) INSERT INTO zTest_TBL (TestID) Values (1) PHP: <? $iTestID=1; $oConnection = new PDO($sDSN, $GLOBALS["sDatabase_Username"], $GLOBALS["sDatabase_Password"]); $oStatement = $oConnection->prepare('SELECT TestID FROM zTest_TBL WHERE TestID IN (SELECT TestID FROM zTest_TBL WHERE TestID = :TestID)'); //$oStatement = $oConnection->prepare('SELECT TestID FROM zTest_TBL WHERE TestID = :TestID AND TestID IN (SELECT TestID FROM zTest_TBL )'); $oStatement->bindParam(':TestID', $iTestID,PDO::PARAM_INT ); $oStatement->execute() or print_r($oStatement->errorInfo()); foreach($oStatement as $aRow) { print_r($aRow); } ?> Expected result: ---------------- Array ( [TestID] => 1 [0] => 1 ) Actual result: -------------- Array ( [0] => 42000 [1] => 306 [2] => [Microsoft][ODBC SQL Server Driver][SQL Server]The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator. (SQLExecute[306] at ext\pdo_odbc\odbc_stmt.c:133) [3] => 42000 ) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=36561&edit=1

« previous php.bugs (#114091) next »