mssql_bind空字符串转换为NULL

时间:2009-10-08 18:01:27

标签: php sql sql-server stored-procedures

我目前正在使用PHP的SQL Server 2000存储过程。在PHP文档之后,我使用 mssql_bind 来分配参数值,然后执行存储过程。

问题是我得到了this bug,这阻止我将空字符串绑定到参数(当调用存储过程时它们被转换为NULL)

我不想要转换存储过程中的每个参数来检查它的NULL是否然后转换回空字符串。我希望能够使用空字符串以及NULL,它们都有自己的含义。

有人知道PHP的解决方法吗? PHP错误网站不是很清楚,如果修复了这个错误或者它将被修复,我使用PHP 5.2.11(来自5.2分支的最新版本)

4 个答案:

答案 0 :(得分:0)

bug #44325提出了一个解决问题的补丁,但它不是一个正确的解决方案,因为它似乎是在ntwdblib.dll中,而不是在php_mssql扩展的代码中。

在oplot dot com上查看alexr的评论:

  

对不起这个bug没有修复。这个   是ntwdblib.dll的错误。和   在最新更新后,错误是   返回。

     

当我绑定一个空字符串时,存储起来   程序收到一个chr(0)字符   而是一个空字符串。

     

请回滚最后一次修复。这个bug   是不可恢复的。

考虑到这一点,我不确定在PHP方面可以做多少事情: - (

上次我在Windows上使用PHP + MSSQL时,我遇到了很多问题,实际上有些问题与实际相似; - (

对于您来说,可能的解决方案可能是切换到较新的SQL Server Driver for PHP驱动程序?请注意,这仅适用于Windows,但是......

答案 1 :(得分:0)

我个人没有可用于测试的MSSQL服务器,但您是否尝试过直接使用PDO而不是mssql?

PDOStatement->bindValue( mixed $parameter  , mixed $value  [, int $data_type  ] )

bindValue()

是的,我意识到PDO只是一个包装,但谁知道,可以工作! :)

答案 2 :(得分:0)

假设您不想按照建议行事,那么留给您的选项是

  1. 下载php的cvs快照,如果可行则安装它,看看它是否已修复。如果不可行或通过cvs修复那么......
  2. 使用system()或exec()调用来使用存储过程。如果太麻烦那么......
  3. 不要使用存储过程,在php或其他脚本代码中执行您的功能。
  4. 更改存储过程以接受''字符串的另一个值并将THAT转换为''字符串。
  5. 做你不想做的事。苛刻:P但我没有看到另一种方式。

答案 3 :(得分:0)

我有一个可行的解决方案。

我正在使用ADODB(但这没关系)我已经攻击了mssql驱动程序(adodb5驱动程序文件夹中的adodb-mssql.inc.php)。

这是代码

if($var === ''){
        //stupid hack to prevent mssql driver from converting empty strings to null. now they arent empty strings but they will get trimmed down to legth 0 ;-)
        $var = ' ';
        $type = SQLVARCHAR;
        $isNull = false;
        $maxLen = 0;
    }

只需检查您是否尝试绑定空字符串,如果要将其更改为非空。你使用什么价值并不重要我只是使用空格。

使类型为sqlvarchar isnull应为false,现在的诀窍是使maxlen为0,以便mssql驱动程序将字符串修剪为空字符串。

如果不明显,那些变量应该传递给mssql_bind函数。