我无法使用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
等于控制器中的正确值。
任何人都可以提供建议吗?
答案 0 :(得分:4)
首先,对字符串的变量注入仅适用于双引号,而不是单引号。其次,您当前的代码对SQL注入是开放的。
CodeIgniter提供了防止这种情况的功能:
$query = $this->db->query('SELECT * FROM lotto ORDER BY id DESC LIMIT ?', array($numOfDraws));
答案 1 :(得分:3)
您的查询是单引号,因此它不会解析变量,您生成的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);
答案 2 :(得分:1)
试试这个 -
$query = $this->db->query("SELECT * FROM lotto ORDER BY id DESC LIMIT $numOfDraws");
return $query->result();