Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove single quotes from where_in in codeigniter

I am working on a search functionality. I have created a search form in which user can search an Application based on Type,ope & Formate.

I have used a subquery in my join query to get the desired result. I have tested my query in MySQL Workbench nad it's working fine.

But when I tried that same query in Codeigniter using query builder technique then I am facing a problem.

Here is the query which is worked fine in workbench:

SELECT (*)
FROM `App`
LEFT JOIN `App_type` 
ON `App_type`.`app_id` = `App`.`id`
LEFT JOIN `App_formate` 
ON `App_formate`.`app_id` = `App`.`id`
WHERE `App`.`id` IN(select app_id FROM App_type WHERE type_id in (3,2,6) group by app_id HAVING COUNT(*) = 3)
AND `App_formate`.`formate_id` IN('1', '3')
AND `jobs`.`ope_min` <= '3'
AND `jobs`.`ope_max` >= '3'
GROUP BY `jobs`.`id`;

This is the join query which I use:

$subquery = "select app_id FROM App_type WHERE type_id in ($selected_type) group by app_id HAVING COUNT(*) = $type_count";

$search_app_query = $this->db
    ->select('*')
    ->from('App')
    ->join('App_type', 'App_type.app_id = App.id', 'left outer')
    ->join('App_formate', 'App_formate.app_id = App.id', 'left outer')      
    ->where_in('App.id',$subquery)  //<-- Here is the problem
    ->where_in('App_formate.formate_id',$data['selected_formates'])
    ->where('App.ope_min <=',$data['ope_value'])
    ->where('App.ope_max >=',$data['ope_value'])    
    ->group_by("App.id", "desc")
    ->get();

While I am debugging this problem it shows the

 I have found the problem is in this part of the query:
 "WHERE `App`.`id` IN('select app_id 
 FROM App_type 
 WHERE type_id in (3,2,6) 
 group by app_id HAVING COUNT(*) = 3')"

that single quote in this subquery is creating a problem.

What I have tried so far:

To remove this single quote I have tried

  1. REPLACE($subquery, '''', '')
  2. ->where_in('App.id',trim($subquery,"'"))
  3. $subquery_improved = substr($subquery, 1, -1);

But all this solution is not working. They are not removing the single quote.

Note: I am aware of $this->db->query() but do not want to use that.

like image 666
always-a-learner Avatar asked Jul 05 '17 12:07

always-a-learner


People also ask

How to remove single quotes from string in CodeIgniter?

Try this: str_replace('"', "", $string); str_replace("'", "", $string); Otherwise, go for some regex, this will work for html quotes for example: preg_replace("/<!

What is escape in CodeIgniter?

CodeIgniter has three methods that help you do this: $this->db->escape() This function determines the data type so that it can escape only string data. It also automatically adds single quotes around the data so you don't have to: $sql = "INSERT INTO table (title) VALUES(".


2 Answers

Your task looks pretty simple

instead of

->where_in('App.id',$subquery)  //<-- Here is the problem

you can try the following

->where("App.id IN (".$subquery.")",NULL, false)

You can find this exact information in the Codeigniter Documentation here (point 4 and the section below).

like image 114
sintakonte Avatar answered Sep 22 '22 02:09

sintakonte


My approach would be something like below, in a more generic way. I am always trying to follow the MVC pattern while breaking the functionality in small functions. Although you didn't share all of your code, i will suggest it anyway.

You should change my custom given names to functions, arrays etc. so it matches your code. Hope it helps.

Model function

public function getApp_ids($selected_type, $type_count) {
   $subquery = "select app_id FROM App_type WHERE type_id in ($selected_type) group by app_id HAVING COUNT(*) = $type_count";
   $result = $subquery->get();
   if($result->num_rows() > 0) //the check here is relevant to your data
       return $result->result_array();
   return false;
}

Model Function

public function searchApp($appIds, $data) {
  //$appIds and $data are parameters to this function. 
    $search_app_query = $this->db
       ->select('*')
       ->from('App')
       ->join('App_type', 'App_type.app_id = App.id', 'left outer')
       ->join('App_formate', 'App_formate.app_id = App.id', 'left outer')      
       ->where_in('App.id',$appIds)  //pass the array of your IDs
       ->where_in('App_formate.formate_id',$data['selected_formates'])
       ->where('App.ope_min <=',$data['ope_value'])
       ->where('App.ope_max >=',$data['ope_value'])    
       ->group_by("App.id", "desc")
       ->get();

    if($search_app_query->num_rows() > 0) //again, the check is yours
         return $search_app_query->result_array();
    return false;
}

In your Controller, something like this

public function YOUR_FUNCTION($selected_type, $type_count) {
   //call this function from model to grab the app_id you want. Don't forget to pass the parameters you sql needs.
   $appIdsResult = $this->YOUR_MODEL->getApp_ids($selected_type, $type_count);

   //Manipulate your result in another array, so you can get rid off the indexes and do some checks if you want
   $appIds = array();
   foreach ($appIdsResult as $appId) {
       array_push($appIds, $appId['app_id']); //Check the index app_id, it is the result from your DB.
    }

    //Call searchApp from your model and pass the found $appIds and your $data ofcourse
    $result = $this->YOUR_MODEL->searchApp($appIds, $data);
    //In $result will be your answer
}
like image 23
GeorgeGeorgitsis Avatar answered Sep 21 '22 02:09

GeorgeGeorgitsis