用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3356|回复: 1
收起左侧

[数据库] 2.0版本数据库操作的一个bug

[复制链接]
发表于 2011-6-7 22:10:34 | 显示全部楼层 |阅读模式
在CI2.0中,如果把数据库结果集,既使用$this->db->query()或$this->db->get()返回的结果,转存为xml,当数据库为mysql或mysqli的方式,xml结果正常。如果使用sqlite数据库,则结果异常。代码如下:
XML复制代码
        <element>
                <0>1</0>
                <askid>1</askid>
                <1>你最讨厌的食物是</1>
                <asktxt>你最讨厌的食物是</asktxt>
        </element>
        <element>
                <0>2</0>
                <askid>2</askid>
                <1>你最讨厌的人是</1>
                <asktxt>你最讨厌的人是</asktxt>
        </element>
复制代码

而正常的格式应该如下:
XML复制代码
<element>
                <askid>1</askid>
                <asktxt>你最讨厌的食物是</asktxt>
        </element>
        <element>
                <askid>2</askid>
                <asktxt>你最讨厌的人是</asktxt>
        </element>
复制代码

仔细查看了DB_Utitlity.php的代码,发现CI的xml_from_result()函数设计有误,不知道是否是笔误。以前也未用到这个功能,不知道以往版本是否也是这样。
问题出在272行“foreach ($query->result_array() as $row)”这句(我的代码稍有改动,可能与您的行数不同。)。CI可以返回result()和result_array()两种格式的结果集,一个是对象类型,一个是关联数组类型。函数已经设定“if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))”的前提,但是在foreach中,使用result_array()就值得商榷了。mysql和mysqli正常,是因为mysql能自动判别输出类型,但显然,这是小型数据库sqlite所不具备的,于是就出现了上面所出现的情况。
改动方法很简单,把result_array()改成result()就正常了。

评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

发表于 2011-8-27 14:41:52 | 显示全部楼层
还没用到这部分功能。先收藏了。

本版积分规则