|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [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 */
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Fri Oct 31 06:00:01 2025 UTC | 
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