通过 Fat Free Framework SQL 数据映射器检索 BYTEA

Posted

技术标签:

【中文标题】通过 Fat Free Framework SQL 数据映射器检索 BYTEA【英文标题】:BYTEA retrieval via Fat Free Framework SQL data mapper 【发布时间】:2015-11-11 15:49:20 【问题描述】:

我正在尝试使用 Fat Free Framework 中的 \DB\SQL\Mapper 从 PostgreSQL 数据库中检索存储的二进制数据 (bytea)。

但是由于某种原因,除了“资源 ID”字符串之外,我似乎什么也得不到。例如。

    // Establish database communication
    $this->db = new \DB\SQL(
        $f3->get("database.type") .
        ":host=" . $f3->get("database.host") .
        ";port=" . $f3->get("database.port") .
        ";dbname=" . $f3->get("database.name"),
        $f3->get("database.user"),
        $f3->get("database.password"),
        array(
            \PDO::ATTR_PERSISTENT => TRUE,
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
        )
    );

    // Firmware Object-Relational-Mapper
    $this->firmware = new \DB\SQL\Mapper(
        $this->db,
        "firmware"
    );

    // Selection parameters 
    $this->select = array(
          "id=:id",
          ":id" => array(
              $f3->get("PARAMS.id"),
              \PDO::PARAM_INT
          )
    );

    // Map to record
    $this->firmware->load($this->select);

    // Error: expects parameter 1 to be resource, string given
    // $this->firmware->binary is "Resource id #23"
    fpassthru($this->firmware->binary); 

但是,如果我对 \DB\SQL PDO 类执行准备好的语句,我可以毫无问题地检索二进制数据。即

    $record = $this->db->exec(
        'SELECT "binary" FROM "firmware" WHERE id=?',
         $f3->get("PARAMS.id")
    );

    fpassthru($record[0]['binary']); //spits out the binary data

所以我的问题是;有没有办法在仍然在 Fat Free 中使用 ORM 的同时从表中检索二进制数据?

【问题讨论】:

【参考方案1】:

我认为这是因为应用了here 的类型转换。 ORM 可能无法在 PostgreSQL 中为您的二进制字段找到正确的 pdo 类型。

您可以尝试像这样覆盖它:

$this->firmware = new \DB\SQL\Mapper(
   $this->db,
   "firmware"
);       
$schema = $this->firmware->schema();
$schema['binary']['pdo_type'] = \PDO::PARAM_LOB;
$this->firmware->schema($schema);

可能您还需要调整db->value method 并添加默认情况,它只返回输入的内容,因此该值通过return $val 传递。

【讨论】:

很好,覆盖模式并在开关中添加一个案例解决了它。虽然我添加了 case \PDO::PARAM_LOB: return $val; 而不是默认情况 只是补充一下,我还修改了github.com/bcosca/fatfree-core/blob/master/db/sql.php#L86 .i.e. case 'bytea' : return \PDO::PARAM_LOB;

以上是关于通过 Fat Free Framework SQL 数据映射器检索 BYTEA的主要内容,如果未能解决你的问题,请参考以下文章

Fat Free PHP SEO 友好的 URL

Robot framework学习笔记

Zend Framework和SQL Server

Apple Framework ISA Classicifications

连接字符串 C# Entity Framework SQL Server Express

生产上数据库大量的latch free 导致的CPU资源耗尽的问题的解决