【问题标题】:how to Read 10000+ bytes[] of binary data from DataBase?如何从数据库中读取 10000+ bytes[] 的二进制数据?
【发布时间】:2013-10-05 04:40:11
【问题描述】:

我有一张包含公司徽标的表格....每当我读取像 4096 字节这样的小图像时,它工作得很好,但我无法读取 10000 字节强大>在 php.ini 中。 它是从数据库中读取的 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) ����

我在浏览器上收到此错误:

【问题讨论】:

  • @PatrickEvans,实际上是另一个人在.NET 上使用的同一列和数据 ....它工作正常...所以,我不这么认为,这是数据的问题..对于同一列另一条大小为 4088 的记录可以正常工作。但是对于没有出现在 10000 大小的 PHP 代码上的列...我认为,我必须增加 php 大小限制。但如何......我不知道。
  • 我在使用 MsSql。我的数据是图像的二进制数组。我正在调用数据并在 url 上显示....对于拥有 3000 个数据大小的人来说,代码可以正常工作。不能超过 10000 个数据大小。
  • @PatrickEvans:我认为问题不是,数据库上有多少字节存储...问题是从数据库中检索时...最近的 4096 大小的数据可以赶上 PHP 代码仍然没有出现数据。那么,我们如何检索或增加 php 内存大小。
  • @PatrickEvans:那么问题是什么?
  • @Jignesh.Raj,你说你的 logo 的列类型是 BINARY,从我看到的来源来看,BINARY 只能保存最大 8000 字节,所以如果你尝试存储大于该字段中的 8 KB 会将数据截断为 8000 字节,其余部分会丢失。您和 Kvadiyatar 提到了增加 PHP 内存大小,但这并不重要,因为您没有收到 Exceeded Memory Limit 错误

标签: php codeigniter cakephp codeigniter-2 codeigniter-url


【解决方案1】:

我认为这是使用 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 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());

【讨论】:

  • 我在 php.ini 和 php 代码中都试过了,但只有 4096 个字节
  • 嗨,我的方法成功了,这是一个驱动程序问题
  • 原来是微软的驱动?
  • 感谢您花时间为我 50+
【解决方案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);

        }

【讨论】:

    【解决方案3】:

    首先。不要使用 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);  
            }
        }
    

    【讨论】:

    • 感谢重播,但问题相同,我从数据库中获取 4096 字节
    • 是否有不能将数据存储为 BLOB 的原因?
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多