在Zend Framework中转义字段名称中的点

时间:2014-06-10 13:28:56

标签: php mysql zend-framework escaping

我在使用Zend 1.11.3编写查询时遇到问题。我无法获得名称中包含点的字段。由于我无法编辑表格,所以我试图逃避名称,但没有成功。

我的代码如下:

<?php

class RoomsTable extends Zend_Db_Table_Abstract {

    ...

    function getRecord($id)
    {
        $fields = array(
            'id' => 'id',
            ...
            'attrib.floor' => 'attrib.floor',
            ...
        ); 

        $Select = $this->select()
        ->from($this->_name, $fields)
        ->where('id = ?',$id);

        $list = $Select->query()->fetchAll();
    }
}
?>

我打电话的时候:

$rooms_table = new RoomsTable();
$first_room = $rooms_table->getRecord(1);

我明白了:

Zend_Db_Table_Select_Exception: Select query cannot join with another table

因此,attrib.floor字段被解释为尝试从另一个表中获取字段,而它是该表中的实际字段名称。

我尝试了以下但没有成功:

'attrib\.floor' => 'attrib\.floor',

'`attrib.floor`' => '`attrib.floor`',

'"attrib.floor"' => '"attrib.floor"',

有人知道怎么逃避这个点,所以Zend允许我进入那个领域吗?

1 个答案:

答案 0 :(得分:3)

评论中的

http://framework.zend.com/issues/browse/ZF-953

  

包含点(&#34;。&#34;)字符的标识符会自动分割在点上,并且每个部分都会单独引用。因此,标识符支持&#34; schema&#34;。&#34; table&#34;或&#34;表&#34;。&#34;列&#34;语法。

     

如果您的数据库设计具有包含点字符的表名或列名,则这应该是非常罕见的情况,不建议这样做。但是你可以使用Zend_Db_Expr解决它并自己引用标识符。

http://framework.zend.com/apidoc/1.9/Zend_Db/Expr/Zend_Db_Expr.html

因此,在这种情况下,编写字段的正确方法是:

'attrib.floor' => new Zend_Db_Expr('`attrib.floor`')