CRM-19006: option values with commas are unsearchable
authordeb.monish <monish.deb@webaccessglobal.com>
Thu, 30 Jun 2016 05:39:06 +0000 (11:09 +0530)
committerdeb.monish <monish.deb@webaccessglobal.com>
Thu, 30 Jun 2016 07:43:12 +0000 (13:13 +0530)
CRM/Core/BAO/CustomQuery.php

index c2a1db9f51b0c3cbdc0750f7ce629827199d23d6..ce3586a5fa5329ff4e5420beca431ecc3e5d5cb0 100644 (file)
@@ -345,7 +345,12 @@ SELECT f.id, f.label, f.data_type,
                   $op = key($value);
                   $value = $value[$op];
                 }
-                $value = implode(',', (array) $value);
+                // CRM-19006: escape characters like comma, | before building regex pattern
+                $value = (array) $value;
+                foreach ($value as $key => $val) {
+                  $value[$key] = str_replace(array('|', '[', ']', ','), array('\|', '\[', '\]', '[:comma:]'), $val);
+                }
+                $value = implode(',', $value);
               }
 
               // CRM-14563,CRM-16575 : Special handling of multi-select custom fields
@@ -353,8 +358,7 @@ SELECT f.id, f.label, f.data_type,
                 $sp = CRM_Core_DAO::VALUE_SEPARATOR;
                 if (strstr($op, 'IN')) {
                   $value = str_replace(",", "$sp|$sp", $value);
-                  $value = str_replace('(', '[[.left-parenthesis.]]', $value);
-                  $value = str_replace(')', '[[.right-parenthesis.]]', $value);
+                  $value = str_replace(array('[:comma:]', '(', ')'), array(',', '[[.left-parenthesis.]]', '[[.right-parenthesis.]]'), $value);
                 }
                 $op = (strstr($op, '!') || strstr($op, 'NOT')) ? 'NOT RLIKE' : 'RLIKE';
                 $value = $sp . $value . $sp;