php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #24752 unknown column type "uniqueidentifier", type 35
Submitted: 2003-07-22 08:29 UTC Modified: 2006-01-02 08:52 UTC
Votes:2
Avg. Score:5.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:1 (50.0%)
Same OS:1 (50.0%)
From: ssc at coolspot dot de Assigned:
Status: Closed Package: MSSQL related
PHP Version: 4.3.8 OS: Linux
Private report: No CVE-ID:
 [2003-07-22 08:29 UTC] ssc at coolspot dot de
Description:
------------
If you use the combination FreeTDS 0.61 + PHP 4.3.2 to access
data on a MS SQL Server 2000, columns of type "uniqueidentifier" (type 35) or causing php to barf, and you are not able to handle them.
I got it to work after a applying a patch, that I figure out :

for ext/mssql/php_mssql.c :

--- php-4.3.2/ext/mssql/php_mssql.c     2003-05-21 02:06:41.000000000 +0200
+++ php-4.3.2-LOCAL/ext/mssql/php_mssql.c       2003-07-22 13:34:35.000000000 
+0200
@@ -800,6 +800,15 @@
                        Z_DVAL_P(result) = (double) floatcol8(offset);
                        Z_TYPE_P(result) = IS_DOUBLE;
                        break;
+               case SQLUNIQUE:
+                       {
+                               int length = 16;
+                               char *data = charcol(offset);
+                               Z_STRVAL_P(result) = estrndup(data,length);
+                               Z_STRLEN_P(result) = length;
+                               Z_TYPE_P(result) = IS_STRING;
+                       }
+                       break;
                case SQLVARBINARY:
                case SQLBINARY:
                case SQLIMAGE: {

and for ext/mssql/php_mssql.h

--- php-4.3.2/ext/mssql/php_mssql.h     2003-02-09 08:49:34.000000000 +0100
+++ php-4.3.2-LOCAL/ext/mssql/php_mssql.h       2003-07-22 13:32:42.000000000 
+0200
@@ -32,7 +32,7 @@
 #endif
  
  
-#define MSSQL_VERSION "7.0"
+#define MSSQL_VERSION "8.0"
 #include "sqlfront.h"
 #include "sqldb.h"
  
@@ -59,6 +59,7 @@
 #define SQLIMAGE SYBIMAGE
 #define SQLBINARY SYBBINARY
 #define SQLVARBINARY SYBVARBINARY
+#define SQLUNIQUE SYBUNIQUE
 #define DBERRHANDLE(a, b) dberrhandle(b)
 #define DBMSGHANDLE(a, b) dbmsghandle(b)
 #define DBSETOPT(a, b, c) dbsetopt(a, b, c, -1)


It works for me :
RedHat 9.0 + updates
FreeTDS 0.61 (configure --prefix=/usr/local/freetds/0.61/ --enable-msdblib 
--with-tdsver=8.0)
PHP 4.3.2 (configure --prefix=/usr/local/php/4.3.2/ 
--with-mssql=/usr/local/freetds/0.61/ --without-mysql)
Windows 2000 BackOffice Server SP 4 + MS SQL Server 2000 SP 3

Perhaps +#define MSSQL_VERSION "8.0" is a bit "heavy", but looks nicer in 
phpinfo() ...

You can test it, if you fetch such a field, and then pass that value to mssql_guid_string. The output must be equal to CAST (field as CHAR(64)), where field is of the uniqueidentifier type.



Reproduce code:
---------------
$sql = "select * from tablename";
$res = mssql_query($sql);


/* causes php to barf, if you have a field of type uniqueidentifier */


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2003-07-23 11:56 UTC] iliaa@php.net
This bug has been fixed in CVS.

In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
 
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.

In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
 
Thank you for the report, and for helping us make PHP better.


 [2004-02-20 11:54 UTC] rgesse at ndigital dot com
I ran into the same problem wih the latest version of PHP and Freetds (as of Feb. 18, 2004). I found that the only way to SELECT from a uniqueidentifier field is the following: 

SELECT LEFT(CAST(uniqueidentifierfield as char(64)), 36) AS thisfield FROM table
 [2004-02-25 03:04 UTC] s dot sonnenberg at coolspot dot de
I use exactly the combination : PHP 4.3.4 + FreeTDS 0.61.2.
And we have no such problems.
Could you please send your configure strings ?
 [2004-06-08 15:44 UTC] dave at daveonline dot com
I am having a simular issue, however I am getting type (36) unknown and not 35. The SQl server is Enterprise 2000. and the field is a uniqueidentifier type. here is a line from the error:

Warning: mssql_query(): column 14 has unknown data type (36) in /opt/mysql-standard-4.0.18-pc-linux-i686/scripts/test.php on line 34

and here is the conf file
--------------------------------------------
[global]
        # TDS protocol version
        tds version = 8.0

;       initial block size = 512

        # uses some fixes required for some bugged MSSQL 7.0 server that
        # return invalid data to big endian clients
        # NOTE TDS version 7.0 or 8.0 should be used instead
;       swap broken dates = no
;       swap broken money = no

        # Database server login method, if both server and domain
        # logins are enabled, domain login is tried first if a domain
        # is specified, and if that fails the server login will be used.
        # OBSOLETE
;       try server login = yes
;       try domain login = no

        # The default authentication domain, can be overridden by
        # specifying a username with a domain prefix, e.g. DOMAIN\username
        # OBSOLETE use DOMAIN\username as username
;       nt domain = WORKGROUP

        # If the server responds with different domain try that one?
        # OBSOLETE never been used
;       cross domain login = no

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
;       dump file = /tmp/freetds.log
;       debug level = 10

        # Command and connection timeouts
;       timeout = 10
;       connect timeout = 10
        
        # If you get out of memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.  
        # (Microsoft servers sometimes pretend TEXT columns are
        # 4 GB wide!)   If you have this problem, try setting 
        # 'text size' to a more reasonable limit 
        text size = 64512

[testserver]
        host = <<DELETED>>
        port = 1433
        tds version = 8.0
 [2004-08-12 18:52 UTC] zakharm at hotmail dot com
I see that the following is in ext/mssql/php_mssql.h:

#ifdef SQLUNIQUE /* FreeTSD 0.61+ */
#define SQLUNIQUE SYBUNIQUE
#endif

When configuring PHP via ./configure, is there a parameter I can send to configure to enable SQLUNIQUE?

I did get it working by removing the #ifdef & #endif, but is there another way?

My configuration:
freedts
./configure --prefix=/usr/local/freetds --with-tdsver=8.0

php
./configure --with-mssql=/usr/local/freetds --with-regex=php --with-config-file-path=/etc/php4/apache --disable-rpath --enable-memory-limit --disable-debug --with-layout=GNU --with-pear=/usr/share/php --with-mysql=shared  --with-apxs=/usr/bin/apxs
 [2004-08-23 21:23 UTC] ssc at coolspot dot de
Open again dudes. 
Is there somebody who needs lessons in CVS usage, 
or what ?
 [2004-08-23 21:36 UTC] ssc at coolspot dot de
Ok, once again a lesson in the usage of a really 
famous tool, called "diff", which could by new to some of 
you. A TIP : if you are searching a release manager, 
call me. It is "really" anoying to double-check 
PHP each time i need to update. 
 
 
/mssql/php_mssql.h iff -wu 
php-4.3.8.working/ext/mssql/php_mssql.h php-4.3.8/ext/ 
--- php-4.3.8.working/ext/mssql/php_mssql.h     2004-08-23 
15:56:59.000000000 +0200 
+++ php-4.3.8/ext/mssql/php_mssql.h     2004-04-21 
01:37:26.000000000 +0200 
@@ -38,7 +38,7 @@ 
 
 #if HAVE_FREETDS 
 #ifndef SHORT 
-//typedef short SHORT; 
+typedef short SHORT; 
 #endif 
 #define SQLTEXT SYBTEXT 
 #define SQLCHAR SYBCHAR 
@@ -62,7 +62,9 @@ 
 #define SQLIMAGE SYBIMAGE 
 #define SQLBINARY SYBBINARY 
 #define SQLVARBINARY SYBVARBINARY 
+#ifdef SQLUNIQUE /* FreeTSD 0.61+ */ 
 #define SQLUNIQUE SYBUNIQUE 
+#endif 
 #define DBERRHANDLE(a, b) dberrhandle(b) 
 #define DBMSGHANDLE(a, b) dbmsghandle(b) 
 #define DBSETOPT(a, b, c) dbsetopt(a, b, c, -1)
 [2004-08-24 08:40 UTC] derick@php.net
Please keep your insulting comments in front of you.

What version doesn't work? 
 [2004-08-24 08:40 UTC] derick@php.net
Behave like this and receive no help.
 [2005-10-21 16:48 UTC] rodent at rodent dot za dot net
I would like to reopen this bug for php 5. The same appears to be ocurring there with freetds 0.61 from debian stable
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Fri Apr 18 20:01:57 2014 UTC