|
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 GroupAll rights reserved. |
Last updated: Mon Oct 27 17: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