使用PHP';s odbc以获取varchar(max)列

使用PHP';s odbc以获取varchar(max)列,php,sql-server-2008,varchar,Php,Sql Server 2008,Varchar,我正在为一个类项目创建一个PHP网站,我们正在使用MS SQL Server 2008数据库填充该网站上的字段。但是,其中一个字段将垃圾输出到页面上,而不是实际存储在数据库中的内容 该字段称为description,是varchar(MAX)字段;存储过程查询数据库中的元组,并将其表中的值转储到页面上的文本框中;description字段被输出到textarea控件 以下是处理从数据库中提取信息的PHP: $res = odbc_exec($dbhandle, "exec dbo.usp_Pro

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

该字段称为
description
,是
varchar(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)
)。但是,如果(例如)
说明
字段包含“这是一个测试”,则
$desc
将导致”�$输入法�����", 这是转储到
textarea
控件中的内容,而不是存储在数据库中的内容

我已经搜索了所有地方,还没有找到这个问题的解决方案,尽管这听起来像是PHP本身的一个bug,尽管我不确定


更新

我正在使用SQL Server查询更新varchar值。我尝试输入一个很长的字符串,结果是:

�,ime�������stringDayToInt��É������à‰,���N={���������������������������������������������
“stringDayToInt”是我编写的一个PHP函数的名称,它位于一个完全不同的文件中,该文件包含在我正在尝试的页面中。非常奇怪。

也有类似的问题:

FFFD� 替换字符

用于替换在Unicode中值未知或不可表示的传入字符

更新:

这个输出是什么:

echo mb_detect_encoding($desc).' ';
var_dump($desc);
如果mb_检测_编码不起作用

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;
}
if(is_utf8($desc)){
回波“UTF-8编码”;
}否则{
echo“Oops,而不是UTF-8”;
}
var_dump($desc);
函数为_utf8($str){
$c=0;$b=0;
$bits=0;
$len=strlen($str);
对于($i=0;$i 128){
如果($c>=254))返回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;
否则返回false;
if(($i+$bits)>$len)返回false;
而($bits>1){
$i++;
$b=ord($str[$i]);
如果($b<128 | |$b>191)返回false;
美元比特--;
}
}
}
返回true;
}

我在PHP5.3上遇到了同样的问题…

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

SQL Server: MS SQL Server 2008 R2

我的odbc连接驱动程序: 驱动程序={SQL Server本机客户端10.0}

我的PHP版本: PHP5.3

我环顾四周,但没有找到解决办法。
我尝试并为我工作的变通方法是:

select cast(the_column_varcharmax as text) as column_name from table_name
试试看,我希望它对你有用。

这是一个众所周知的PHP语言


要么编译您自己的补丁版本,要么使用上面的解决方法。

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

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

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

我这么做已经很多年了。

这不是问题所在。数据库字段中只有基本的ASCII字符。在过去的过程中有些东西被破坏了。我建议您在MS输入奇怪甚至隐藏的字符时对返回值进行var_转储。echo“|”。$desc|"; 请查找空格,这表示回车或其他内容。是否可以从数据库字段描述中发布值?字段中的值正好是“这是一个测试”<代码>变量转储给出
字符串(14)“ime”
<代码>回显只需打印“ime”。好的建议。(这条评论去掉了垃圾箱字符,但它们仍然存在于我的php页面上。)嗯,我发现这很有趣:你在使用什么ODBC?可能还不支持varchar(max)。您是否有机会更改数据类型并查看它是否正常工作?喜欢使用一般注释-最好通过$\u GET/$\u POST等过滤/清理任何输入。根据您的程序的使用上下文,将其直接传递到DB引擎可能不安全。@trickwallett-是的,这绝对是一个好建议。幸运的是,对于这个项目,由于应用程序的小范围和一般性质,我们不需要担心它。这是一个ODBC驱动程序在行为上的重大改变,它强制使用该驱动程序更改客户端工具。不同的ODBC驱动程序(如)不会出现相同的问题。从ODBC更改为SQLSRV会将PHP从DBMS不可知更改为DBMS特定。不同的ODBC驱动程序,例如,不会出现相同的问题,因此我建议更改ODBC驱动程序作为更好的选择。在我的例子中,我使用了
CONVERT(VARCHAR(longervalue),column)
所以谢谢你,这让我发疯了!无法理解为什么结果会被完全删除。说明:该列在
VARCHAR(30)
中存储带重音字符的字符串。出于某种原因,通过PDO ODBC连接,如果长度正好为30且数据具有特殊字符,则会删除结果。使用
CONVERT(VARCHAR(40),column)
解决了我的问题。现在,要了解为什么PHP cli返回重音,而apache字符串需要转换。。。