/**
  * Creates the part for the WHERE clause
  *
  * @param string $searchTerm Search term
  *
  * @return string
  */
 public function getMatchClause($searchTerm = '')
 {
     $keys = PMF_String::preg_split("/\\s+/", $searchTerm);
     $numKeys = count($keys);
     $numMatch = count($this->matchingColumns);
     $where = '';
     for ($i = 0; $i < $numKeys; $i++) {
         if (strlen($where) != 0) {
             $where = $where . " OR";
         }
         $where = $where . " (";
         for ($j = 0; $j < $numMatch; $j++) {
             if ($j != 0) {
                 $where = $where . " OR ";
             }
             $where = sprintf("%s%s LIKE '%%%s%%'", $where, $this->matchingColumns[$j], $this->_config->getDb()->escape($keys[$i]));
         }
         $where .= ")";
     }
     return $where;
 }
Example #2
0
 /**
  * Generates a result based on search a search string.
  *
  * @param  string $table       Table for search
  * @param  array  $assoc       Associative array with columns for the resulset
  * @param  string $joinedTable Table to do a JOIN, e.g. for faqcategoryrelations
  * @param  array  $joinAssoc   Associative array with comlumns for the JOIN
  * @param  string $string      Search term
  * @param  array  $cond        Conditions
  * @param  array  $orderBy     ORDER BY columns
  * @return mixed
  */
 public function search($table, array $assoc, $joinedTable = '', array $joinAssoc = array(), $match = array(), $string = '', array $cond = array(), array $orderBy = array())
 {
     $string = trim($string);
     $fields = '';
     $join = '';
     $joined = '';
     $where = '';
     foreach ($assoc as $field) {
         if (empty($fields)) {
             $fields = $field;
         } else {
             $fields .= ", " . $field;
         }
     }
     if (isset($joinedTable) && $joinedTable != '') {
         $joined .= ' LEFT JOIN ' . $joinedTable . ' ON ';
     }
     if (is_array($joinAssoc)) {
         foreach ($joinAssoc as $joinedFields) {
             $join .= $joinedFields . ' AND ';
         }
         $joined .= PMF_String::substr($join, 0, -4);
     }
     $keys = PMF_String::preg_split("/\\s+/", $string);
     $numKeys = count($keys);
     $numMatch = count($match);
     for ($i = 0; $i < $numKeys; $i++) {
         if (strlen($where) != 0) {
             $where = $where . " OR";
         }
         $where = $where . " (";
         for ($j = 0; $j < $numMatch; $j++) {
             if ($j != 0) {
                 $where = $where . " OR ";
             }
             $where = $where . $match[$j] . " LIKE '%" . $keys[$i] . "%'";
         }
         $where .= ")";
     }
     foreach ($cond as $field => $data) {
         if (empty($where)) {
             $where .= $field . " = " . $data;
         } else {
             $where .= " AND " . $field . " = " . $data;
         }
     }
     $query = "SELECT " . $fields . " FROM " . $table . $joined . " WHERE";
     if (!empty($where)) {
         $query .= " (" . $where . ")";
     }
     if (is_numeric($string)) {
         $query = "SELECT " . $fields . " FROM " . $table . $joined . " WHERE " . $match . " = " . $string;
     }
     $firstOrderBy = true;
     foreach ($orderBy as $field) {
         if ($firstOrderBy) {
             $query .= " ORDER BY " . $field;
             $firstOrderBy = false;
         } else {
             $query .= ", " . $field;
         }
     }
     return $this->query($query);
 }
Example #3
0
 /**
  * Split string by a regexp
  * @param string $pattern
  * @param string $subject
  * @param int $limit
  * @param int $flags
  * 
  * @return array
  */
 public static function preg_split($pattern, $subject, $limit = -1, $flags = 0)
 {
     return self::$instance->preg_split($pattern, $subject, $limit = -1, $flags = 0);
 }
Example #4
0
/**
 * Get search data weither as array or resource
 *
 * @param string $searchterm
 * @param boolean $asResource
 * @param string $cat
 * @param boolean $allLanguages
 * 
 * @return array|resource
 */
function getSearchData($searchterm, $asResource = false, $cat = '%', $allLanguages = true)
{
    $db = PMF_Db::getInstance();
    $LANGCODE = PMF_Language::$language;
    $result = null;
    $num = 0;
    $cond = array(SQLPREFIX . "faqdata.active" => "'yes'");
    if ($cat != '%') {
        $cond = array_merge(array(SQLPREFIX . "faqcategoryrelations.category_id" => $cat), $cond);
    }
    if (!$allLanguages && !is_numeric($searchterm)) {
        $cond = array_merge(array(SQLPREFIX . "faqdata.lang" => "'" . $LANGCODE . "'"), $cond);
    }
    if (is_numeric($searchterm)) {
        // search for the solution_id
        $result = $db->search(SQLPREFIX . 'faqdata', array(SQLPREFIX . 'faqdata.id AS id', SQLPREFIX . 'faqdata.lang AS lang', SQLPREFIX . 'faqdata.solution_id AS solution_id', SQLPREFIX . 'faqcategoryrelations.category_id AS category_id', SQLPREFIX . 'faqdata.thema AS thema', SQLPREFIX . 'faqdata.content AS content'), SQLPREFIX . 'faqcategoryrelations', array(SQLPREFIX . 'faqdata.id = ' . SQLPREFIX . 'faqcategoryrelations.record_id', SQLPREFIX . 'faqdata.lang = ' . SQLPREFIX . 'faqcategoryrelations.record_lang'), array(SQLPREFIX . 'faqdata.solution_id'), $searchterm, $cond);
    } else {
        $result = $db->search(SQLPREFIX . "faqdata", array(SQLPREFIX . "faqdata.id AS id", SQLPREFIX . "faqdata.lang AS lang", SQLPREFIX . "faqcategoryrelations.category_id AS category_id", SQLPREFIX . "faqdata.thema AS thema", SQLPREFIX . "faqdata.content AS content"), SQLPREFIX . "faqcategoryrelations", array(SQLPREFIX . "faqdata.id = " . SQLPREFIX . "faqcategoryrelations.record_id", SQLPREFIX . "faqdata.lang = " . SQLPREFIX . "faqcategoryrelations.record_lang"), array(SQLPREFIX . "faqdata.thema", SQLPREFIX . "faqdata.content", SQLPREFIX . "faqdata.keywords"), $searchterm, $cond);
    }
    if ($result) {
        $num = $db->numRows($result);
    }
    // Show the record with the solution ID directly
    // Sanity checks: if a valid Solution ID has been provided the result set
    //                will measure 1: this is true ONLY if the faq is not
    //                classified among more than 1 category
    if (is_numeric($searchterm) && $searchterm >= PMF_SOLUTION_ID_START_VALUE && $num > 0) {
        // Hack: before a redirection we must force the PHP session update for preventing data loss
        session_write_close();
        if (PMF_Configuration::getInstance()->get('main.enableRewriteRules')) {
            header('Location: ' . PMF_Link::getSystemUri('/index.php') . '/solution_id_' . $searchterm . '.html');
        } else {
            header('Location: ' . PMF_Link::getSystemUri('/index.php') . '/index.php?solution_id=' . $searchterm);
        }
        exit;
    }
    if (0 == $num) {
        $keys = PMF_String::preg_split("/\\s+/", $searchterm);
        $numKeys = count($keys);
        $where = '';
        for ($i = 0; $i < $numKeys; $i++) {
            if (PMF_String::strlen($where) != 0) {
                $where = $where . " OR ";
            }
            $where = $where . '(' . SQLPREFIX . "faqdata.thema LIKE '%" . $keys[$i] . "%' OR " . SQLPREFIX . "faqdata.content LIKE '%" . $keys[$i] . "%' OR " . SQLPREFIX . "faqdata.keywords LIKE '%" . $keys[$i] . "%')";
            if (is_numeric($cat)) {
                $where .= ' AND ' . SQLPREFIX . 'faqcategoryrelations.category_id = ' . $cat;
            }
            if (!$allLanguages) {
                $where .= ' AND ' . SQLPREFIX . "faqdata.lang = '" . $LANGCODE . "'";
            }
        }
        $where = " WHERE (" . $where . ") AND " . SQLPREFIX . "faqdata.active = 'yes'";
        $query = 'SELECT ' . SQLPREFIX . 'faqdata.id AS id, ' . SQLPREFIX . 'faqdata.lang AS lang, ' . SQLPREFIX . 'faqcategoryrelations.category_id AS category_id, ' . SQLPREFIX . 'faqdata.thema AS thema, ' . SQLPREFIX . 'faqdata.content AS content FROM ' . SQLPREFIX . 'faqdata LEFT JOIN ' . SQLPREFIX . 'faqcategoryrelations ON ' . SQLPREFIX . 'faqdata.id = ' . SQLPREFIX . 'faqcategoryrelations.record_id AND ' . SQLPREFIX . 'faqdata.lang = ' . SQLPREFIX . 'faqcategoryrelations.record_lang ' . $where;
        $result = $db->query($query);
    }
    return $asResource ? $result : $db->fetchAll($result);
}