2013-10-05 60 views
2

我有一张表包含公司的徽标....每当我读取像4096字节小图像它完美的作品,但我不能读取10000字节在PHP中。 列Lenth在SQL: enter image description here如何从DataBase中读取10000+字节的二进制数据[]?

我在型号代码

function GetLogoById($Id) 
    { 

     $this->load->database(); 
      mssql_query("SET TEXTSIZE 2147483647"); 

    // or use CI's active record 
    $this->db->query("SET TEXTSIZE 2147483647"); 
     $query = $this->db->query("EXEC GetLogoById '$Id'"); 
     $result = array(); 
     foreach ($query->result() as $row) 
     { 
      $result[] = array("Logo"=> $row->Logo); 
     } 

     return $result; 
    } 

我的控制器代码: 它是从数据库

更新只读4096字节

public function GetLogoById() 
    { 

     parse_str($_SERVER['QUERY_STRING'],$_GET); 
     $Id = $_GET['Id']; 
     $this->load->model('MyModel'); 
     $result = $this->MyModel->GetLogoById($Id); 
     header('Content-type: image/png'); 
     echo $result[0]['Logo']; 

    } 

我只得到4096个字节,如:(string:4096) ����

我收到此错误的浏览器: enter image description here

+0

@PatrickEvans,实际上同一列和另一人正在使用.NET数据....,它的做工精细...所以,我不这么认为,它与data..for同一列的问题,它有4088再创纪录大小它工作正常。但对于不具有10000大小的PHP代码的列...我想,我必须增加php的大小限制。但是......我不知道。 –

+0

什么是您的DBMS? –

+0

我使用MsSql。我的数据是图像的二进制数组。我打电话给数据,并显示在网址....代码工作正常,谁有3000数据大小。不能工作更多的10000个数据大小。 –

回答

2

sqlsrv司机下车溶液)

function GetLogoById($Id) 
     { 

      $serverName = "XXXXX"; 
      $uid = "XXXXXX"; 
      $pwd = "XXXXXX"; 

      $connectionInfo = array("UID"=>$uid, 
        "PWD"=>$pwd, 
        "Database"=>"XXXXXX"); 
      $conn = sqlsrv_connect($serverName, $connectionInfo); 
      $tsql = "select Logo from TableName where Id = '$Id'"; 
      $stmt = sqlsrv_query($conn, $tsql); 
      if($stmt === false) 
      { 
       echo "Error in query preparation/execution.\n"; 
       die(print_r(sqlsrv_errors(), true)); 
      } 
      /* Retrieve each row as an associative array and display the results.*/ 
      while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 
      { 
       return $row; 
      } 
      /* Free statement and connection resources. */ 
      sqlsrv_free_stmt($stmt); 
      sqlsrv_close($conn); 

     } 
0

第一。不要使用DBMS来存储图像。相信我。

其次,不要使用DMBS存储影像.....

现在,如果你是从模型中得到一个$ ID,为什么循环的代码,返回数组?那种打败了ID的目的?

我认为标志数据是以BLOB的形式存储的?

如果是这种模式可能是情况是这样的:

$query = $this->db->get_where('tablename',array('id' => $id)); 
if ($query->num_rows() == 1) 
{ 
    return $query->first_row()->logo 
} 
else 
{ 
    return FALSE; 
} 

那么控制器代码可能是这样的:

public function GetLogoById($id) 
    { 
     $this->load->model('MyModel'); 
     if($logo = $this->MyModel->GetLogoById($id)) 
     { 
      $this->output->set_content_type('image/png'); 
      $this->output->set_output($logo); 
     } 
    } 
+0

感谢重播,但问题是相同的我从数据库中获得4096字节 –

+0

是否有一个原因,您不能将数据存储为BLOB? – pgee70

2

我认为这是利用MSSQL,其中数据问题存储在文本类型列中的字符在4096个字符后被无意中截断。

增加要从SQL Server返回的文本列的最大大小。你可以用下面的SQL查询做到这一点:

SET TEXTSIZE 2147483647 

您可以用下面的PHP运行它,运行它,你建立连接之后:

mssql_query("SET TEXTSIZE 2147483647"); 

// or use CI's active record 
$this->db->query("SET TEXTSIZE 2147483647"); 

而另一种方式来解决问题是要改变php.ini文件中的“textlimit”和“TEXTSIZE”设置,如下所示:

mssql.textlimit = 2147483647 
mssql.textsize = 2147483647 

请参阅本SO回答Why TEXT column returns only 4096 bytes?这是指SQL Server, PHP and Truncating Text

更新:经进一步审查,阅读this PHP bug,您可能希望使用PDO_ODBC连接MSSQL服务器,而不是尝试:

//$dsn = 'mssql:host=MYBOX;dbname=testdb'; 
$dsn = 'odbc:DRIVER={SQL Server};SERVER=MYBOX;DATABASE=testdb;'; 

也可以尝试设置TEXTSIZE以兆字节:

$sql = "SET TEXTSIZE 3145728"; // 3 Megabytes 
mssql_query($sql, $db) or die(mssql_get_last_message()); 
+0

我都尝试,但没有工作:( –

+0

您是否获得了同样的错误? – doitlikejustin

+0

我试过两侧的php.ini和PHP代码,但只拿到了4096个字节 –

相关问题