我编写了一个SQL查询来找到我的项目所需的输出。我使用正确的输出正常工作。但是突然之间它开始产生错误,并且在SQL查询中,还有一些额外的aapaophoph。如何解决?
我试图将查询添加到$this->db->query();
,但仍然没有用。
public function getStudentConut($id) {
$this->db->select('students.id')
->from('students')
->join('bp','students.pbp = bp.id','left')
->where(condition 1)
->where(condition 2);
$query1 = $this->db->get_compiled_select();
$this->db->select('students.id')
->from('students')
->join('bp','students.dbp = bp.id','left')
->where(condition 1)
->where(condition 2);
$query2 = $this->db->get_compiled_select();
$this->db->select('COUNT(id) as stud_count')
->from('('.$query1." UNION ALL ".$query2.') X')
->group_by('X.id');
$results = $this->db->get();
return $results->num_rows();
}
它早些时候给出了正确的计数。但是没有任何新的变化,它开始出现错误。
现在我得到了错误:
您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以在第2行的'。
id`` WHERE ``bp
。some_value`` IS NULL AND ``students
。`schoo'附近使用正确的语法SELECT COUNT(id)as stud_count FROM(SELECT
students
。id`` FROM ``students`` LEFT JOIN ``bp`` ON ``students
。pbp`` = ``bp
。id`` WHERE ``bp
..其他一些条件。。UNION ALL SELECT {{1} }学生id
.
学生FROM
bpLEFT JOIN
学生ON
dbp.
bp=
id.
X..some other condition....) X GROUP BY
id`
答案 0 :(得分:0)
我认为问题(至少对于double而言)是CodeIgniter在子查询等方面不是很好。基本上,每次获取编译的select语句时,它已经具有转义标识符,然后将其放在from语句的末尾,这将在其之上添加其他转义标识符。
`->from('('.$query1." UNION ALL ".$query2.') X')`
不幸的是,与set
之类的其他方法不同,from
没有第二个参数可以让您将转义设置为false(这是我认为您需要的)。
我建议尝试以下方法:
$this->db->_protect_identifiers = FALSE;
$this->db->select('COUNT(id) as stud_count')
->from('('.$query1." UNION ALL ".$query2.') X')
->group_by('X.id');
$results = $this->db->get();
$this->db->_protect_identifiers = TRUE;
并查看以下内容:->where(condition 2);
我很确定由于缺少引号而不应该编译。您可能不希望逃脱,因此可以按照https://www.codeigniter.com/user_guide/database/query_builder.html#CI_DB_query_builder::where
->where('condition 2', '', false);
当所有其他方法均失败时,只知道CodeIgniter在“高级”查询中存在一些局限性,也许您应该使用$this->db->escape_str(...)
来将其手动写成字符串,以避开用户输入var和$this->db->query(...)
运行SQL。