【问题标题】:Passing data from controller to model将数据从控制器传递到模型
【发布时间】:2026-01-01 01:20:03
【问题描述】:

我无法使用 Codeigniter 将数据从我的控制器传递到我的模型。我在浏览器控制台上收到内部服务器错误,但已将其范围缩小到上述问题。

这是我的代码:

控制器

public function get_results() {
        $numOfDraws = $this->input->post('numOfDraws');
        $data = $this->lotto_model->get_results($numOfDraws);
        echo json_encode($data);
    }

型号

  public function get_results($numOfDraws)
        {
            $query = $this->db->query('SELECT * FROM lotto ORDER BY id DESC LIMIT "$numOfDraws"');
            return $query->result();
        }

如果我对LIMIT 进行硬编码,则查询成功。我知道$numOfDraws 等于控制器中的正确值。

谁能给点建议?

【问题讨论】:

  • 您是否尝试过在 $numOfDraws 周围不加引号?

标签: php mysql codeigniter


【解决方案1】:

首先,将变量注入字符串仅适用于双引号,不适用于单引号。其次,您当前的代码对 SQL 注入开放。

CodeIgniter 提供了防止这种情况发生的功能:

$query = $this->db->query('SELECT * FROM lotto ORDER BY id DESC LIMIT ?', array($numOfDraws));

【讨论】:

    【解决方案2】:

    您的查询是单引号,因此它不会解析变量,您生成的 SQL 字面意思是:

    SELECT * FROM lotto ORDER BY id DESC LIMIT "$numOfDraws"
    

    如果您想要更简洁的语法、抽象和更好的安全性,只需使用 CI 的“ActiveRecord”类:

    public function get_results($numOfDraws)
    {
        return $this->db
            ->limit($numOfDraws)
            ->order_by('id', 'DESC')
            ->get('lotto')
            ->result();
    }
    

    或者修复原始查询的一种方法:

    $query = $this->db
        ->query('SELECT * FROM lotto ORDER BY id DESC LIMIT '.(int) $numOfDraws);
    

    【讨论】:

    • 使用 Active Record,你能说出“规则/过滤器”的排序对结果有什么影响吗?假设$numOfDraws 等于 5,例如,上面看起来会先取表中的前 5 个条目,然后对它们进行排序 - 而不是先按 ID 排序,然后再取前 5 个。
    • 它只是一个查询生成器,顺序无关紧要,只要您最后调用get()
    【解决方案3】:

    试试这个--

            $query = $this->db->query("SELECT * FROM lotto ORDER BY id DESC LIMIT $numOfDraws");
            return $query->result();
    

    【讨论】: