2011-02-10 67 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. ..... 

我這樣做了很多年。