使用PHP的odbc来获取varchar(max)列

时间:2011-02-10 15:20:57

标签: php sql-server-2008 varchar

我正在为一个类项目组建一个PHP网站,我们正在使用MS SQL Server 2008数据库来填充网站上的字段。但是,其中一个字段是在页面上输出垃圾而不是实际存储在数据库中的内容。

有问题的字段descriptionvarchar(MAX)字段;存储过程在数据库中查询元组,并将其表中的值转储到页面上的文本框中; description字段输出到textarea控件。

这是处理从数据库中提取信息的PHP:

$res = odbc_exec($dbhandle, "exec dbo.usp_ProgramGet " . $_GET["program"]);
$id = $_GET["program"];
$name = odbc_result($res, "title");
$desc = odbc_result($res, "description");

$name变量按预期工作(在数据库中,类型为char(15))。但是,如果(例如)description字段包含“这是一个测试”,则$desc将导致“ $ime ”,这将被转储到{{ 1}}控制,而不是存储在数据库中的内容。

我已经搜遍了所有这个问题并没有找到解决方案,虽然这听起来像是PHP本身的一个错误,虽然我不确定。


更新

我正在使用SQL Server查询来更新varchar值。我尝试输入一个非常长的字符串,我得到了这个:

textarea

“stringDayToInt”是我写的PHP函数的名称,它存在于一个完全不同的文件中,该文件包含在我正在尝试的页面中。非常离奇。

5 个答案:

答案 0 :(得分:3)

我在PHP 5.3上遇到了同样丑陋的问题...

.php页面显示随机字符,其中必须是列值 有时候是执行的php页面的ramdom字符和脚本部分。这不好。

SQL Server: MS SQL Server 2008 R2

我的odbc连接驱动程序: Driver = {SQL Server Native Client 10.0}

我的PHP版本: PHP 5.3

我环顾四周,但找不到解决办法 我试过并为我工作的解决方法是:

select cast(the_column_varcharmax as text) as column_name from table_name

尝试一下,我希望它适合你。

答案 1 :(得分:2)

这个bug在MSSQL / ODBC / PHP中很长一段时间,我失去了希望它将在我的生活中得到修复。解决方案是将其转换为过程中的文本:

select name, convert(text,description) as description. .....

我这么做多年了。

答案 2 :(得分:1)

这是PHP中已知的bug

编译自己的修补版本,或使用上面的解决方法。

答案 3 :(得分:0)

遇到类似的问题:php remove/identify this symbol �

Replacement Character

  

FFFD 替换字符

     

用于替换Unicode中

值未知或不可表示的传入字符

更新:

这是什么输出:

echo mb_detect_encoding($desc).' ';
var_dump($desc);

如果mb_detect_encoding不起作用

if(is_utf8($desc)) {
    echo "UTF-8 Encoded";
} else {
    echo "Oops, not UTF-8";
}

var_dump($desc);

function is_utf8($str) {
    $c=0; $b=0;
    $bits=0;
    $len=strlen($str);
    for($i=0; $i<$len; $i++){
        $c=ord($str[$i]);
        if($c > 128){
            if(($c >= 254)) return false;
            elseif($c >= 252) $bits=6;
            elseif($c >= 248) $bits=5;
            elseif($c >= 240) $bits=4;
            elseif($c >= 224) $bits=3;
            elseif($c >= 192) $bits=2;
            else return false;
            if(($i+$bits) > $len) return false;
            while($bits > 1){
                $i++;
                $b=ord($str[$i]);
                if($b < 128 || $b > 191) return false;
                $bits--;
            }
        }
    }
    return true;
}

答案 4 :(得分:0)

我在PHP 5.3和MS SQL 2008 R2上遇到了同样的问题。我没有使用强制转换(我觉得不满意),而是将驱动程序从ODBC切换到SQLSRV,这似乎工作得很好。