【问题标题】:mssql_bind empty string converting to NULLmssql_bind 空字符串转换为 NULL
【发布时间】:2009-10-08 18:01:26
【问题描述】:

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

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

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

有谁知道 PHP 中的解决方法? PHP bugs 网站不清楚该错误是否已修复或何时修复,我使用 PHP 5.2.11(5.2 分支的最新版本)

【问题讨论】:

    标签: php sql sql-server stored-procedures


    【解决方案1】:

    假设你不想按照你的建议去做,留给你的选择是

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

    【讨论】:

      【解决方案2】:

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

      查看 alexr 在 oplot dot com 的评论:

      对不起。此错误未修复。这 是ntwdblib.dll 的错误。和 最新更新后,错误是 返回。

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

      请回滚上次修复。这个错误 是不可恢复的。

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

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

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

      【讨论】:

      • 是的,这就是问题所在,我们在 Linux 上运行 PHP,所以我们不能使用新的驱动程序。另外,ntwdblib.dll 不是 Windows 组件吗?所以应该不会影响PHP的Linux版本,还是我错了?
      【解决方案3】:

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

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

      bindValue()

      是的,我知道 PDO 只是一个包装器,但谁知道呢,它可以工作! :)

      【讨论】:

      • 是的,我们知道有 PDO,但它不支持存储过程可以返回的多个结果集。
      • 这是一个远射,太糟糕了! :(
      【解决方案4】:

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

      我正在使用 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 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多