从S3加载数据错误地返回了Codeigniter查询方法中的错误

时间:2018-08-31 14:14:31

标签: codeigniter amazon-s3

我正在AWS上托管一个Codeigniter应用程序,并且该应用程序中的一种方法正在运行

"LOAD DATA FROM S3 'S3 path' ... "

这与LOAD DATA INFILE查询基本相同,但在AWS Aurora中进行了自定义,以从S3而非本地卷读取文件。查询按预期执行,但CI为

$this->db->error()

返回一个数组,指示发生错误。该数组的内容为

[0, '']

首先,我认为这是一个超时,但是在减小了要导入文件的大小并确保记录已导入之后,我开始怀疑CI的DB驱动程序并非旨在处理该查询的结果。 该查询实际上并没有返回任何数据,我想这会混淆CI。

在不更改框架“源代码”的情况下,有什么好的方法绕过CI中的这种行为吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我意识到,由于名为MySQLi的数据库驱动程序类将以下内容返回到模型中的$this->db实例(请参见errnoerror属性)

[_mysqli:protected] => mysqli Object
    (
        [affected_rows] => 1
        [client_info] => mysqlnd 5.0.12-dev - 20150407 - $Id: b382534eeb34d9ed79345235b8bae2234b287afcs21ad4e $
        [client_version] => 50012
        [connect_errno] => 0
        [connect_error] => 
        [errno] => 0
        [error] => 
        [error_list] => Array
            (
            )

除了mysql_errnomysql_error返回给驱动程序的信息之外,我将永远不会获得有关该错误的更多信息。因此,如果错误检查这样的查询

if($this->db->error())
{
    return false;
}

我可以简单地做到这一点

if(is_array($this->db->error()) && 0 !== $this->db->error()[0])
{
    return false;
}

错误以数组格式返回,或者从$this->db->error()返回false,因此检查错误代码是否为零非常简单。如果为零,我们可以假设查询按计划执行并且导入已完成。 我们从$ this-> db-> error()获得数组而不是false的原因是CI期望的查询没有返回结果。

所以...毕竟是一个简单的解决方案。