Codeigniter 活动记录类错误与 MySQL 原始查询

Posted

技术标签:

【中文标题】Codeigniter 活动记录类错误与 MySQL 原始查询【英文标题】:Codeigniter Active Record Class Error vs MySQL Raw Query 【发布时间】:2016-04-06 18:58:18 【问题描述】:

在我的 Model 中,我使用 MySQL raw query

编写了这个函数
function get_question_result($lr_id)

    $raw_query = 'SELECT question_record.qr_id, LEFT(question.question, 50) as question,
                    question.correct_answer
                    FROM question_record
                    INNER JOIN question ON question.q_id = question_record.q_id
                    WHERE question_record.lr_id = '.$lr_id.' ';
    $query = $this->db->query($raw_query);
    $questionresult = $query->result_array();
    return $questionresult;

工作很好。它给了我想要的数组。我继续我的项目。

然后我突然很想在 CI Active Record Class 中尝试一下。

function get_question_result($lr_id)

    $this->db->select('question_record.qr_id, LEFT(question.question, 50) as question, question.correct_answer');
    $this->db->from('question_record');
    $this->db->join('question', 'question.q_id = question_record.q_id', 'inner');
    $this->db->where('question_record.lr_id', $lr_id);
    $result = $this->db->get()->result_array();
    return $result;

没有用。它给了我这个错误

php Fatal error:  Call to a member function result_array() on a non-object 

只是出于好奇,我哪里做错了? 是我写错了还是 Active Record 的结果数据结构不一样?

因为当我在 Active Record 中再次尝试时没有选择这个字段

LEFT(question.question, 50) as question

有效,但它没有提供我想要的领域。你们知道为什么吗?

【问题讨论】:

【参考方案1】:

在您的$this->db->select() 调用中,您需要将FALSE 作为第二个参数传递,以便活动记录不会尝试在选择语句中为您的列添加反引号`

function get_question_result($lr_id)

    $this->db->select('question_record.qr_id, LEFT(question.question, 50) as question, question.correct_answer',FALSE);
    $this->db->from('question_record');
    $this->db->join('question', 'question.q_id = question_record.q_id', 'inner');
    $this->db->where('question_record.lr_id', $lr_id);
    $result = $this->db->get()->result_array();
    return $result;
 

根据文档

$this->db->select() 接受可选的第二个参数。如果你设置 它为 FALSE,CodeIgniter 不会尝试保护您的字段或表 带有反引号的名称。如果您需要复合选择,这很有用 声明。

$this->db->select();

【讨论】:

我试过了,效果很好!我通常忽略第二个参数。这解释了为什么当我使用复合选择查询时 Active Record 大多不起作用。所以这毕竟只是我的错。非常感谢@MKhalidJunaid!

以上是关于Codeigniter 活动记录类错误与 MySQL 原始查询的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter 活动记录,生成,但不执行查询

codeigniter 查询生成器和活动记录 sql 注入

如何在 CodeIgniter 中获取活动记录插入的结果

如何在codeigniter活动记录中使用select插入记录

使用 codeigniter 活动记录获取单个字段输出的值

协同点火器;活动记录类