即使在设置INI值之后,PHP也会截断MSSQL Blob数据(4096b)。我错过了吗?

时间:2010-12-21 14:51:18

标签: sql blob php truncation

我正在编写一个PHP脚本,该脚本通过一个表并将每个记录中的varbinary(max) blob数据提取到外部文件中。代码工作正常(我使用几乎相同的代码来浏览一些图像),除非文件超过4096b - 数据被截断为4096。

我修改了mssql.textlimitmssql.textsizeodbc.defaultlrl的值,但没有成功。

我在这里错过了什么吗?

<?php 
 ini_set("mssql.textlimit" , "2147483647");
 ini_set("mssql.textsize" , "2147483647");
 ini_set("odbc.defaultlrl", "0");

 include_once('common.php'); //Connection to DB takes place here.
 $id=$_REQUEST['i'];
 $q = odbc_exec($connect, "Select id,filename,documentBin from Projectdocuments where id = $id"); 
 if (odbc_fetch_row($q)){

  echo "Trying $filename ... ";
  $fileName="projectPhotos/docs/".odbc_result($q,"filename");

  if (file_exists($fileName)){
   unlink($fileName);
  } 

     if($fh = fopen($fileName, "wb")) {
      $binData=odbc_result($q,"documentBin");
         fwrite($fh, $binData) ;
         fclose($fh);
         $size = filesize($fileName);
         echo ("$fileName<br />Done ($size)<br><br>");
     }else {
      echo ("$fileName Failed<br>");
     }
 } 
?>

输出

  

尝试... projectPhotos / docs / file1.pdf   完成(4096)

     

尝试... projectPhotos / docs / file2.zip完成(4096)

     

尝试......   projectPhotos / docsv3.pdf完成(4096)

     

等。

4 个答案:

答案 0 :(得分:12)

不要将odbc.defaultlrl设置为0,而是尝试将其设置为实际值:

ini_set("odbc.defaultlrl", "100K");

答案 1 :(得分:5)

如果您正在使用mssql(freetds),请在/etc/freetds.conf中查找名为&#34;文本大小&#34;的设置。我的设置为64512,这正是我的图像被截断的原因。我把它设置为5MB(5242880),它现在就像一个魅力。

text size = 5242880

答案 2 :(得分:1)

根据this comment in the manual,您必须在连接之前设置INI设置,这似乎不是您的情况。

答案 3 :(得分:1)

我知道这很古老,但我解决了这个问题。 ini_set不适用于mssql.textlimit或mssql.textsize,这在php.net上有记录。

这两个默认为php.ini文件中的4096b(4k)。将这些重置为更高的值,它将正常工作。

不要忘记重新启动httpd服务。