PDO :: FetchAll方法覆盖使其失败

时间:2018-01-25 13:48:56

标签: php pdo firebird php-7

我正在使用设置为MainActivity的字符集的Firebird数据库,这使得PDO连接编码根本不起作用,因此我必须使用代码自行编码/解码所有数据。

所以我所做的是覆盖NONE类并覆盖PDOStatementbindValue()方法,以便有选择地自动编码/解码数据,如下面的代码段所示,它很有效,但是我遇到了一个问题,每当我尝试覆盖它返回的fetch()方法时fetchAll() 即使我根本没有对它做任何改动。

NULL

上面的代码按预期工作,但下面的覆盖示例(进行任何更改)永远不会起作用,如果我只是删除覆盖脚本再次工作。

我试图寻找public function bindValue($parameter, $value, int $data_type = PDO::PARAM_STR) { if(DB_GLOBAL_UTFENCODING && $data_type == PDO::PARAM_STR) $value = mb_strtoupper(utf8_decode($value)); return parent::bindValue($parameter, $value, $data_type); } public function fetch(int $fetch_style = null, int $cursor_orientation = PDO::FETCH_ORI_NEXT, int $cursor_offset = 0) { if(DB_GLOBAL_UTFENCODING && $fetch_style == PDO::FETCH_ASSOC ) { $row = parent::fetch($fetch_style, $cursor_orientation, $cursor_offset); if(!$row) return false; array_walk_recursive( $row, function (&$value) { $value = utf8_encode($value); } ); return $row; } else return parent::fetch($fetch_style, $cursor_orientation, $cursor_offset); } 源代码,但我找不到可能出现的问题。

如果某人有解决我的编码问题的方法,即使通过其他方式,我也很乐意尝试。

fetchAll

这个片段下面是我试图覆盖它的尝试之一。

public function fetchAll(int $fetch_style = null, $fetch_argument = null, array $ctor_args = array()) {
    return parent::fetchAll($fetch_style, $fetch_argument, $ctor_args);
}

1 个答案:

答案 0 :(得分:0)

我想通了,看起来PHP:PDOStatement->fetchAll方法如果传递未使用的参数就不会感到高兴,我已经完成了它,就像下面的代码片段一样,它可以工作。

public function fetchAll(int $fetch_style = null, $fetch_argument = null, array $ctor_args = array()) {
    return parent::fetchAll($fetch_style);
}

我作为最终解决方案做了什么,所以我的覆盖不破坏标准用途是检查这些参数是否是他们的默认值。

public function fetchAll(int $fetch_style = null, $fetch_argument = null, array $ctor_args = array()) {

    if(DB_GLOBAL_UTFENCODING && $fetch_style == PDO::FETCH_ASSOC )
    {
        $rows = parent::fetchAll($fetch_style);

        foreach ($rows as $key => $row) {
            array_walk_recursive(
                                $row, function (&$value) {
                                    $value = utf8_encode($value);
                                }
                        );
            $rows[$key] = $row;
        }

        return $rows;

    }
    else
    {
        if ($fetch_argument !== null)
            return parent::fetchAll($fetch_style, $fetch_argument);
        else if ($fetch_argument !== null && $ctor_args == array())
            return parent::fetchAll($fetch_style, $fetch_argument, $ctor_args);
        else
            return parent::fetchAll($fetch_style);
    }
}