我目前正在使用PHP的SQL Server 2000存储过程。在PHP文档之后,我使用 mssql_bind 来分配参数值,然后执行存储过程。
问题是我得到了this bug,这阻止我将空字符串绑定到参数(当调用存储过程时它们被转换为NULL)
我不想要转换存储过程中的每个参数来检查它的NULL是否然后转换回空字符串。我希望能够使用空字符串以及NULL,它们都有自己的含义。
有人知道PHP的解决方法吗? PHP错误网站不是很清楚,如果修复了这个错误或者它将被修复,我使用PHP 5.2.11(来自5.2分支的最新版本)
答案 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 ] )
是的,我意识到PDO只是一个包装,但谁知道,可以工作! :)
答案 2 :(得分:0)
假设您不想按照建议行事,那么留给您的选项是
答案 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函数。