summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
authorMichael Foster <savetheinternet@tinyboard.org>2013-07-20 12:05:42 -0400
committerMichael Foster <savetheinternet@tinyboard.org>2013-07-20 12:05:42 -0400
commitb776e0a7f005846d80716febc12f8cdf40d1d149 (patch)
treeea4bf020913ba3e301c0711497626e632f2f0f4c /inc
parente62b83e79c8ed3b9ddf6e7e4b8bdeedc0d319ff4 (diff)
Search update
Diffstat (limited to 'inc')
-rw-r--r--inc/config.php4
-rw-r--r--inc/mod/pages.php44
2 files changed, 35 insertions, 13 deletions
diff --git a/inc/config.php b/inc/config.php
index 9706178c..424d07d6 100644
--- a/inc/config.php
+++ b/inc/config.php
@@ -857,8 +857,8 @@
// Number of news entries to display per page
$config['mod']['news_page'] = 40;
- // Maximum number of results to display for a search, per board
- $config['mod']['search_results'] = 75;
+ // Number of results to dispaly per page
+ $config['mod']['search_page'] = 200;
// How many entries to show per page in the moderator noticeboard
$config['mod']['noticeboard_page'] = 50;
diff --git a/inc/mod/pages.php b/inc/mod/pages.php
index fc5577bc..79d87ba1 100644
--- a/inc/mod/pages.php
+++ b/inc/mod/pages.php
@@ -168,7 +168,7 @@ function mod_search_redirect() {
if (!hasPermission($config['mod']['search']))
error($config['error']['noaccess']);
- if (isset($_POST['query'], $_POST['type']) && in_array($_POST['type'], array('posts', 'IP_notes', 'bans'))) {
+ if (isset($_POST['query'], $_POST['type']) && in_array($_POST['type'], array('posts', 'IP_notes', 'bans', 'log'))) {
$query = $_POST['query'];
$query = urlencode($query);
$query = str_replace('_', '%5F', $query);
@@ -180,14 +180,14 @@ function mod_search_redirect() {
}
}
-function mod_search($type, $query) {
+function mod_search($type, $search_query_escaped, $page_no = 1) {
global $pdo, $config;
if (!hasPermission($config['mod']['search']))
error($config['error']['noaccess']);
// Unescape query
- $query = str_replace('_', ' ', $query);
+ $query = str_replace('_', ' ', $search_query_escaped);
$query = urldecode($query);
$search_query = $query;
@@ -207,8 +207,9 @@ function mod_search($type, $query) {
$match = array();
// Exact phrases ("like this")
- if (preg_match_all('/"(.+?)"/', $query, $matches)) {
- foreach ($matches[1] as $phrase) {
+ if (preg_match_all('/"(.+?)"/', $query, $exact_phrases)) {
+ $exact_phrases = $exact_phrases[1];
+ foreach ($exact_phrases as $phrase) {
$query = str_replace("\"{$phrase}\"", '', $query);
$match[] = $pdo->quote($phrase);
}
@@ -229,6 +230,8 @@ function mod_search($type, $query) {
$sql_field = 'body';
if ($type == 'bans')
$sql_field = 'reason';
+ if ($type == 'log')
+ $sql_field = 'text';
// Build the "LIKE 'this' AND LIKE 'that'" etc. part of the SQL query
$sql_like = '';
@@ -239,19 +242,37 @@ function mod_search($type, $query) {
$sql_like .= '`' . $sql_field . '` LIKE ' . $phrase . ' ESCAPE \'!\'';
}
+
+ // Compile SQL query
+
if ($type == 'posts') {
error('Searching posts is under development. Sorry.');
}
if ($type == 'IP_notes') {
- $query = query('SELECT * FROM `ip_notes` LEFT JOIN `mods` ON `mod` = `mods`.`id` WHERE ' . $sql_like . ' ORDER BY `time` DESC') or error(db_error());
- $results = $query->fetchAll(PDO::FETCH_ASSOC);
+ $query = 'SELECT * FROM `ip_notes` LEFT JOIN `mods` ON `mod` = `mods`.`id` WHERE ' . $sql_like . ' ORDER BY `time` DESC';
+ $sql_table = 'ip_notes';
}
if ($type == 'bans') {
- $query = query('SELECT `bans`.*, `username` FROM `bans` LEFT JOIN `mods` ON `mod` = `mods`.`id` WHERE ' . $sql_like . ' ORDER BY (`expires` IS NOT NULL AND `expires` < UNIX_TIMESTAMP()), `set`') or error(db_error());
- $results = $query->fetchAll(PDO::FETCH_ASSOC);
+ $query = 'SELECT `bans`.*, `username` FROM `bans` LEFT JOIN `mods` ON `mod` = `mods`.`id` WHERE ' . $sql_like . ' ORDER BY (`expires` IS NOT NULL AND `expires` < UNIX_TIMESTAMP()), `set` DESC';
+ $sql_table = 'bans';
+ }
+
+ if ($type == 'log') {
+ $query = 'SELECT `username`, `mod`, `ip`, `board`, `time`, `text` FROM `modlogs` LEFT JOIN `mods` ON `mod` = `mods`.`id` WHERE ' . $sql_like . ' ORDER BY `time` DESC';
+ $sql_table = 'modlogs';
+ }
+ // Execute SQL query (with pages)
+ $q = query($query . ' LIMIT ' . (($page_no - 1) * $config['mod']['search_page']) . ', ' . $config['mod']['search_page']) or error(db_error());
+ $results = $q->fetchAll(PDO::FETCH_ASSOC);
+
+ // Get total result count
+ $q = query('SELECT COUNT(*) FROM `' . $sql_table . '` WHERE ' . $sql_like) or error(db_error());
+ $result_count = $q->fetchColumn();
+
+ if ($type == 'bans') {
foreach ($results as &$ban) {
if (filter_var($ban['ip'], FILTER_VALIDATE_IP) !== false)
$ban['real_ip'] = true;
@@ -259,11 +280,12 @@ function mod_search($type, $query) {
}
// $results now contains the search results
-
+
mod_page(_('Search results'), 'mod/search_results.html', array(
'search_type' => $type,
'search_query' => $search_query,
- 'result_count' => count($results),
+ 'search_query_escaped' => $search_query_escaped,
+ 'result_count' => $result_count,
'results' => $results
));
}