Ignore:
Timestamp:
Mar 31, 2010, 6:32:40 PM (15 years ago)
Author:
george
Message:
  • Upraveno: Aktualizace fóra.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/forum/includes/search/fulltext_native.php

    r400 r702  
    33*
    44* @package search
    5 * @version $Id: fulltext_native.php 9173 2008-12-04 17:01:39Z naderman $
     5* @version $Id$
    66* @copyright (c) 2005 phpBB Group
    77* @license http://opensource.org/licenses/gpl-license.php GNU Public License
     
    8282        function split_keywords($keywords, $terms)
    8383        {
    84                 global $db, $user;
     84                global $db, $user, $config;
    8585
    8686                $keywords = trim($this->cleanup($keywords, '+-|()*'));
     
    168168
    169169                $keywords = preg_replace($match, $replace, $keywords);
     170                $num_keywords = sizeof(explode(' ', $keywords));
     171
     172                // We limit the number of allowed keywords to minimize load on the database
     173                if ($config['max_num_search_keywords'] && $num_keywords > $config['max_num_search_keywords'])
     174                {
     175                        trigger_error($user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', $config['max_num_search_keywords'], $num_keywords));
     176                }
    170177
    171178                // $keywords input format: each word separated by a space, words in a bracket are not separated
     
    196203                        $sql = 'SELECT word_id, word_text, word_common
    197204                                FROM ' . SEARCH_WORDLIST_TABLE . '
    198                                 WHERE ' . $db->sql_in_set('word_text', $exact_words);
     205                                WHERE ' . $db->sql_in_set('word_text', $exact_words) . '
     206                                ORDER BY word_count ASC';
    199207                        $result = $db->sql_query($sql);
    200208
     
    371379                }
    372380
    373                 sort($this->must_contain_ids);
    374                 sort($this->must_not_contain_ids);
    375                 sort($this->must_exclude_one_ids);
    376 
    377381                if (!empty($this->search_query))
    378382                {
     
    386390        *
    387391        * @param        string          $type                           contains either posts or topics depending on what should be searched for
    388         * @param        string          &$fields                        contains either titleonly (topic titles should be searched), msgonly (only message bodies should be searched), firstpost (only subject and body of the first post should be searched) or all (all post bodies and subjects should be searched)
    389         * @param        string          &$terms                         is either 'all' (use query as entered, words without prefix should default to "have to be in field") or 'any' (ignore search query parts and just return all posts that contain any of the specified words)
    390         * @param        array           &$sort_by_sql           contains SQL code for the ORDER BY part of a query
    391         * @param        string          &$sort_key                      is the key of $sort_by_sql for the selected sorting
    392         * @param        string          &$sort_dir                      is either a or d representing ASC and DESC
    393         * @param        string          &$sort_days                     specifies the maximum amount of days a post may be old
    394         * @param        array           &$ex_fid_ary            specifies an array of forum ids which should not be searched
    395         * @param        array           &$m_approve_fid_ary     specifies an array of forum ids in which the searcher is allowed to view unapproved posts
    396         * @param        int                     &$topic_id                      is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
    397         * @param        array           &$author_ary            an array of author ids if the author should be ignored during the search the array is empty
     392        * @param        string          $fields                         contains either titleonly (topic titles should be searched), msgonly (only message bodies should be searched), firstpost (only subject and body of the first post should be searched) or all (all post bodies and subjects should be searched)
     393        * @param        string          $terms                          is either 'all' (use query as entered, words without prefix should default to "have to be in field") or 'any' (ignore search query parts and just return all posts that contain any of the specified words)
     394        * @param        array           $sort_by_sql            contains SQL code for the ORDER BY part of a query
     395        * @param        string          $sort_key                       is the key of $sort_by_sql for the selected sorting
     396        * @param        string          $sort_dir                       is either a or d representing ASC and DESC
     397        * @param        string          $sort_days                      specifies the maximum amount of days a post may be old
     398        * @param        array           $ex_fid_ary                     specifies an array of forum ids which should not be searched
     399        * @param        array           $m_approve_fid_ary      specifies an array of forum ids in which the searcher is allowed to view unapproved posts
     400        * @param        int                     $topic_id                       is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
     401        * @param        array           $author_ary                     an array of author ids if the author should be ignored during the search the array is empty
     402        * @param        string          $author_name            specifies the author match, when ANONYMOUS is also a search-match
    398403        * @param        array           &$id_ary                        passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
    399404        * @param        int                     $start                          indicates the first index of the page
     
    403408        * @access       public
    404409        */
    405         function keyword_search($type, &$fields, &$terms, &$sort_by_sql, &$sort_key, &$sort_dir, &$sort_days, &$ex_fid_ary, &$m_approve_fid_ary, &$topic_id, &$author_ary, &$id_ary, $start, $per_page)
     410        function keyword_search($type, $fields, $terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page)
    406411        {
    407412                global $config, $db;
     
    413418                }
    414419
     420                $must_contain_ids = $this->must_contain_ids;
     421                $must_not_contain_ids = $this->must_not_contain_ids;
     422                $must_exclude_one_ids = $this->must_exclude_one_ids;
     423
     424                sort($must_contain_ids);
     425                sort($must_not_contain_ids);
     426                sort($must_exclude_one_ids);
     427
    415428                // generate a search_key from all the options to identify the results
    416429                $search_key = md5(implode('#', array(
    417                         serialize($this->must_contain_ids),
    418                         serialize($this->must_not_contain_ids),
    419                         serialize($this->must_exclude_one_ids),
     430                        serialize($must_contain_ids),
     431                        serialize($must_not_contain_ids),
     432                        serialize($must_exclude_one_ids),
    420433                        $type,
    421434                        $fields,
     
    426439                        implode(',', $ex_fid_ary),
    427440                        implode(',', $m_approve_fid_ary),
    428                         implode(',', $author_ary)
     441                        implode(',', $author_ary),
     442                        $author_name,
    429443                )));
    430444
     
    617631                if (sizeof($author_ary))
    618632                {
    619                         $sql_where[] = $db->sql_in_set('p.poster_id', $author_ary);
     633                        if ($author_name)
     634                        {
     635                                // first one matches post of registered users, second one guests and deleted users
     636                                $sql_author = '(' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
     637                        }
     638                        else
     639                        {
     640                                $sql_author = $db->sql_in_set('p.poster_id', $author_ary);
     641                        }
     642                        $sql_where[] = $sql_author;
    620643                }
    621644
     
    639662                        $sql_array_count = $sql_array;
    640663
     664                        if ($left_join_topics)
     665                        {
     666                                $sql_array_count['LEFT_JOIN'][] = array(
     667                                        'FROM'  => array(TOPICS_TABLE => 't'),
     668                                        'ON'    => 'p.topic_id = t.topic_id'
     669                                );
     670                        }
     671
    641672                        switch ($db->sql_layer)
    642673                        {
     
    645676
    646677                                        // 3.x does not support SQL_CALC_FOUND_ROWS
    647                                         $sql_array['SELECT'] = 'SQL_CALC_FOUND_ROWS ' . $sql_array['SELECT'];
     678                                        // $sql_array['SELECT'] = 'SQL_CALC_FOUND_ROWS ' . $sql_array['SELECT'];
    648679                                        $is_mysql = true;
    649680
     
    694725                        break;
    695726                }
    696                
     727
    697728                if ($left_join_topics)
    698729                {
    699                         $sql_array['LEFT_JOIN'][$left_join_topics] = array(
     730                        $sql_array['LEFT_JOIN'][] = array(
    700731                                'FROM'  => array(TOPICS_TABLE => 't'),
    701732                                'ON'    => 'p.topic_id = t.topic_id'
     
    714745                while ($row = $db->sql_fetchrow($result))
    715746                {
    716                         $id_ary[] = $row[(($type == 'posts') ? 'post_id' : 'topic_id')];
     747                        $id_ary[] = (int) $row[(($type == 'posts') ? 'post_id' : 'topic_id')];
    717748                }
    718749                $db->sql_freeresult($result);
     
    726757                if (!$total_results && $is_mysql)
    727758                {
     759                        // Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it.
     760                        $sql_array_copy = $sql_array;
     761                        $sql_array_copy['SELECT'] = 'SQL_CALC_FOUND_ROWS p.post_id ';
     762
     763                        $sql = $db->sql_build_query('SELECT', $sql_array_copy);
     764                        unset($sql_array_copy);
     765
     766                        $db->sql_query($sql);
     767                        $db->sql_freeresult($result);
     768
    728769                        $sql = 'SELECT FOUND_ROWS() as total_results';
    729770                        $result = $db->sql_query($sql);
     
    749790        * @param        string          $type                           contains either posts or topics depending on what should be searched for
    750791        * @param        boolean         $firstpost_only         if true, only topic starting posts will be considered
    751         * @param        array           &$sort_by_sql           contains SQL code for the ORDER BY part of a query
    752         * @param        string          &$sort_key                      is the key of $sort_by_sql for the selected sorting
    753         * @param        string          &$sort_dir                      is either a or d representing ASC and DESC
    754         * @param        string          &$sort_days                     specifies the maximum amount of days a post may be old
    755         * @param        array           &$ex_fid_ary            specifies an array of forum ids which should not be searched
    756         * @param        array           &$m_approve_fid_ary     specifies an array of forum ids in which the searcher is allowed to view unapproved posts
    757         * @param        int                     &$topic_id                      is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
    758         * @param        array           &$author_ary            an array of author ids
     792        * @param        array           $sort_by_sql            contains SQL code for the ORDER BY part of a query
     793        * @param        string          $sort_key                       is the key of $sort_by_sql for the selected sorting
     794        * @param        string          $sort_dir                       is either a or d representing ASC and DESC
     795        * @param        string          $sort_days                      specifies the maximum amount of days a post may be old
     796        * @param        array           $ex_fid_ary                     specifies an array of forum ids which should not be searched
     797        * @param        array           $m_approve_fid_ary      specifies an array of forum ids in which the searcher is allowed to view unapproved posts
     798        * @param        int                     $topic_id                       is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
     799        * @param        array           $author_ary                     an array of author ids
     800        * @param        string          $author_name            specifies the author match, when ANONYMOUS is also a search-match
    759801        * @param        array           &$id_ary                        passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
    760802        * @param        int                     $start                          indicates the first index of the page
     
    764806        * @access       public
    765807        */
    766         function author_search($type, $firstpost_only, &$sort_by_sql, &$sort_key, &$sort_dir, &$sort_days, &$ex_fid_ary, &$m_approve_fid_ary, &$topic_id, &$author_ary, &$id_ary, $start, $per_page)
     808        function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page)
    767809        {
    768810                global $config, $db;
     
    786828                        implode(',', $ex_fid_ary),
    787829                        implode(',', $m_approve_fid_ary),
    788                         implode(',', $author_ary)
     830                        implode(',', $author_ary),
     831                        $author_name,
    789832                )));
    790833
     
    799842
    800843                // Create some display specific sql strings
    801                 $sql_author             = $db->sql_in_set('p.poster_id', $author_ary);
     844                if ($author_name)
     845                {
     846                        // first one matches post of registered users, second one guests and deleted users
     847                        $sql_author = '(' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
     848                }
     849                else
     850                {
     851                        $sql_author = $db->sql_in_set('p.poster_id', $author_ary);
     852                }
    802853                $sql_fora               = (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
    803854                $sql_time               = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
     
    849900                                case 'mysql4':
    850901                                case 'mysqli':
    851                                         $select = 'SQL_CALC_FOUND_ROWS ' . $select;
     902//                                      $select = 'SQL_CALC_FOUND_ROWS ' . $select;
    852903                                        $is_mysql = true;
    853904                                break;
     
    936987                while ($row = $db->sql_fetchrow($result))
    937988                {
    938                         $id_ary[] = $row[$field];
     989                        $id_ary[] = (int) $row[$field];
    939990                }
    940991                $db->sql_freeresult($result);
     
    942993                if (!$total_results && $is_mysql)
    943994                {
     995                        // Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it.
     996                        $sql = str_replace('SELECT ' . $select, 'SELECT DISTINCT SQL_CALC_FOUND_ROWS p.post_id', $sql);
     997
     998                        $db->sql_query($sql);
     999                        $db->sql_freeresult($result);
     1000
    9441001                        $sql = 'SELECT FOUND_ROWS() as total_results';
    9451002                        $result = $db->sql_query($sql);
     
    11111168                // Get unique words from the above arrays
    11121169                $unique_add_words = array_unique(array_merge($words['add']['post'], $words['add']['title']));
    1113                
     1170
    11141171                // We now have unique arrays of all words to be added and removed and
    11151172                // individual arrays of added and removed words for text and title. What
Note: See TracChangeset for help on using the changeset viewer.