2011-02-10 29 views
3

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

有问题的字段,称为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)类型)。但是,如果(例如)description字段包含“这是一个测试”,那么$desc将导致“ $ime ”,它将被转储到textarea控件中,而不是存储在数据库中的内容。

我已经遍寻搜索,发现这个问题还没有解决方案,但它听起来像一个PHP本身的错误,虽然我不确定。


更新

我使用SQL服务器查询来更新VARCHAR值。我试图把在一个很长的字符串,我得到这个:

�,ime�������stringDayToInt��É������à‰,���N={��������������������������������������������� 

“stringDayToInt”是我写的一个PHP函数的名称,生活在一个完全不同的文件,该文件得到了纳入我想出来的页面。非常奇怪。

+0

一般评论 - 总是最好通过$ _GET/$ _POST过滤/清理任何输入。直接传递给DB引擎可能是不安全的,这取决于你的prog的使用上下文。 – trickwallett 2011-02-10 16:49:07

+0

@trickwallett - 是的,这绝对是一个很好的建议。对于这个项目来说幸运的是,由于应用程序的范围和一般性质,我们并不需要担心。 – 2011-02-10 17:02:50

回答

0

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

Replacement Character

FFFD替换字符

用于代替进入的字符,其值是Unicode中未知的或不可表示

UPDATE :

这是什么输出:

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; 
} 
+0

这不是问题。数据库字段中只有基本的ASCII字符。在途中有东西被损坏。 – 2011-02-10 16:24:38

+0

我建议你在MS输入怪异甚至隐藏的字符时对返回值做一个var_dump。 echo“|”。$ desc。“|”;寻找空格,这将表明回车或什么。 – 2011-02-10 16:51:20

+0

你能发布数据库字段描述的值吗? – 2011-02-10 16:55:38

3

我有同样的问题,丑在PHP 5.3 ...

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

SQL服务器: MS SQL Server 2008 R2的

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

我的PHP版本: PHP 5.3

我一直在寻找但是我没有找到解决方案。
解决方法我想和工作对我来说是:

select cast(the_column_varcharmax as text) as column_name from table_name 

试试吧,我希望它为你的作品。

1

这是一个已知的bug在PHP中。

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

0

我对PHP 5.3和MS SQL 2008 R2有同样的问题。而不是解决方案(我不觉得满意),我将驱动程序从ODBC切换到SQLSRV,这似乎工作得很好。

2

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

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

我这样做了很多年。

相关问题