phpBB

Code Changes

File: phpbb/search/fulltext_mysql.php

  Unmodified   Added   Modified   Removed
Line 83Line 83
	 * @param string $phpEx PHP file extension
* @param \phpbb\auth\auth $auth Auth object
* @param \phpbb\config\config $config Config object

	 * @param string $phpEx PHP file extension
* @param \phpbb\auth\auth $auth Auth object
* @param \phpbb\config\config $config Config object

	 * @param \phpbb\db\driver\driver_interface Database object

	 * @param \phpbb\db\driver\driver_interface $db Database object

	 * @param \phpbb\user $user User object
* @param \phpbb\event\dispatcher_interface $phpbb_dispatcher Event dispatcher object
*/

	 * @param \phpbb\user $user User object
* @param \phpbb\event\dispatcher_interface $phpbb_dispatcher Event dispatcher object
*/

Line 173Line 173
			$engine = $info['Type'];
}


			$engine = $info['Type'];
}


		$fulltext_supported =
$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' &&
phpbb_version_compare($this->db->sql_server_info(true), '5.6.8', '>=');


		$fulltext_supported = $engine === 'Aria' || $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'
&& phpbb_version_compare($this->db->sql_server_info(true), '5.6.8', '>=');


if (!$fulltext_supported)
{


if (!$fulltext_supported)
{

Line 231Line 232
		}

// Filter out as above

		}

// Filter out as above

		$split_keywords = preg_replace("#[\n\r\t]+#", ' ', trim(htmlspecialchars_decode($keywords)));

		$split_keywords = preg_replace("#[\n\r\t]+#", ' ', trim(html_entity_decode($keywords, ENT_COMPAT)));


// Split words
$split_keywords = preg_replace('#([^\p{L}\p{N}\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords)));


// Split words
$split_keywords = preg_replace('#([^\p{L}\p{N}\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords)));

Line 567Line 568
		);
extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_keywords_main_query_before', compact($vars)));


		);
extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_keywords_main_query_before', compact($vars)));


		$sql_select			= (!$result_count) ? 'SQL_CALC_FOUND_ROWS ' : '';
$sql_select = ($type == 'posts') ? $sql_select . 'p.post_id' : 'DISTINCT ' . $sql_select . 't.topic_id';

		$sql_select			= ($type == 'posts') ? 'DISTINCT p.post_id' : 'DISTINCT t.topic_id';
$sql_select .= $sort_by_sql[$sort_key] ? ", {$sort_by_sql[$sort_key]}" : '';

		$sql_from			= ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
$field = ($type == 'posts') ? 'post_id' : 'topic_id';
if (count($author_ary) && $author_name)

		$sql_from			= ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
$field = ($type == 'posts') ? 'post_id' : 'topic_id';
if (count($author_ary) && $author_name)

Line 596Line 597

$sql = "SELECT $sql_select
FROM $sql_from$sql_sort_table" . POSTS_TABLE . " p


$sql = "SELECT $sql_select
FROM $sql_from$sql_sort_table" . POSTS_TABLE . " p

			WHERE MATCH ($sql_match) AGAINST ('" . $this->db->sql_escape(htmlspecialchars_decode($this->search_query)) . "' IN BOOLEAN MODE)

			WHERE MATCH ($sql_match) AGAINST ('" . $this->db->sql_escape(html_entity_decode($this->search_query, ENT_COMPAT)) . "' IN BOOLEAN MODE)

				$sql_where_options
ORDER BY $sql_sort";
$this->db->sql_return_on_error(true);

				$sql_where_options
ORDER BY $sql_sort";
$this->db->sql_return_on_error(true);

Line 609Line 610
		$this->db->sql_freeresult($result);

$id_ary = array_unique($id_ary);

		$this->db->sql_freeresult($result);

$id_ary = array_unique($id_ary);



 
		// if the total result count is not cached yet, retrieve it from the db
if (!$result_count && count($id_ary))
{

		// if the total result count is not cached yet, retrieve it from the db
if (!$result_count && count($id_ary))
{

			$sql_found_rows = 'SELECT FOUND_ROWS() as result_count';

			$sql_found_rows = str_replace("SELECT $sql_select", "SELECT COUNT($sql_select) as result_count", $sql);

			$result = $this->db->sql_query($sql_found_rows);
$result_count = (int) $this->db->sql_fetchfield('result_count');
$this->db->sql_freeresult($result);

			$result = $this->db->sql_query($sql_found_rows);
$result_count = (int) $this->db->sql_fetchfield('result_count');
$this->db->sql_freeresult($result);

Line 827Line 827
		extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_author_query_before', compact($vars)));

// If the cache was completely empty count the results

		extract($this->phpbb_dispatcher->trigger_event('core.search_mysql_author_query_before', compact($vars)));

// If the cache was completely empty count the results

		$calc_results = ($result_count) ? '' : 'SQL_CALC_FOUND_ROWS ';


		$sql_select	= ($type == 'posts') ? 'p.post_id' : 't.topic_id';
$sql_select .= $sort_by_sql[$sort_key] ? ", {$sort_by_sql[$sort_key]}" : '';


// Build the query for really selecting the post_ids
if ($type == 'posts')
{


// Build the query for really selecting the post_ids
if ($type == 'posts')
{

			$sql = "SELECT {$calc_results}p.post_id

			$sql = "SELECT $sql_select

				FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t ' : ' ') . "
WHERE $sql_author
$sql_topic_id

				FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t ' : ' ') . "
WHERE $sql_author
$sql_topic_id

Line 846Line 847
		}
else
{

		}
else
{

			$sql = "SELECT {$calc_results}t.topic_id

			$sql = "SELECT $sql_select

				FROM " . $sql_sort_table . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
WHERE $sql_author
$sql_topic_id

				FROM " . $sql_sort_table . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
WHERE $sql_author
$sql_topic_id

Line 856Line 857
					AND t.topic_id = p.topic_id
$sql_sort_join
$sql_time

					AND t.topic_id = p.topic_id
$sql_sort_join
$sql_time

				GROUP BY t.topic_id

				GROUP BY $sql_select

				ORDER BY $sql_sort";
$field = 'topic_id';
}

				ORDER BY $sql_sort";
$field = 'topic_id';
}

Line 873Line 874
		// retrieve the total result count if needed
if (!$result_count)
{

		// retrieve the total result count if needed
if (!$result_count)
{

			$sql_found_rows = 'SELECT FOUND_ROWS() as result_count';

			$sql_found_rows = str_replace("SELECT $sql_select", "SELECT COUNT(*) as result_count", $sql);

			$result = $this->db->sql_query($sql_found_rows);

			$result = $this->db->sql_query($sql_found_rows);

			$result_count = (int) $this->db->sql_fetchfield('result_count');


			$result_count = ($type == 'posts') ? (int) $this->db->sql_fetchfield('result_count') : count($this->db->sql_fetchrowset($result));


			$this->db->sql_freeresult($result);

if (!$result_count)

			$this->db->sql_freeresult($result);

if (!$result_count)