如何删除多余的撇号

时间:2019-05-17 09:10:13

标签: mysql codeigniter phpmyadmin

我编写了一个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 ``bpsome_value`` IS NULL AND ``students。`schoo'附近使用正确的语法

     

SELECT COUNT(id)as stud_count FROM(SELECT studentsid`` FROM ``students`` LEFT JOIN ``bp`` ON ``studentspbp`` = ``bpid`` WHERE ``bp ..其他一些条件。。UNION ALL SELECT {{1} }学生 id .学生FROM bp LEFT JOIN学生ON dbp . bp = id . X ..some other condition....) X GROUP BY id`

1 个答案:

答案 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。