phpBB

Code Changes

File: phpbb/search/fulltext_mysql.php

  Unmodified   Added   Modified   Removed
Line 177Line 177
			$engine === 'MyISAM' ||
// FULLTEXT is supported on InnoDB since MySQL 5.6.4 according to
// http://dev.mysql.com/doc/refman/5.6/en/innodb-storage-engine.html

			$engine === 'MyISAM' ||
// FULLTEXT is supported on InnoDB since MySQL 5.6.4 according to
// http://dev.mysql.com/doc/refman/5.6/en/innodb-storage-engine.html

 
			// We also require https://bugs.mysql.com/bug.php?id=67004 to be
// fixed for proper overall operation. Hence we require 5.6.8.

			$engine === 'InnoDB' &&

			$engine === 'InnoDB' &&

			phpbb_version_compare($this->db->sql_server_info(true), '5.6.4', '>=');

			phpbb_version_compare($this->db->sql_server_info(true), '5.6.8', '>=');


if (!$fulltext_supported)
{


if (!$fulltext_supported)
{

Line 270Line 272

foreach ($this->split_words as $i => $word)
{


foreach ($this->split_words as $i => $word)
{

 
			// Check for not allowed search queries for InnoDB.
// We assume similar restrictions for MyISAM, which is usually even
// slower but not as restrictive as InnoDB.
// InnoDB full-text search does not support the use of a leading
// plus sign with wildcard ('+*'), a plus and minus sign
// combination ('+-'), or leading a plus and minus sign combination.
// InnoDB full-text search only supports leading plus or minus signs.
// For example, InnoDB supports '+apple' but does not support 'apple+'.
// Specifying a trailing plus or minus sign causes InnoDB to report
// a syntax error. InnoDB full-text search does not support the use
// of multiple operators on a single search word, as in this example:
// '++apple'. Use of multiple operators on a single search word
// returns a syntax error to standard out.
// Also, ensure that the wildcard character is only used at the
// end of the line as it's intended by MySQL.
if (preg_match('#^(\+[+-]|\+\*|.+[+-]$|.+\*(?!$))#', $word))
{
unset($this->split_words[$i]);
continue;
}


			$clean_word = preg_replace('#^[+\-|"]#', '', $word);

// check word length

			$clean_word = preg_replace('#^[+\-|"]#', '', $word);

// check word length

Line 379Line 402
		}

// generate a search_key from all the options to identify the results

		}

// generate a search_key from all the options to identify the results

		$search_key = md5(implode('#', array(

		$search_key_array = array(

			implode(', ', $this->split_words),
$type,
$fields,

			implode(', ', $this->split_words),
$type,
$fields,

Line 390Line 413
			implode(',', $ex_fid_ary),
$post_visibility,
implode(',', $author_ary)

			implode(',', $ex_fid_ary),
$post_visibility,
implode(',', $author_ary)

		)));

































		);

/**
* Allow changing the search_key for cached results
*
* @event core.search_mysql_by_keyword_modify_search_key
* @var array search_key_array Array with search parameters to generate the search_key
* @var string type Searching type ('posts', 'topics')
* @var string fields Searching fields ('titleonly', 'msgonly', 'firstpost', 'all')
* @var string terms Searching terms ('all', 'any')
* @var int sort_days Time, in days, of the oldest possible post to list
* @var string sort_key The sort type used from the possible sort types
* @var int topic_id Limit the search to this topic_id only
* @var array ex_fid_ary Which forums not to search on
* @var string post_visibility Post visibility data
* @var array author_ary Array of user_id containing the users to filter the results to
* @since 3.1.7-RC1
*/
$vars = array(
'search_key_array',
'type',
'fields',
'terms',
'sort_days',
'sort_key',
'topic_id',
'ex_fid_ary',
'post_visibility',
'author_ary',
);
extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_by_keyword_modify_search_key', compact($vars)));

$search_key = md5(implode('#', $search_key_array));


if ($start < 0)
{


if ($start < 0)
{

Line 610Line 665
		}

// generate a search_key from all the options to identify the results

		}

// generate a search_key from all the options to identify the results

		$search_key = md5(implode('#', array(

		$search_key_array = array(

			'',
$type,
($firstpost_only) ? 'firstpost' : '',

			'',
$type,
($firstpost_only) ? 'firstpost' : '',

Line 623Line 678
			$post_visibility,
implode(',', $author_ary),
$author_name,

			$post_visibility,
implode(',', $author_ary),
$author_name,

		)));

































		);

/**
* Allow changing the search_key for cached results
*
* @event core.search_mysql_by_author_modify_search_key
* @var array search_key_array Array with search parameters to generate the search_key
* @var string type Searching type ('posts', 'topics')
* @var boolean firstpost_only Flag indicating if only topic starting posts are considered
* @var int sort_days Time, in days, of the oldest possible post to list
* @var string sort_key The sort type used from the possible sort types
* @var int topic_id Limit the search to this topic_id only
* @var array ex_fid_ary Which forums not to search on
* @var string post_visibility Post visibility data
* @var array author_ary Array of user_id containing the users to filter the results to
* @var string author_name The username to search on
* @since 3.1.7-RC1
*/
$vars = array(
'search_key_array',
'type',
'firstpost_only',
'sort_days',
'sort_key',
'topic_id',
'ex_fid_ary',
'post_visibility',
'author_ary',
'author_name',
);
extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_by_author_modify_search_key', compact($vars)));

$search_key = md5(implode('#', $search_key_array));


if ($start < 0)
{


if ($start < 0)
{

Line 685Line 772
		*									Set to 0 to force a re-count
* @var string sql_sort_table CROSS JOIN'ed table to allow doing the sort chosen
* @var string sql_sort_join Condition to define how to join the CROSS JOIN'ed table specifyed in sql_sort_table

		*									Set to 0 to force a re-count
* @var string sql_sort_table CROSS JOIN'ed table to allow doing the sort chosen
* @var string sql_sort_join Condition to define how to join the CROSS JOIN'ed table specifyed in sql_sort_table

 
		* @var	string	type				Either "posts" or "topics" specifying the type of search being made

		* @var	array	author_ary			Array of user_id containing the users to filter the results to
* @var string author_name An extra username to search on
* @var string sql_author SQL WHERE condition for the post author ids

		* @var	array	author_ary			Array of user_id containing the users to filter the results to
* @var string author_name An extra username to search on
* @var string sql_author SQL WHERE condition for the post author ids

Line 697Line 785
		* @var	string	sort_days			Time, in days, that the oldest post showing can have
* @var string sql_time The SQL to search on the time specifyed by sort_days
* @var bool firstpost_only Wether or not to search only on the first post of the topics

		* @var	string	sort_days			Time, in days, that the oldest post showing can have
* @var string sql_time The SQL to search on the time specifyed by sort_days
* @var bool firstpost_only Wether or not to search only on the first post of the topics

 
		* @var	string	sql_firstpost		The SQL with the conditions to join the tables when using firstpost_only

		* @var	array	ex_fid_ary			Forum ids that must not be searched on
* @var array sql_fora SQL query for ex_fid_ary
* @var string m_approve_fid_sql WHERE clause condition on post_visibility restrictions

		* @var	array	ex_fid_ary			Forum ids that must not be searched on
* @var array sql_fora SQL query for ex_fid_ary
* @var string m_approve_fid_sql WHERE clause condition on post_visibility restrictions

Line 707Line 796
			'result_count',
'sql_sort_table',
'sql_sort_join',

			'result_count',
'sql_sort_table',
'sql_sort_join',

 
			'type',

			'author_ary',
'author_name',
'sql_author',

			'author_ary',
'author_name',
'sql_author',

Line 719Line 809
			'sort_days',
'sql_time',
'firstpost_only',

			'sort_days',
'sql_time',
'firstpost_only',

 
			'sql_firstpost',

			'ex_fid_ary',
'sql_fora',
'm_approve_fid_sql',

			'ex_fid_ary',
'sql_fora',
'm_approve_fid_sql',

Line 872Line 963
			$this->get_stats();
}


			$this->get_stats();
}


		$alter = array();

		$alter_list = array();


if (!isset($this->stats['post_subject']))
{


if (!isset($this->stats['post_subject']))
{

 
			$alter_entry = array();

			if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
{

			if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
{

				$alter[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';

				$alter_entry[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';

			}
else
{

			}
else
{

				$alter[] = 'MODIFY post_subject text NOT NULL';

				$alter_entry[] = 'MODIFY post_subject text NOT NULL';

			}

			}

			$alter[] = 'ADD FULLTEXT (post_subject)';


			$alter_entry[] = 'ADD FULLTEXT (post_subject)';
$alter_list[] = $alter_entry;

		}

if (!isset($this->stats['post_content']))
{

		}

if (!isset($this->stats['post_content']))
{

 
			$alter_entry = array();

			if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
{

			if ($this->db->get_sql_layer() == 'mysqli' || version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
{

				$alter[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';

				$alter_entry[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';

			}
else
{

			}
else
{

				$alter[] = 'MODIFY post_text mediumtext NOT NULL';

				$alter_entry[] = 'MODIFY post_text mediumtext NOT NULL';

			}


			}


			$alter[] = 'ADD FULLTEXT post_content (post_text, post_subject)';


			$alter_entry[] = 'ADD FULLTEXT post_content (post_text, post_subject)';
$alter_list[] = $alter_entry;

		}


		}


		if (sizeof($alter))



		if (sizeof($alter_list))
{
foreach ($alter_list as $alter)

		{
$this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));

		{
$this->db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));

 
			}

		}

$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);

		}

$this->db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);