PHP is truncating MSSQL Blob data (4096b), even after setting INI values. Am I missing one?

雨燕双飞 提交于 2019-11-26 23:31:16

问题


I am writing a PHP script that goes through a table and extracts the varbinary(max) blob data from each record into an external file. The code is working perfectly (I used virtually the same code to go through some images) except when a file is over 4096b - the data is truncated at exactly 4096.

I've modified the values for mssql.textlimit, mssql.textsize, and odbc.defaultlrl without any success.

Am I missing something here?

<?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>");
     }
 } 
?>

OUTPUT

Trying ... projectPhotos/docs/file1.pdf Done (4096)

Trying ... projectPhotos/docs/file2.zip Done (4096)

Trying ... projectPhotos/docsv3.pdf Done (4096)

etc..


回答1:


Instead of setting odbc.defaultlrl to 0, try setting it to an actual value instead:

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



回答2:


If you're using mssql (freetds), look in /etc/freetds.conf for a setting called "text size". Mine was set to 64512 and that's exactly what my images were being truncated to. I set it to 5MB (5242880) and it's working like a charm now.

text size = 5242880



回答3:


According to this comment in the manual, you must set the INI settings before connecting, which does not seem to be your case.




回答4:


I know this is ancient, but I solved this differently. ini_set does not wok for mssql.textlimit or mssql.textsize, this is documented on php.net.

Both of these default to 4096b (4k) in the php.ini file. Reset these to a higher value and it will work fine.

Dont forget to restart httpd service after.



来源:https://stackoverflow.com/questions/4500506/php-is-truncating-mssql-blob-data-4096b-even-after-setting-ini-values-am-i-m

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!