mssql_bind 空字符串转换为 NULL
Posted
技术标签:
【中文标题】mssql_bind 空字符串转换为 NULL【英文标题】:mssql_bind empty string converting to 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 分支的最新版本)
【问题讨论】:
【参考方案1】:假设你不想按照你的建议去做,留给你的选择是
-
下载 php 的 cvs 快照并安装它(如果可行),看看它是否已修复。如果不可行或无法通过 cvs 修复,则...
使用 system() 或 exec() 调用来使用存储过程。如果太麻烦的话...
不要使用存储过程,在 php 或其他脚本代码中执行您的功能。
更改存储过程以接受另一个值作为 '' 字符串并将其转换为 '' 字符串。
做你不想做的事。苛刻 :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 函数。
【讨论】:
以上是关于mssql_bind 空字符串转换为 NULL的主要内容,如果未能解决你的问题,请参考以下文章
JsonModel NSString 将 null 转换为空字符串
PHP递归方式把一个数组里面的null转换为空字符串”的方法