2

我有一张包含公司徽标的表....每当我读取像4096 字节这样的小图像时它工作得很好,但我无法读取 php 中的10000 字节。它仅从数据库中读取4096 个字节

更新: Sql 中的列长度: 在此处输入图像描述

我的模型代码

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

我的控制器代码:

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) ����

我在浏览器上收到此错误: 在此处输入图像描述

4

3 回答 3

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 答案为什么 TEXT 列仅返回 4096 字节?它指的是SQL Server、PHP 和截断文本

更新:经过进一步审查,阅读此 PHP 错误,您可能想尝试使用PDO_ODBC连接到 MSSQL Server:

//$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());
于 2013-10-07T18:41:34.830 回答
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);

        }
于 2013-10-09T09:23:52.307 回答
0

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

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

现在,如果你从模型中得到一个 $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);  
        }
    }
于 2013-10-07T11:06:01.873 回答