phpBB
Statistics
| Revision:

root / trunk / phpBB / includes / search / fulltext_mysql.php

History | View | Annotate | Download (26.1 kB)

1 5060 psotfx
<?php
2 7736 acydburn
/**
3 5114 acydburn
*
4 5114 acydburn
* @package search
5 7736 acydburn
* @copyright (c) 2005 phpBB Group
6 11661 git-gate
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
7 5114 acydburn
*
8 5114 acydburn
*/
9 5060 psotfx
10 5114 acydburn
/**
11 8147 acydburn
* @ignore
12 5670 acydburn
*/
13 5670 acydburn
if (!defined('IN_PHPBB'))
14 5670 acydburn
{
15 5670 acydburn
        exit;
16 5670 acydburn
}
17 5670 acydburn
18 5670 acydburn
/**
19 5114 acydburn
* fulltext_mysql
20 5488 naderman
* Fulltext search for MySQL
21 6058 acydburn
* @package search
22 5114 acydburn
*/
23 11557 git-gate
class phpbb_search_fulltext_mysql extends phpbb_search_base
24 5060 psotfx
{
25 6211 naderman
        var $stats = array();
26 6211 naderman
        var $word_length = array();
27 6211 naderman
        var $split_words = array();
28 6216 naderman
        var $search_query;
29 6211 naderman
        var $common_words = array();
30 6843 naderman
        var $pcre_properties = false;
31 7247 davidmj
        var $mbstring_regex = false;
32 5636 naderman
33 11557 git-gate
        public function __construct(&$error)
34 5060 psotfx
        {
35 5652 naderman
                global $config;
36 5652 naderman
37 5652 naderman
                $this->word_length = array('min' => $config['fulltext_mysql_min_word_len'], 'max' => $config['fulltext_mysql_max_word_len']);
38 5652 naderman
39 10898 git-gate
                // PHP may not be linked with the bundled PCRE lib and instead with an older version
40 11379 git-gate
                if (phpbb_pcre_utf8_support())
41 6843 naderman
                {
42 10898 git-gate
                        $this->pcre_properties = true;
43 6843 naderman
                }
44 6843 naderman
45 7247 davidmj
                if (function_exists('mb_ereg'))
46 7247 davidmj
                {
47 7247 davidmj
                        $this->mbstring_regex = true;
48 8257 davidmj
                        mb_regex_encoding('UTF-8');
49 7247 davidmj
                }
50 7248 davidmj
51 5636 naderman
                $error = false;
52 5636 naderman
        }
53 5060 psotfx
54 5636 naderman
        /**
55 11557 git-gate
        * Returns the name of this search backend to be displayed to administrators
56 11557 git-gate
        *
57 11557 git-gate
        * @return string Name
58 11557 git-gate
        */
59 11557 git-gate
        public function get_name()
60 11557 git-gate
        {
61 11557 git-gate
                return 'MySQL Fulltext';
62 11557 git-gate
        }
63 11557 git-gate
64 11557 git-gate
        /**
65 5727 naderman
        * Checks for correct MySQL version and stores min/max word length in the config
66 5636 naderman
        */
67 5636 naderman
        function init()
68 5636 naderman
        {
69 5636 naderman
                global $db, $user;
70 5488 naderman
71 6740 naderman
                if ($db->sql_layer != 'mysql4' && $db->sql_layer != 'mysqli')
72 5636 naderman
                {
73 5636 naderman
                        return $user->lang['FULLTEXT_MYSQL_INCOMPATIBLE_VERSION'];
74 5636 naderman
                }
75 5636 naderman
76 5639 naderman
                $result = $db->sql_query('SHOW TABLE STATUS LIKE \'' . POSTS_TABLE . '\'');
77 5727 naderman
                $info = $db->sql_fetchrow($result);
78 5727 naderman
                $db->sql_freeresult($result);
79 5727 naderman
80 5727 naderman
                $engine = '';
81 5727 naderman
                if (isset($info['Engine']))
82 5639 naderman
                {
83 5727 naderman
                        $engine = $info['Engine'];
84 5639 naderman
                }
85 5727 naderman
                else if (isset($info['Type']))
86 5727 naderman
                {
87 5727 naderman
                        $engine = $info['Type'];
88 5727 naderman
                }
89 5639 naderman
90 5639 naderman
                if ($engine != 'MyISAM')
91 5639 naderman
                {
92 5639 naderman
                        return $user->lang['FULLTEXT_MYSQL_NOT_MYISAM'];
93 5639 naderman
                }
94 5639 naderman
95 5488 naderman
                $sql = 'SHOW VARIABLES
96 5488 naderman
                        LIKE \'ft\_%\'';
97 5636 naderman
                $result = $db->sql_query($sql);
98 5060 psotfx
99 5636 naderman
                $mysql_info = array();
100 5488 naderman
                while ($row = $db->sql_fetchrow($result))
101 5488 naderman
                {
102 5636 naderman
                        $mysql_info[$row['Variable_name']] = $row['Value'];
103 5488 naderman
                }
104 5488 naderman
                $db->sql_freeresult($result);
105 5488 naderman
106 5636 naderman
                set_config('fulltext_mysql_max_word_len', $mysql_info['ft_max_word_len']);
107 5636 naderman
                set_config('fulltext_mysql_min_word_len', $mysql_info['ft_min_word_len']);
108 5636 naderman
109 5636 naderman
                return false;
110 5060 psotfx
        }
111 5236 acydburn
112 5488 naderman
        /**
113 5488 naderman
        * Splits keywords entered by a user into an array of words stored in $this->split_words
114 6211 naderman
        * Stores the tidied search query in $this->search_query
115 5488 naderman
        *
116 6595 acydburn
        * @param string &$keywords Contains the keyword as entered by the user
117 5488 naderman
        * @param string $terms is either 'all' or 'any'
118 6595 acydburn
        * @return bool false if no valid keywords were found and otherwise true
119 5488 naderman
        */
120 5488 naderman
        function split_keywords(&$keywords, $terms)
121 5060 psotfx
        {
122 9438 acydburn
                global $config, $user;
123 5060 psotfx
124 5488 naderman
                if ($terms == 'all')
125 5060 psotfx
                {
126 10751 git-gate
                        $match                = array('#\sand\s#iu', '#\sor\s#iu', '#\snot\s#iu', '#(^|\s)\+#', '#(^|\s)-#', '#(^|\s)\|#');
127 5488 naderman
                        $replace        = array(' +', ' |', ' -', ' +', ' -', ' |');
128 5060 psotfx
129 5488 naderman
                        $keywords = preg_replace($match, $replace, $keywords);
130 5488 naderman
                }
131 5060 psotfx
132 5488 naderman
                // Filter out as above
133 7385 naderman
                $split_keywords = preg_replace("#[\n\r\t]+#", ' ', trim(htmlspecialchars_decode($keywords)));
134 5488 naderman
135 5488 naderman
                // Split words
136 7247 davidmj
                if ($this->pcre_properties)
137 7247 davidmj
                {
138 7385 naderman
                        $split_keywords = preg_replace('#([^\p{L}\p{N}\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords)));
139 7247 davidmj
                }
140 7247 davidmj
                else if ($this->mbstring_regex)
141 7247 davidmj
                {
142 7385 naderman
                        $split_keywords = mb_ereg_replace('([^\w\'*"()])', '\\1\\1', str_replace('\'\'', '\' \'', trim($split_keywords)));
143 7247 davidmj
                }
144 7247 davidmj
                else
145 7247 davidmj
                {
146 7385 naderman
                        $split_keywords = preg_replace('#([^\w\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords)));
147 7247 davidmj
                }
148 5488 naderman
149 7247 davidmj
                if ($this->pcre_properties)
150 7247 davidmj
                {
151 7247 davidmj
                        $matches = array();
152 7385 naderman
                        preg_match_all('#(?:[^\p{L}\p{N}*"()]|^)([+\-|]?(?:[\p{L}\p{N}*"()]+\'?)*[\p{L}\p{N}*"()])(?:[^\p{L}\p{N}*"()]|$)#u', $split_keywords, $matches);
153 7247 davidmj
                        $this->split_words = $matches[1];
154 7247 davidmj
                }
155 7247 davidmj
                else if ($this->mbstring_regex)
156 7247 davidmj
                {
157 7385 naderman
                        mb_ereg_search_init($split_keywords, '(?:[^\w*"()]|^)([+\-|]?(?:[\w*"()]+\'?)*[\w*"()])(?:[^\w*"()]|$)');
158 7247 davidmj
159 7247 davidmj
                        while (($word = mb_ereg_search_regs()))
160 7247 davidmj
                        {
161 7247 davidmj
                                $this->split_words[] = $word[1];
162 7247 davidmj
                        }
163 7247 davidmj
                }
164 7247 davidmj
                else
165 7247 davidmj
                {
166 7247 davidmj
                        $matches = array();
167 7385 naderman
                        preg_match_all('#(?:[^\w*"()]|^)([+\-|]?(?:[\w*"()]+\'?)*[\w*"()])(?:[^\w*"()]|$)#u', $split_keywords, $matches);
168 7247 davidmj
                        $this->split_words = $matches[1];
169 7247 davidmj
                }
170 7247 davidmj
171 9438 acydburn
                // We limit the number of allowed keywords to minimize load on the database
172 9438 acydburn
                if ($config['max_num_search_keywords'] && sizeof($this->split_words) > $config['max_num_search_keywords'])
173 9438 acydburn
                {
174 9438 acydburn
                        trigger_error($user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', $config['max_num_search_keywords'], sizeof($this->split_words)));
175 9438 acydburn
                }
176 9438 acydburn
177 7385 naderman
                // to allow phrase search, we need to concatenate quoted words
178 7385 naderman
                $tmp_split_words = array();
179 7385 naderman
                $phrase = '';
180 7385 naderman
                foreach ($this->split_words as $word)
181 7385 naderman
                {
182 7385 naderman
                        if ($phrase)
183 7385 naderman
                        {
184 7385 naderman
                                $phrase .= ' ' . $word;
185 7385 naderman
                                if (strpos($word, '"') !== false && substr_count($word, '"') % 2 == 1)
186 7385 naderman
                                {
187 7385 naderman
                                        $tmp_split_words[] = $phrase;
188 7385 naderman
                                        $phrase = '';
189 7385 naderman
                                }
190 7385 naderman
                        }
191 7385 naderman
                        else if (strpos($word, '"') !== false && substr_count($word, '"') % 2 == 1)
192 7385 naderman
                        {
193 7385 naderman
                                $phrase = $word;
194 7385 naderman
                        }
195 7385 naderman
                        else
196 7385 naderman
                        {
197 7385 naderman
                                $tmp_split_words[] = $word . ' ';
198 7385 naderman
                        }
199 7385 naderman
                }
200 7385 naderman
                if ($phrase)
201 7385 naderman
                {
202 7385 naderman
                        $tmp_split_words[] = $phrase;
203 7385 naderman
                }
204 7385 naderman
205 7385 naderman
                $this->split_words = $tmp_split_words;
206 7385 naderman
207 7385 naderman
                unset($tmp_split_words);
208 7385 naderman
                unset($phrase);
209 7385 naderman
210 5488 naderman
                foreach ($this->split_words as $i => $word)
211 5488 naderman
                {
212 7385 naderman
                        $clean_word = preg_replace('#^[+\-|"]#', '', $word);
213 5488 naderman
214 5488 naderman
                        // check word length
215 6452 acydburn
                        $clean_len = utf8_strlen(str_replace('*', '', $clean_word));
216 5636 naderman
                        if (($clean_len < $config['fulltext_mysql_min_word_len']) || ($clean_len > $config['fulltext_mysql_max_word_len']))
217 5060 psotfx
                        {
218 5488 naderman
                                $this->common_words[] = $word;
219 5488 naderman
                                unset($this->split_words[$i]);
220 5060 psotfx
                        }
221 5488 naderman
                }
222 5060 psotfx
223 7385 naderman
                if ($terms == 'any')
224 7385 naderman
                {
225 7385 naderman
                        $this->search_query = '';
226 7385 naderman
                        foreach ($this->split_words as $word)
227 7385 naderman
                        {
228 7385 naderman
                                if ((strpos($word, '+') === 0) || (strpos($word, '-') === 0) || (strpos($word, '|') === 0))
229 7385 naderman
                                {
230 7385 naderman
                                        $word = substr($word, 1);
231 7385 naderman
                                }
232 7385 naderman
                                $this->search_query .= $word . ' ';
233 7385 naderman
                        }
234 7385 naderman
                }
235 7385 naderman
                else
236 7385 naderman
                {
237 7385 naderman
                        $this->search_query = '';
238 7385 naderman
                        foreach ($this->split_words as $word)
239 7385 naderman
                        {
240 7385 naderman
                                if ((strpos($word, '+') === 0) || (strpos($word, '-') === 0))
241 7385 naderman
                                {
242 7385 naderman
                                        $this->search_query .= $word . ' ';
243 7385 naderman
                                }
244 7385 naderman
                                else if (strpos($word, '|') === 0)
245 7385 naderman
                                {
246 7385 naderman
                                        $this->search_query .= substr($word, 1) . ' ';
247 7385 naderman
                                }
248 7385 naderman
                                else
249 7385 naderman
                                {
250 7385 naderman
                                        $this->search_query .= '+' . $word . ' ';
251 7385 naderman
                                }
252 7385 naderman
                        }
253 7385 naderman
                }
254 6211 naderman
255 7385 naderman
                $this->search_query = utf8_htmlspecialchars($this->search_query);
256 7385 naderman
257 7385 naderman
                if ($this->search_query)
258 5488 naderman
                {
259 5488 naderman
                        $this->split_words = array_values($this->split_words);
260 5981 naderman
                        sort($this->split_words);
261 5488 naderman
                        return true;
262 5488 naderman
                }
263 5488 naderman
                return false;
264 5488 naderman
        }
265 5060 psotfx
266 5488 naderman
        /**
267 5727 naderman
        * Turns text into an array of words
268 5488 naderman
        */
269 5488 naderman
        function split_message($text)
270 5488 naderman
        {
271 5488 naderman
                global $config;
272 5060 psotfx
273 5488 naderman
                // Split words
274 7247 davidmj
                if ($this->pcre_properties)
275 7247 davidmj
                {
276 7247 davidmj
                        $text = preg_replace('#([^\p{L}\p{N}\'*])#u', '$1$1', str_replace('\'\'', '\' \'', trim($text)));
277 7247 davidmj
                }
278 7247 davidmj
                else if ($this->mbstring_regex)
279 7247 davidmj
                {
280 7247 davidmj
                        $text = mb_ereg_replace('([^\w\'*])', '\\1\\1', str_replace('\'\'', '\' \'', trim($text)));
281 7247 davidmj
                }
282 7247 davidmj
                else
283 7247 davidmj
                {
284 7247 davidmj
                        $text = preg_replace('#([^\w\'*])#u', '$1$1', str_replace('\'\'', '\' \'', trim($text)));
285 7247 davidmj
                }
286 5060 psotfx
287 7247 davidmj
                if ($this->pcre_properties)
288 7247 davidmj
                {
289 7247 davidmj
                        $matches = array();
290 7247 davidmj
                        preg_match_all('#(?:[^\p{L}\p{N}*]|^)([+\-|]?(?:[\p{L}\p{N}*]+\'?)*[\p{L}\p{N}*])(?:[^\p{L}\p{N}*]|$)#u', $text, $matches);
291 7247 davidmj
                        $text = $matches[1];
292 7247 davidmj
                }
293 7247 davidmj
                else if ($this->mbstring_regex)
294 7247 davidmj
                {
295 7247 davidmj
                        mb_ereg_search_init($text, '(?:[^\w*]|^)([+\-|]?(?:[\w*]+\'?)*[\w*])(?:[^\w*]|$)');
296 7247 davidmj
297 7252 davidmj
                        $text = array();
298 7247 davidmj
                        while (($word = mb_ereg_search_regs()))
299 7247 davidmj
                        {
300 7247 davidmj
                                $text[] = $word[1];
301 7247 davidmj
                        }
302 7247 davidmj
                }
303 7247 davidmj
                else
304 7247 davidmj
                {
305 7247 davidmj
                        $matches = array();
306 7247 davidmj
                        preg_match_all('#(?:[^\w*]|^)([+\-|]?(?:[\w*]+\'?)*[\w*])(?:[^\w*]|$)#u', $text, $matches);
307 7247 davidmj
                        $text = $matches[1];
308 7247 davidmj
                }
309 7247 davidmj
310 5488 naderman
                // remove too short or too long words
311 5488 naderman
                $text = array_values($text);
312 5488 naderman
                for ($i = 0, $n = sizeof($text); $i < $n; $i++)
313 5488 naderman
                {
314 5488 naderman
                        $text[$i] = trim($text[$i]);
315 6452 acydburn
                        if (utf8_strlen($text[$i]) < $config['fulltext_mysql_min_word_len'] || utf8_strlen($text[$i]) > $config['fulltext_mysql_max_word_len'])
316 5060 psotfx
                        {
317 5488 naderman
                                unset($text[$i]);
318 5060 psotfx
                        }
319 5060 psotfx
                }
320 5060 psotfx
321 5488 naderman
                return array_values($text);
322 5488 naderman
        }
323 5488 naderman
324 5488 naderman
        /**
325 7385 naderman
        * Performs a search on keywords depending on display specific params. You have to run split_keywords() first.
326 5488 naderman
        *
327 7385 naderman
        * @param        string                $type                                contains either posts or topics depending on what should be searched for
328 9713 nickvergessen
        * @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)
329 9713 nickvergessen
        * @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)
330 9713 nickvergessen
        * @param        array                $sort_by_sql                contains SQL code for the ORDER BY part of a query
331 9713 nickvergessen
        * @param        string                $sort_key                        is the key of $sort_by_sql for the selected sorting
332 9713 nickvergessen
        * @param        string                $sort_dir                        is either a or d representing ASC and DESC
333 9713 nickvergessen
        * @param        string                $sort_days                        specifies the maximum amount of days a post may be old
334 9713 nickvergessen
        * @param        array                $ex_fid_ary                        specifies an array of forum ids which should not be searched
335 9713 nickvergessen
        * @param        array                $m_approve_fid_ary        specifies an array of forum ids in which the searcher is allowed to view unapproved posts
336 9713 nickvergessen
        * @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
337 9713 nickvergessen
        * @param        array                $author_ary                        an array of author ids if the author should be ignored during the search the array is empty
338 9713 nickvergessen
        * @param        string                $author_name                specifies the author match, when ANONYMOUS is also a search-match
339 7385 naderman
        * @param        array                &$id_ary                        passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
340 7385 naderman
        * @param        int                        $start                                indicates the first index of the page
341 7385 naderman
        * @param        int                        $per_page                        number of ids each page is supposed to contain
342 7385 naderman
        * @return        boolean|int                                                total number of results
343 7385 naderman
        *
344 7385 naderman
        * @access        public
345 5488 naderman
        */
346 9713 nickvergessen
        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)
347 5488 naderman
        {
348 5488 naderman
                global $config, $db;
349 5488 naderman
350 5488 naderman
                // No keywords? No posts.
351 7385 naderman
                if (!$this->search_query)
352 5060 psotfx
                {
353 5488 naderman
                        return false;
354 5060 psotfx
                }
355 5060 psotfx
356 5488 naderman
                // generate a search_key from all the options to identify the results
357 5488 naderman
                $search_key = md5(implode('#', array(
358 7385 naderman
                        implode(', ', $this->split_words),
359 5488 naderman
                        $type,
360 5488 naderman
                        $fields,
361 5488 naderman
                        $terms,
362 5488 naderman
                        $sort_days,
363 5488 naderman
                        $sort_key,
364 5488 naderman
                        $topic_id,
365 5488 naderman
                        implode(',', $ex_fid_ary),
366 5607 naderman
                        implode(',', $m_approve_fid_ary),
367 5488 naderman
                        implode(',', $author_ary)
368 5488 naderman
                )));
369 5488 naderman
370 5488 naderman
                // try reading the results from cache
371 5488 naderman
                $result_count = 0;
372 5488 naderman
                if ($this->obtain_ids($search_key, $result_count, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE)
373 5060 psotfx
                {
374 5488 naderman
                        return $result_count;
375 5488 naderman
                }
376 5060 psotfx
377 5488 naderman
                $id_ary = array();
378 5060 psotfx
379 5488 naderman
                $join_topic = ($type == 'posts') ? false : true;
380 6073 acydburn
381 5488 naderman
                // Build sql strings for sorting
382 5488 naderman
                $sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
383 5488 naderman
                $sql_sort_table = $sql_sort_join = '';
384 6073 acydburn
385 5488 naderman
                switch ($sql_sort[0])
386 5488 naderman
                {
387 5488 naderman
                        case 'u':
388 5488 naderman
                                $sql_sort_table        = USERS_TABLE . ' u, ';
389 5488 naderman
                                $sql_sort_join        = ($type == 'posts') ? ' AND u.user_id = p.poster_id ' : ' AND u.user_id = t.topic_poster ';
390 5488 naderman
                        break;
391 5060 psotfx
392 5488 naderman
                        case 't':
393 5488 naderman
                                $join_topic = true;
394 5488 naderman
                        break;
395 5488 naderman
396 5488 naderman
                        case 'f':
397 5488 naderman
                                $sql_sort_table        = FORUMS_TABLE . ' f, ';
398 5488 naderman
                                $sql_sort_join        = ' AND f.forum_id = p.forum_id ';
399 5488 naderman
                        break;
400 5488 naderman
                }
401 5488 naderman
402 5488 naderman
                // Build some display specific sql strings
403 5488 naderman
                switch ($fields)
404 5488 naderman
                {
405 5488 naderman
                        case 'titleonly':
406 5488 naderman
                                $sql_match = 'p.post_subject';
407 5488 naderman
                                $sql_match_where = ' AND p.post_id = t.topic_first_post_id';
408 5488 naderman
                                $join_topic = true;
409 5488 naderman
                        break;
410 5488 naderman
411 5488 naderman
                        case 'msgonly':
412 5488 naderman
                                $sql_match = 'p.post_text';
413 5488 naderman
                                $sql_match_where = '';
414 5488 naderman
                        break;
415 5488 naderman
416 5488 naderman
                        case 'firstpost':
417 5488 naderman
                                $sql_match = 'p.post_subject, p.post_text';
418 5488 naderman
                                $sql_match_where = ' AND p.post_id = t.topic_first_post_id';
419 5488 naderman
                                $join_topic = true;
420 5488 naderman
                        break;
421 5488 naderman
422 5488 naderman
                        default:
423 5488 naderman
                                $sql_match = 'p.post_subject, p.post_text';
424 5488 naderman
                                $sql_match_where = '';
425 6073 acydburn
                        break;
426 5488 naderman
                }
427 5488 naderman
428 5607 naderman
                if (!sizeof($m_approve_fid_ary))
429 5607 naderman
                {
430 5607 naderman
                        $m_approve_fid_sql = ' AND p.post_approved = 1';
431 5607 naderman
                }
432 5607 naderman
                else if ($m_approve_fid_ary === array(-1))
433 5607 naderman
                {
434 5607 naderman
                        $m_approve_fid_sql = '';
435 5607 naderman
                }
436 5607 naderman
                else
437 5607 naderman
                {
438 6271 acydburn
                        $m_approve_fid_sql = ' AND (p.post_approved = 1 OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) . ')';
439 5607 naderman
                }
440 5607 naderman
441 5488 naderman
                $sql_select                        = (!$result_count) ? 'SQL_CALC_FOUND_ROWS ' : '';
442 5488 naderman
                $sql_select                        = ($type == 'posts') ? $sql_select . 'p.post_id' : 'DISTINCT ' . $sql_select . 't.topic_id';
443 5488 naderman
                $sql_from                        = ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
444 5607 naderman
                $field                                = ($type == 'posts') ? 'post_id' : 'topic_id';
445 9713 nickvergessen
                if (sizeof($author_ary) && $author_name)
446 9713 nickvergessen
                {
447 9713 nickvergessen
                        // first one matches post of registered users, second one guests and deleted users
448 10342 acydburn
                        $sql_author = ' AND (' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
449 9713 nickvergessen
                }
450 9713 nickvergessen
                else if (sizeof($author_ary))
451 9713 nickvergessen
                {
452 9713 nickvergessen
                        $sql_author = ' AND ' . $db->sql_in_set('p.poster_id', $author_ary);
453 9713 nickvergessen
                }
454 9713 nickvergessen
                else
455 9713 nickvergessen
                {
456 9713 nickvergessen
                        $sql_author = '';
457 9713 nickvergessen
                }
458 5488 naderman
459 5488 naderman
                $sql_where_options = $sql_sort_join;
460 5488 naderman
                $sql_where_options .= ($topic_id) ? ' AND p.topic_id = ' . $topic_id : '';
461 5488 naderman
                $sql_where_options .= ($join_topic) ? ' AND t.topic_id = p.topic_id' : '';
462 6271 acydburn
                $sql_where_options .= (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
463 5607 naderman
                $sql_where_options .= $m_approve_fid_sql;
464 9713 nickvergessen
                $sql_where_options .= $sql_author;
465 5488 naderman
                $sql_where_options .= ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
466 5488 naderman
                $sql_where_options .= $sql_match_where;
467 5488 naderman
468 5488 naderman
                $sql = "SELECT $sql_select
469 5488 naderman
                        FROM $sql_from$sql_sort_table" . POSTS_TABLE . " p
470 7385 naderman
                        WHERE MATCH ($sql_match) AGAINST ('" . $db->sql_escape(htmlspecialchars_decode($this->search_query)) . "' IN BOOLEAN MODE)
471 5488 naderman
                                $sql_where_options
472 5488 naderman
                        ORDER BY $sql_sort";
473 5488 naderman
                $result = $db->sql_query_limit($sql, $config['search_block_size'], $start);
474 5060 psotfx
475 5488 naderman
                while ($row = $db->sql_fetchrow($result))
476 5488 naderman
                {
477 10558 git-gate
                        $id_ary[] = (int) $row[$field];
478 5488 naderman
                }
479 5488 naderman
                $db->sql_freeresult($result);
480 5060 psotfx
481 5488 naderman
                $id_ary = array_unique($id_ary);
482 5488 naderman
483 5488 naderman
                if (!sizeof($id_ary))
484 5488 naderman
                {
485 5488 naderman
                        return false;
486 5488 naderman
                }
487 5488 naderman
488 5488 naderman
                // if the total result count is not cached yet, retrieve it from the db
489 5488 naderman
                if (!$result_count)
490 5488 naderman
                {
491 5488 naderman
                        $sql = 'SELECT FOUND_ROWS() as result_count';
492 5488 naderman
                        $result = $db->sql_query($sql);
493 5699 acydburn
                        $result_count = (int) $db->sql_fetchfield('result_count');
494 5699 acydburn
                        $db->sql_freeresult($result);
495 5488 naderman
496 5699 acydburn
                        if (!$result_count)
497 5060 psotfx
                        {
498 5488 naderman
                                return false;
499 5060 psotfx
                        }
500 5488 naderman
                }
501 5060 psotfx
502 5488 naderman
                // store the ids, from start on then delete anything that isn't on the current page because we only need ids for one page
503 5488 naderman
                $this->save_ids($search_key, implode(' ', $this->split_words), $author_ary, $result_count, $id_ary, $start, $sort_dir);
504 5488 naderman
                $id_ary = array_slice($id_ary, 0, (int) $per_page);
505 5060 psotfx
506 5488 naderman
                return $result_count;
507 5488 naderman
        }
508 5488 naderman
509 5488 naderman
        /**
510 5488 naderman
        * Performs a search on an author's posts without caring about message contents. Depends on display specific params
511 5488 naderman
        *
512 10075 acydburn
        * @param        string                $type                                contains either posts or topics depending on what should be searched for
513 10075 acydburn
        * @param        boolean                $firstpost_only                if true, only topic starting posts will be considered
514 10075 acydburn
        * @param        array                $sort_by_sql                contains SQL code for the ORDER BY part of a query
515 10075 acydburn
        * @param        string                $sort_key                        is the key of $sort_by_sql for the selected sorting
516 10075 acydburn
        * @param        string                $sort_dir                        is either a or d representing ASC and DESC
517 10075 acydburn
        * @param        string                $sort_days                        specifies the maximum amount of days a post may be old
518 10075 acydburn
        * @param        array                $ex_fid_ary                        specifies an array of forum ids which should not be searched
519 10075 acydburn
        * @param        array                $m_approve_fid_ary        specifies an array of forum ids in which the searcher is allowed to view unapproved posts
520 10075 acydburn
        * @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
521 10075 acydburn
        * @param        array                $author_ary                        an array of author ids
522 10075 acydburn
        * @param        string                $author_name                specifies the author match, when ANONYMOUS is also a search-match
523 10075 acydburn
        * @param        array                &$id_ary                        passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
524 10075 acydburn
        * @param        int                        $start                                indicates the first index of the page
525 10075 acydburn
        * @param        int                        $per_page                        number of ids each page is supposed to contain
526 10075 acydburn
        * @return        boolean|int                                                total number of results
527 10075 acydburn
        *
528 10075 acydburn
        * @access        public
529 5488 naderman
        */
530 9713 nickvergessen
        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)
531 5488 naderman
        {
532 5488 naderman
                global $config, $db;
533 5488 naderman
534 5488 naderman
                // No author? No posts.
535 5488 naderman
                if (!sizeof($author_ary))
536 5488 naderman
                {
537 5488 naderman
                        return 0;
538 5060 psotfx
                }
539 5488 naderman
540 5488 naderman
                // generate a search_key from all the options to identify the results
541 5488 naderman
                $search_key = md5(implode('#', array(
542 5488 naderman
                        '',
543 5488 naderman
                        $type,
544 7930 kellanved
                        ($firstpost_only) ? 'firstpost' : '',
545 5488 naderman
                        '',
546 5488 naderman
                        '',
547 5488 naderman
                        $sort_days,
548 5488 naderman
                        $sort_key,
549 5488 naderman
                        $topic_id,
550 5488 naderman
                        implode(',', $ex_fid_ary),
551 5607 naderman
                        implode(',', $m_approve_fid_ary),
552 9713 nickvergessen
                        implode(',', $author_ary),
553 9713 nickvergessen
                        $author_name,
554 5488 naderman
                )));
555 5488 naderman
556 5488 naderman
                // try reading the results from cache
557 5488 naderman
                $result_count = 0;
558 5488 naderman
                if ($this->obtain_ids($search_key, $result_count, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE)
559 5060 psotfx
                {
560 5488 naderman
                        return $result_count;
561 5488 naderman
                }
562 5060 psotfx
563 5488 naderman
                $id_ary = array();
564 5488 naderman
565 5488 naderman
                // Create some display specific sql strings
566 9713 nickvergessen
                if ($author_name)
567 9713 nickvergessen
                {
568 9713 nickvergessen
                        // first one matches post of registered users, second one guests and deleted users
569 9931 nickvergessen
                        $sql_author = '(' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
570 9713 nickvergessen
                }
571 9713 nickvergessen
                else
572 9713 nickvergessen
                {
573 9713 nickvergessen
                        $sql_author = $db->sql_in_set('p.poster_id', $author_ary);
574 9713 nickvergessen
                }
575 6271 acydburn
                $sql_fora                = (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
576 5607 naderman
                $sql_topic_id        = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
577 5488 naderman
                $sql_time                = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
578 7930 kellanved
                $sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
579 5488 naderman
580 5488 naderman
                // Build sql strings for sorting
581 5488 naderman
                $sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
582 5488 naderman
                $sql_sort_table = $sql_sort_join = '';
583 5488 naderman
                switch ($sql_sort[0])
584 5488 naderman
                {
585 5488 naderman
                        case 'u':
586 5488 naderman
                                $sql_sort_table        = USERS_TABLE . ' u, ';
587 5488 naderman
                                $sql_sort_join        = ($type == 'posts') ? ' AND u.user_id = p.poster_id ' : ' AND u.user_id = t.topic_poster ';
588 5488 naderman
                        break;
589 5488 naderman
590 5488 naderman
                        case 't':
591 8604 naderman
                                $sql_sort_table        = ($type == 'posts' && !$firstpost_only) ? TOPICS_TABLE . ' t, ' : '';
592 8604 naderman
                                $sql_sort_join        = ($type == 'posts' && !$firstpost_only) ? ' AND t.topic_id = p.topic_id ' : '';
593 5488 naderman
                        break;
594 5488 naderman
595 5488 naderman
                        case 'f':
596 5488 naderman
                                $sql_sort_table        = FORUMS_TABLE . ' f, ';
597 5488 naderman
                                $sql_sort_join        = ' AND f.forum_id = p.forum_id ';
598 5488 naderman
                        break;
599 5488 naderman
                }
600 5488 naderman
601 5607 naderman
                if (!sizeof($m_approve_fid_ary))
602 5607 naderman
                {
603 5607 naderman
                        $m_approve_fid_sql = ' AND p.post_approved = 1';
604 5607 naderman
                }
605 5607 naderman
                else if ($m_approve_fid_ary == array(-1))
606 5607 naderman
                {
607 5607 naderman
                        $m_approve_fid_sql = '';
608 5607 naderman
                }
609 5607 naderman
                else
610 5607 naderman
                {
611 6273 naderman
                        $m_approve_fid_sql = ' AND (p.post_approved = 1 OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) . ')';
612 5607 naderman
                }
613 5607 naderman
614 5488 naderman
                // If the cache was completely empty count the results
615 5488 naderman
                $calc_results = ($result_count) ? '' : 'SQL_CALC_FOUND_ROWS ';
616 5488 naderman
617 5488 naderman
                // Build the query for really selecting the post_ids
618 5488 naderman
                if ($type == 'posts')
619 5488 naderman
                {
620 5488 naderman
                        $sql = "SELECT {$calc_results}p.post_id
621 7930 kellanved
                                FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t ' : ' ') . "
622 5488 naderman
                                WHERE $sql_author
623 5607 naderman
                                        $sql_topic_id
624 7930 kellanved
                                        $sql_firstpost
625 5607 naderman
                                        $m_approve_fid_sql
626 5488 naderman
                                        $sql_fora
627 5488 naderman
                                        $sql_sort_join
628 5488 naderman
                                        $sql_time
629 5488 naderman
                                ORDER BY $sql_sort";
630 5488 naderman
                        $field = 'post_id';
631 5488 naderman
                }
632 5488 naderman
                else
633 5488 naderman
                {
634 5488 naderman
                        $sql = "SELECT {$calc_results}t.topic_id
635 5488 naderman
                                FROM " . $sql_sort_table . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
636 5488 naderman
                                WHERE $sql_author
637 5607 naderman
                                        $sql_topic_id
638 7930 kellanved
                                        $sql_firstpost
639 5607 naderman
                                        $m_approve_fid_sql
640 5488 naderman
                                        $sql_fora
641 5488 naderman
                                        AND t.topic_id = p.topic_id
642 5488 naderman
                                        $sql_sort_join
643 5488 naderman
                                        $sql_time
644 5488 naderman
                                GROUP BY t.topic_id
645 5488 naderman
                                ORDER BY $sql_sort";
646 5488 naderman
                        $field = 'topic_id';
647 5488 naderman
                }
648 5488 naderman
649 5488 naderman
                // Only read one block of posts from the db and then cache it
650 5488 naderman
                $result = $db->sql_query_limit($sql, $config['search_block_size'], $start);
651 5488 naderman
652 5488 naderman
                while ($row = $db->sql_fetchrow($result))
653 5488 naderman
                {
654 10558 git-gate
                        $id_ary[] = (int) $row[$field];
655 5488 naderman
                }
656 5488 naderman
                $db->sql_freeresult($result);
657 5488 naderman
658 5488 naderman
                // retrieve the total result count if needed
659 5488 naderman
                if (!$result_count)
660 5488 naderman
                {
661 5488 naderman
                        $sql = 'SELECT FOUND_ROWS() as result_count';
662 5488 naderman
                        $result = $db->sql_query($sql);
663 5699 acydburn
                        $result_count = (int) $db->sql_fetchfield('result_count');
664 5699 acydburn
                        $db->sql_freeresult($result);
665 5488 naderman
666 5699 acydburn
                        if (!$result_count)
667 5060 psotfx
                        {
668 5488 naderman
                                return false;
669 5060 psotfx
                        }
670 5488 naderman
                }
671 5060 psotfx
672 5488 naderman
                if (sizeof($id_ary))
673 5488 naderman
                {
674 5488 naderman
                        $this->save_ids($search_key, '', $author_ary, $result_count, $id_ary, $start, $sort_dir);
675 5488 naderman
                        $id_ary = array_slice($id_ary, 0, $per_page);
676 5488 naderman
677 5488 naderman
                        return $result_count;
678 5488 naderman
                }
679 5488 naderman
                return false;
680 5488 naderman
        }
681 5488 naderman
682 5488 naderman
        /**
683 5488 naderman
        * Destroys cached search results, that contained one of the new words in a post so the results won't be outdated.
684 5488 naderman
        *
685 5488 naderman
        * @param string $mode contains the post mode: edit, post, reply, quote ...
686 5488 naderman
        */
687 6380 naderman
        function index($mode, $post_id, &$message, &$subject, $poster_id, $forum_id)
688 5488 naderman
        {
689 5488 naderman
                global $db;
690 5488 naderman
691 5488 naderman
                // Split old and new post/subject to obtain array of words
692 5488 naderman
                $split_text = $this->split_message($message);
693 5488 naderman
                $split_title = ($subject) ? $this->split_message($subject) : array();
694 5488 naderman
695 7385 naderman
                $words = array_unique(array_merge($split_text, $split_title));
696 5488 naderman
697 5488 naderman
                unset($split_text);
698 5488 naderman
                unset($split_title);
699 5060 psotfx
700 5488 naderman
                // destroy cached search results containing any of the words removed or added
701 5488 naderman
                $this->destroy_cache($words, array($poster_id));
702 5488 naderman
703 5488 naderman
                unset($words);
704 5060 psotfx
        }
705 5488 naderman
706 5488 naderman
        /**
707 5488 naderman
        * Destroy cached results, that might be outdated after deleting a post
708 5488 naderman
        */
709 6152 naderman
        function index_remove($post_ids, $author_ids, $forum_ids)
710 5488 naderman
        {
711 5488 naderman
                $this->destroy_cache(array(), $author_ids);
712 5488 naderman
        }
713 5488 naderman
714 5488 naderman
        /**
715 5488 naderman
        * Destroy old cache entries
716 5488 naderman
        */
717 5488 naderman
        function tidy()
718 5488 naderman
        {
719 5488 naderman
                global $db, $config;
720 5488 naderman
721 5488 naderman
                // destroy too old cached search results
722 5488 naderman
                $this->destroy_cache(array());
723 5929 acydburn
724 5929 acydburn
                set_config('search_last_gc', time(), true);
725 5488 naderman
        }
726 5636 naderman
727 5636 naderman
        /**
728 5636 naderman
        * Create fulltext index
729 5636 naderman
        */
730 5636 naderman
        function create_index($acp_module, $u_action)
731 5636 naderman
        {
732 5636 naderman
                global $db;
733 5636 naderman
734 5727 naderman
                // Make sure we can actually use MySQL with fulltext indexes
735 5727 naderman
                if ($error = $this->init())
736 5636 naderman
                {
737 5727 naderman
                        return $error;
738 5636 naderman
                }
739 5636 naderman
740 6211 naderman
                if (empty($this->stats))
741 5636 naderman
                {
742 5636 naderman
                        $this->get_stats();
743 5636 naderman
                }
744 5636 naderman
745 6774 naderman
                $alter = array();
746 6774 naderman
747 5636 naderman
                if (!isset($this->stats['post_subject']))
748 5636 naderman
                {
749 8814 acydburn
                        if ($db->sql_layer == 'mysqli' || version_compare($db->sql_server_info(true), '4.1.3', '>='))
750 6774 naderman
                        {
751 7675 davidmj
                                //$alter[] = 'MODIFY post_subject varchar(100) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';
752 6774 naderman
                        }
753 7371 davidmj
                        else
754 7371 davidmj
                        {
755 7372 davidmj
                                $alter[] = 'MODIFY post_subject text NOT NULL';
756 7371 davidmj
                        }
757 6774 naderman
                        $alter[] = 'ADD FULLTEXT (post_subject)';
758 5636 naderman
                }
759 5636 naderman
760 5636 naderman
                if (!isset($this->stats['post_text']))
761 5636 naderman
                {
762 8814 acydburn
                        if ($db->sql_layer == 'mysqli' || version_compare($db->sql_server_info(true), '4.1.3', '>='))
763 6774 naderman
                        {
764 6774 naderman
                                $alter[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';
765 6774 naderman
                        }
766 7371 davidmj
                        else
767 7371 davidmj
                        {
768 7372 davidmj
                                $alter[] = 'MODIFY post_text mediumtext NOT NULL';
769 7371 davidmj
                        }
770 6774 naderman
                        $alter[] = 'ADD FULLTEXT (post_text)';
771 5636 naderman
                }
772 5636 naderman
773 7385 naderman
                if (!isset($this->stats['post_content']))
774 7385 naderman
                {
775 7385 naderman
                        $alter[] = 'ADD FULLTEXT post_content (post_subject, post_text)';
776 7385 naderman
                }
777 7385 naderman
778 6774 naderman
                if (sizeof($alter))
779 6774 naderman
                {
780 6774 naderman
                        $db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
781 6774 naderman
                }
782 6774 naderman
783 6021 acydburn
                $db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
784 5967 acydburn
785 5967 acydburn
                return false;
786 5636 naderman
        }
787 5636 naderman
788 5636 naderman
        /**
789 5636 naderman
        * Drop fulltext index
790 5636 naderman
        */
791 5636 naderman
        function delete_index($acp_module, $u_action)
792 5636 naderman
        {
793 5636 naderman
                global $db;
794 5636 naderman
795 5727 naderman
                // Make sure we can actually use MySQL with fulltext indexes
796 5727 naderman
                if ($error = $this->init())
797 5636 naderman
                {
798 5727 naderman
                        return $error;
799 5636 naderman
                }
800 5636 naderman
801 6211 naderman
                if (empty($this->stats))
802 5636 naderman
                {
803 5636 naderman
                        $this->get_stats();
804 5636 naderman
                }
805 5636 naderman
806 6774 naderman
                $alter = array();
807 6774 naderman
808 5636 naderman
                if (isset($this->stats['post_subject']))
809 5636 naderman
                {
810 6774 naderman
                        $alter[] = 'DROP INDEX post_subject';
811 5636 naderman
                }
812 5636 naderman
813 5636 naderman
                if (isset($this->stats['post_text']))
814 5636 naderman
                {
815 6774 naderman
                        $alter[] = 'DROP INDEX post_text';
816 5636 naderman
                }
817 5636 naderman
818 7385 naderman
                if (isset($this->stats['post_content']))
819 7385 naderman
                {
820 7385 naderman
                        $alter[] = 'DROP INDEX post_content';
821 7385 naderman
                }
822 7385 naderman
823 6774 naderman
                if (sizeof($alter))
824 6774 naderman
                {
825 6774 naderman
                        $db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
826 6774 naderman
                }
827 6774 naderman
828 6021 acydburn
                $db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
829 5967 acydburn
830 5967 acydburn
                return false;
831 5636 naderman
        }
832 5636 naderman
833 5636 naderman
        /**
834 5636 naderman
        * Returns true if both FULLTEXT indexes exist
835 5636 naderman
        */
836 5636 naderman
        function index_created()
837 5636 naderman
        {
838 6211 naderman
                if (empty($this->stats))
839 5636 naderman
                {
840 5636 naderman
                        $this->get_stats();
841 5636 naderman
                }
842 5636 naderman
843 7385 naderman
                return (isset($this->stats['post_text']) && isset($this->stats['post_subject']) && isset($this->stats['post_content'])) ? true : false;
844 5636 naderman
        }
845 5636 naderman
846 5636 naderman
        /**
847 5636 naderman
        * Returns an associative array containing information about the indexes
848 5636 naderman
        */
849 5636 naderman
        function index_stats()
850 5636 naderman
        {
851 5636 naderman
                global $user;
852 5636 naderman
853 6211 naderman
                if (empty($this->stats))
854 5636 naderman
                {
855 5636 naderman
                        $this->get_stats();
856 5636 naderman
                }
857 5636 naderman
858 5636 naderman
                return array(
859 5636 naderman
                        $user->lang['FULLTEXT_MYSQL_TOTAL_POSTS']                        => ($this->index_created()) ? $this->stats['total_posts'] : 0,
860 6073 acydburn
                );
861 5636 naderman
        }
862 5636 naderman
863 5636 naderman
        function get_stats()
864 5636 naderman
        {
865 5636 naderman
                global $db;
866 5636 naderman
867 6497 acydburn
                if (strpos($db->sql_layer, 'mysql') === false)
868 5727 naderman
                {
869 5727 naderman
                        $this->stats = array();
870 5727 naderman
                        return;
871 5727 naderman
                }
872 5727 naderman
873 5636 naderman
                $sql = 'SHOW INDEX
874 5636 naderman
                        FROM ' . POSTS_TABLE;
875 5636 naderman
                $result = $db->sql_query($sql);
876 5636 naderman
877 5636 naderman
                while ($row = $db->sql_fetchrow($result))
878 5636 naderman
                {
879 5837 naderman
                        // deal with older MySQL versions which didn't use Index_type
880 5837 naderman
                        $index_type = (isset($row['Index_type'])) ? $row['Index_type'] : $row['Comment'];
881 5837 naderman
882 5837 naderman
                        if ($index_type == 'FULLTEXT')
883 5636 naderman
                        {
884 7424 naderman
                                if ($row['Key_name'] == 'post_text')
885 5636 naderman
                                {
886 5636 naderman
                                        $this->stats['post_text'] = $row;
887 5636 naderman
                                }
888 7424 naderman
                                else if ($row['Key_name'] == 'post_subject')
889 5636 naderman
                                {
890 5636 naderman
                                        $this->stats['post_subject'] = $row;
891 5636 naderman
                                }
892 7424 naderman
                                else if ($row['Key_name'] == 'post_content')
893 7385 naderman
                                {
894 7385 naderman
                                        $this->stats['post_content'] = $row;
895 7385 naderman
                                }
896 5636 naderman
                        }
897 5636 naderman
                }
898 5636 naderman
                $db->sql_freeresult($result);
899 5636 naderman
900 5699 acydburn
                $sql = 'SELECT COUNT(post_id) as total_posts
901 5636 naderman
                        FROM ' . POSTS_TABLE;
902 5636 naderman
                $result = $db->sql_query($sql);
903 5699 acydburn
                $this->stats['total_posts'] = (int) $db->sql_fetchfield('total_posts');
904 5636 naderman
                $db->sql_freeresult($result);
905 5636 naderman
        }
906 6941 naderman
907 6941 naderman
        /**
908 6941 naderman
        * Display a note, that UTF-8 support is not available with certain versions of PHP
909 6941 naderman
        */
910 6941 naderman
        function acp()
911 6941 naderman
        {
912 6941 naderman
                global $user, $config;
913 6941 naderman
914 6941 naderman
                $tpl = '
915 6941 naderman
                <dl>
916 7247 davidmj
                        <dt><label>' . $user->lang['FULLTEXT_MYSQL_PCRE'] . '</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_PCRE_EXPLAIN'] . '</span></dt>
917 6941 naderman
                        <dd>' . (($this->pcre_properties) ? $user->lang['YES'] : $user->lang['NO']) . ' (PHP ' . PHP_VERSION . ')</dd>
918 6941 naderman
                </dl>
919 7247 davidmj
                <dl>
920 7247 davidmj
                        <dt><label>' . $user->lang['FULLTEXT_MYSQL_MBSTRING'] . '</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MBSTRING_EXPLAIN'] . '</span></dt>
921 7247 davidmj
                        <dd>' . (($this->mbstring_regex) ? $user->lang['YES'] : $user->lang['NO']). '</dd>
922 7247 davidmj
                </dl>
923 10828 git-gate
                <dl>
924 10828 git-gate
                        <dt><label>' . $user->lang['MIN_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MIN_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
925 10828 git-gate
                        <dd>' . $config['fulltext_mysql_min_word_len'] . '</dd>
926 10828 git-gate
                </dl>
927 10828 git-gate
                <dl>
928 10828 git-gate
                        <dt><label>' . $user->lang['MAX_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MAX_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
929 10828 git-gate
                        <dd>' . $config['fulltext_mysql_max_word_len'] . '</dd>
930 10828 git-gate
                </dl>
931 6941 naderman
                ';
932 6941 naderman
933 6941 naderman
                // These are fields required in the config table
934 6941 naderman
                return array(
935 6941 naderman
                        'tpl'                => $tpl,
936 6941 naderman
                        'config'        => array()
937 6941 naderman
                );
938 6941 naderman
        }
939 5060 psotfx
}