ID: 36561
Comment by: blohr at triad dot rr dot com
Reported By: travis at raybold dot com
Status: Feedback
Bug Type: PDO related
Operating System: Windows XP
PHP Version: 5.1.2
New Comment:
I tried the code I posted previously with the snapshot you referenced.
Unfortunately, it didn't fix the problem. Here are the results:
> php -v
PHP 5.2.4-dev (cli) (built: Jul 10 2007 12:04:20)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
> php mssql-odbc.php
array(4) {
[0]=>
string(5) "42000"
[1]=>
int(402)
[2]=>
string(166) "[Microsoft][SQL Native Client][SQL Server]The data types
varchar and text are incompatible in the equal to operator.
(SQLExecute[402] at ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "42000"
}
array(4) {
[0]=>
string(5) "22018"
[1]=>
int(206)
[2]=>
string(141) "[Microsoft][SQL Native Client][SQL Server]Operand type
clash: text is incompatible with int (SQLExecute[206] at
ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "22018"
}
array(4) {
[0]=>
string(5) "42000"
[1]=>
int(402)
[2]=>
string(166) "[Microsoft][SQL Native Client][SQL Server]The data types
varchar and text are incompatible in the equal to operator.
(SQLExecute[402] at ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "42000"
}
array(4) {
[0]=>
string(5) "22018"
[1]=>
int(206)
[2]=>
string(141) "[Microsoft][SQL Native Client][SQL Server]Operand type
clash: text is incompatible with int (SQLExecute[206] at
ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "22018"
}
array(4) {
[0]=>
string(5) "42000"
[1]=>
int(402)
[2]=>
string(166) "[Microsoft][SQL Native Client][SQL Server]The data types
varchar and text are incompatible in the equal to operator.
(SQLExecute[402] at ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "42000"
}
array(4) {
[0]=>
string(5) "22018"
[1]=>
int(206)
[2]=>
string(141) "[Microsoft][SQL Native Client][SQL Server]Operand type
clash: text is incompatible with int (SQLExecute[206] at
ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "22018"
}
array(4) {
[0]=>
string(5) "42000"
[1]=>
int(402)
[2]=>
string(166) "[Microsoft][SQL Native Client][SQL Server]The data types
varchar and text are incompatible in the equal to operator.
(SQLExecute[402] at ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "42000"
}
array(4) {
[0]=>
string(5) "22018"
[1]=>
int(206)
[2]=>
string(141) "[Microsoft][SQL Native Client][SQL Server]Operand type
clash: text is incompatible with int (SQLExecute[206] at
ext\pdo_odbc\odbc_stmt.c:133)"
[3]=>
string(5) "22018"
}
Previous Comments:
------------------------------------------------------------------------
[2007-07-10 11:33:49] jani@php.net
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows (zip):
http://snaps.php.net/win32/php5.2-win32-latest.zip
For Windows (installer):
http://snaps.php.net/win32/php5.2-win32-installer-latest.msi
------------------------------------------------------------------------
[2007-06-22 17:50:11] blohr at triad dot rr dot com
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());
?>
------------------------------------------------------------------------
[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-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