【问题标题】:active record in codeigniter automatically adds quotes around each where clause comma separared valuecodeigniter 中的活动记录自动在每个 where 子句逗号分隔值周围添加引号
【发布时间】:2015-07-31 05:16:36
【问题描述】:

我将在 WHERE IN 查询子句中使用的逗号分隔值作为

$sql = '
            MAX(CASE WHEN rt.machine_name = "new" THEN rt.request_status_count ELSE "0" END) AS "new",
            MAX(CASE WHEN rt.machine_name = "open" THEN rt.request_status_count ELSE "0" END) AS "open",
            MAX(CASE WHEN rt.machine_name = "waiting" THEN rt.request_status_count ELSE "0" END) AS "waiting",
            MAX(CASE WHEN rt.machine_name = "closed" THEN rt.request_status_count ELSE "0" END) AS "closed"
            FROM 
            (SELECT COUNT(r.id) AS request_status_count, rs.name AS status, rs.machine_name AS machine_name
            FROM '. $this->_table . ' r INNER JOIN request_status AS rs ON r.request_status_id = rs.id INNER JOIN organizations AS o ON r.organization_id = o.id '. $where_string .' GROUP BY r.request_status_id) AS rt';

        $this->db->select($sql);  

$where_string 被传递为

$security_clause_string = 'WHERE r.location_id IN ("' . $this->session->userdata('str_user_locations').'")';

str_user_locations = 1,2,4 在哪里

这个查询的输出是

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '` GROUP BY r.request_status_id) AS rt' at line 4

SELECT MAX(CASE WHEN rt.machine_name = "new" THEN rt.request_status_count ELSE "0" END) AS "new", MAX(CASE WHEN rt.machine_name = "open" THEN rt.request_status_count ELSE "0" END) AS "open", MAX(CASE WHEN rt.machine_name = "waiting" THEN rt.request_status_count ELSE "0" END) AS "waiting", MAX(CASE WHEN rt.machine_name = "closed" THEN rt.request_status_count ELSE "0" END) AS "closed" FROM (SELECT COUNT(r.id) AS request_status_count, `rs`.`name` AS status, `rs`.`machine_name` AS machine_name FROM requests r INNER JOIN request_status AS rs ON r.request_status_id = rs.id INNER JOIN organizations AS o ON r.organization_id = o.id WHERE r.location_id IN ("1, `2`, `3")` GROUP BY r.request_status_id) AS rt

【问题讨论】:

  • 如果 location_id 是 int 你可以像 WHERE r.location_id IN (' . $this->session->userdata('str_user_locations').')' 那样做
  • location_id 将是多个 ID,所以我传递为 1,3,5,6
  • 是的,这就是我的意思,如果数据库中的数据类型是 int 你不需要引号。

标签: mysql codeigniter select activerecord


【解决方案1】:

尝试where_in阅读where_in

$this->db->where_in('r.location_id', $this->session->userdata('str_user_locations'));

where_in 产生这样的结果

 $names = array('Frank', 'Todd', 'James');
    $this->db->where_in('username', $names);
 // Produces: WHERE username IN ('Frank', 'Todd', 'James')

【讨论】:

    【解决方案2】:

    Codeignitor 活动记录添加了这些引号,我用

    替换了我的查询
    $sql = 'SELECT
                MAX(CASE WHEN rt.machine_name = "new" THEN rt.request_status_count ELSE "0" END) AS "new",
                MAX(CASE WHEN rt.machine_name = "open" THEN rt.request_status_count ELSE "0" END) AS "open",
                MAX(CASE WHEN rt.machine_name = "waiting" THEN rt.request_status_count ELSE "0" END) AS "waiting",
                MAX(CASE WHEN rt.machine_name = "closed" THEN rt.request_status_count ELSE "0" END) AS "closed"
                FROM 
                (SELECT COUNT(r.id) AS request_status_count, rs.name AS status, rs.machine_name AS machine_name
                FROM '. $this->_table . ' r INNER JOIN request_status AS rs ON r.request_status_id = rs.id INNER JOIN organizations AS o ON r.organization_id = o.id '. $where_string .' GROUP BY r.request_status_id) AS rt';
    
            $query = $this->db->query($sql);  
            return $query->result_array();
    

    【讨论】:

      猜你喜欢
      • 2013-01-11
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 2018-04-08
      相关资源
      最近更新 更多