我正在使用设置为MainActivity
的字符集的Firebird数据库,这使得PDO连接编码根本不起作用,因此我必须使用代码自行编码/解码所有数据。
所以我所做的是覆盖NONE
类并覆盖PDOStatement
和bindValue()
方法,以便有选择地自动编码/解码数据,如下面的代码段所示,它很有效,但是我遇到了一个问题,每当我尝试覆盖它返回的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);
}
答案 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);
}
}