|
@@ -1,13 +1,13 @@
|
|
|
<?php
|
|
|
session_start();
|
|
|
|
|
|
-if (htmlspecialchars($_COOKIE['ws']) == "0")
|
|
|
+if (isset($_COOKIE['ws']) && htmlspecialchars($_COOKIE['ws']) == "0")
|
|
|
{
|
|
|
$worksafe = false;
|
|
|
}else{
|
|
|
$worksafe = true;
|
|
|
}
|
|
|
-if (htmlspecialchars($_COOKIE['hs']) == "1")
|
|
|
+if (isset($_COOKIE['hs']) && htmlspecialchars($_COOKIE['hs']) == "1")
|
|
|
{
|
|
|
$filterHTTPS = true;
|
|
|
}else{
|
|
@@ -15,11 +15,8 @@ if (htmlspecialchars($_COOKIE['hs']) == "1")
|
|
|
}
|
|
|
|
|
|
if (!isset($_REQUEST['q']))
|
|
|
-
|
|
|
{
|
|
|
-
|
|
|
include 'form.html.php';
|
|
|
-
|
|
|
}
|
|
|
|
|
|
else
|
|
@@ -40,7 +37,13 @@ else
|
|
|
{
|
|
|
include 'form.html.php';
|
|
|
exit();
|
|
|
- }
|
|
|
+ }
|
|
|
+ //check if doing a more general search
|
|
|
+ $general=false;
|
|
|
+ if (isset($_REQUEST['g']))
|
|
|
+ {
|
|
|
+ $general=true;
|
|
|
+ }
|
|
|
|
|
|
//fix phone users putting space at end
|
|
|
if(strlen($query) > 1 && $query[strlen($query)-1]==" "){
|
|
@@ -120,7 +123,8 @@ else
|
|
|
//add to additions
|
|
|
$additions = $additions."AND url LIKE '%".$site."%' ";
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ $page=0;
|
|
|
if (!isset($_REQUEST['p']))
|
|
|
{
|
|
|
$offset=0;
|
|
@@ -128,11 +132,12 @@ else
|
|
|
else
|
|
|
{
|
|
|
$page = mysqli_real_escape_string($link, $_GET['p']);
|
|
|
- if($page > 0)
|
|
|
+ $offset = $page;
|
|
|
+ if($offset > 0)
|
|
|
{
|
|
|
- $page--;
|
|
|
+ $offset--;
|
|
|
}
|
|
|
- $offset = $page * $lim;
|
|
|
+ $offset = $offset * $lim;
|
|
|
}
|
|
|
|
|
|
if (!$link)
|
|
@@ -176,6 +181,10 @@ else
|
|
|
if(strlen($query) < 3 || $query == "cia" || $query == "CIA"){
|
|
|
$query = " ".$query." *";
|
|
|
}
|
|
|
+ if($query == "c++" || $query == "C++"){//shitty but works
|
|
|
+ $query = "c++ programming";
|
|
|
+ }
|
|
|
+
|
|
|
$queryNoQuotes = $query;
|
|
|
|
|
|
//Are there quotes in the query?
|
|
@@ -183,7 +192,6 @@ else
|
|
|
if(strpos($queryNoQuotes,'"') !== false)
|
|
|
{
|
|
|
$exactMatch = true;
|
|
|
- $queryNoQuotes = $query;
|
|
|
}
|
|
|
|
|
|
//alright then lets remove the quotes
|
|
@@ -197,7 +205,8 @@ else
|
|
|
|
|
|
//first remove any flags inside queryNoQuotes, also grab any required words (+ prefix)
|
|
|
$queryNoQuotesOrFlags = '';
|
|
|
- $requiredword = '';
|
|
|
+ $requiredword = '';
|
|
|
+ $flags = '';
|
|
|
if(strpos($queryNoQuotes,'+') !== false || strpos($queryNoQuotes,'-') !== false){
|
|
|
$words = explode(' ', $queryNoQuotes);
|
|
|
$i = 0;
|
|
@@ -210,6 +219,9 @@ else
|
|
|
}
|
|
|
if ($word[0] == '+' && strlen($word) > 1){
|
|
|
$requiredword = substr($word,1);
|
|
|
+ }
|
|
|
+ if ($word[0] == '-' && $word[0] == '+'){
|
|
|
+ $flags .= " $word";
|
|
|
}
|
|
|
$i++;
|
|
|
}
|
|
@@ -221,6 +233,7 @@ else
|
|
|
}
|
|
|
|
|
|
$queryNoQuotes_SQLsafe = mysqli_real_escape_string($link, $queryNoQuotes);
|
|
|
+ $flags = mysqli_real_escape_string($link, $flags);
|
|
|
|
|
|
if($exactMatch == false)
|
|
|
{
|
|
@@ -238,31 +251,7 @@ else
|
|
|
}
|
|
|
$wordcount++;
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- //Check if query contains a hyphenated word. MySQL is finicky about them. We will wrap quotes around hyphenated words that aren't part of a string which is already wraped in quotes.
|
|
|
- if((strpos($queryNoQuotes,'-') !== false || strpos($queryNoQuotes,'+') !== false) && $urlDetected == false){
|
|
|
- if($query == "c++" || $query == "C++"){//shitty but works
|
|
|
- $query = "c++ programming";
|
|
|
- }
|
|
|
- $hyphenwords = explode(' ',$query);
|
|
|
- $query = '';
|
|
|
- $quotes = 0;
|
|
|
- $i = 0;
|
|
|
- foreach ($hyphenwords as $word) {
|
|
|
- if(strpos($queryNoQuotes,'"') !== false){
|
|
|
- $quotes++;
|
|
|
- }
|
|
|
- if(((strpos($queryNoQuotes,'-') !== false && $word[0] != '-') || (strpos($queryNoQuotes,'+') !== false && $word[0] != '+')) && $quotes%2 == 0){//if hyphen exists, not a flag, not wrapped in quotes already
|
|
|
- $word = '"' . $word . '"';
|
|
|
- }
|
|
|
- if($i > 0){
|
|
|
- $query .= ' ';
|
|
|
- }
|
|
|
- $query .= $word;
|
|
|
- $i++;
|
|
|
- }
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
if($filterHTTPS == true){
|
|
|
$additions = $additions."AND http = '1' ";
|
|
@@ -271,183 +260,365 @@ else
|
|
|
$additions = $additions."AND worksafe = '1' ";
|
|
|
}
|
|
|
|
|
|
- //perform full text search FOR InnoDB or MyISAM STORAGE ENGINE
|
|
|
- $outputFTS = mysqli_query($link, "SELECT id, url, title, description, body FROM windex WHERE Match(tags, body, description, title, url) Against('$query' IN BOOLEAN MODE) AND enable = '1' $additions ORDER BY CASE WHEN LOCATE('$queryNoQuotes_SQLsafe', tags)>0 THEN 30 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 AND Match(title) AGAINST('$query' IN BOOLEAN MODE) THEN 20 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 THEN 16 WHEN LOCATE('$queryNoQuotes_SQLsafe', body)>0 THEN 15 WHEN Match(title) AGAINST('$query' IN BOOLEAN MODE) THEN Match(title) AGAINST('$query' IN BOOLEAN MODE) END DESC, id DESC LIMIT $lim OFFSET $offset");
|
|
|
-
|
|
|
- /*if(!$outputFTS)//dont error out yet, will give another try below
|
|
|
- {
|
|
|
- $error = 'Error ' . mysqli_error($link);
|
|
|
- include 'error.html.php';
|
|
|
- exit();
|
|
|
- }*/
|
|
|
+ $count = 0;
|
|
|
|
|
|
- if($urlDetected == 1)
|
|
|
- {
|
|
|
- $query = $queryOriginal;
|
|
|
- }
|
|
|
-
|
|
|
- //perform full text search with * appended
|
|
|
- if(mysqli_num_rows($outputFTS) == 0 && $offset == 0 && $urlDetected == 0 && $exactMatch == false)
|
|
|
- {
|
|
|
- $starappend = 1;
|
|
|
- $querystar = $query;
|
|
|
- //innodb will get fussy over some things if put in like '''' or ****, uncomment below lines if using innoDB
|
|
|
- $querystar = str_replace('*', "",$querystar);
|
|
|
- $querystar = str_replace('"', "",$querystar);
|
|
|
- $querystar = str_replace('"', "",$querystar);
|
|
|
- $querystar = str_replace('\'', "",$querystar);
|
|
|
- //-----------------------------------------------
|
|
|
-
|
|
|
- $querystar = $querystar . '*';
|
|
|
+ if(!$general){
|
|
|
+ $queryWithQuotesAndFlags = '"'. $queryNoQuotes_SQLsafe.'"'.$flags.'';
|
|
|
|
|
|
//perform full text search FOR InnoDB or MyISAM STORAGE ENGINE
|
|
|
- $outputFTS = mysqli_query($link, "SELECT id, url, title, description, body FROM windex WHERE Match(tags, body, description, title, url) Against('$querystar' IN BOOLEAN MODE) AND enable = '1' $additions ORDER BY CASE WHEN LOCATE('$queryNoQuotes_SQLsafe', tags)>0 THEN 30 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 AND Match(title) AGAINST('$querystar' IN BOOLEAN MODE) THEN 20 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 THEN 16 WHEN LOCATE('$queryNoQuotes_SQLsafe', body)>0 THEN 15 WHEN Match(title) AGAINST('$querystar' IN BOOLEAN MODE) THEN Match(title) AGAINST('$querystar' IN BOOLEAN MODE) END DESC, id DESC LIMIT $lim OFFSET $offset");
|
|
|
+ $outputFTS = mysqli_query($link, "SELECT id, url, title, description, body FROM windex WHERE Match(tags, body, description, title, url) Against('$queryWithQuotesAndFlags' IN BOOLEAN MODE) AND enable = '1' $additions ORDER BY CASE WHEN LOCATE('$queryNoQuotes_SQLsafe', tags)>0 THEN 30 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 AND Match(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 20 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 THEN 16 WHEN Match(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN Match(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) END DESC, id DESC LIMIT $lim OFFSET $offset");
|
|
|
|
|
|
- if(!$outputFTS)
|
|
|
+ /*if(!$outputFTS)//dont error out yet, will give another try below
|
|
|
{
|
|
|
$error = 'Error ' . mysqli_error($link);
|
|
|
include 'error.html.php';
|
|
|
exit();
|
|
|
- }
|
|
|
- }
|
|
|
+ }*/
|
|
|
+
|
|
|
+ if($urlDetected == 1)
|
|
|
+ {
|
|
|
+ $query = $queryOriginal;
|
|
|
+ }
|
|
|
|
|
|
- $count = 0;
|
|
|
+ //this will get set if position of longest word of query is found within body
|
|
|
+ $pos = -1;
|
|
|
|
|
|
- $query = $_GET['q'];
|
|
|
-
|
|
|
- //this will get set if position of longest word of query is found within body
|
|
|
- $pos = -1;
|
|
|
+ //lets put contents of the full text search into the array
|
|
|
+ while($row = mysqli_fetch_array($outputFTS))
|
|
|
+ {
|
|
|
+ //put the contents of the URL column within the DB into an array
|
|
|
+ $id[] = $row[0];
|
|
|
+ $url[] = $row[1];
|
|
|
+ $title[] = substr($row[2],0,150);
|
|
|
+ $description[] = substr($row[3],0,180);
|
|
|
+ $body = $row[4];
|
|
|
+ $count++;
|
|
|
+ $lastID = $row[0];
|
|
|
+
|
|
|
+ if($exactMatch == false)
|
|
|
+ {
|
|
|
+ //remove the '*' at the end of the longest word if present
|
|
|
+ if(strpos($longestWord,'*') == true)
|
|
|
+ {
|
|
|
+ $longestWord = str_replace('*', "",$longestWord);
|
|
|
+ }
|
|
|
|
|
|
- //lets put contents of the full text search into the array
|
|
|
- while($row = mysqli_fetch_array($outputFTS))
|
|
|
- {
|
|
|
- //put the contents of the URL column within the DB into an array
|
|
|
- $id[] = $row[0];
|
|
|
- $url[] = $row[1];
|
|
|
- $title[] = substr($row[2],0,150);
|
|
|
- $description[] = substr($row[3],0,180);
|
|
|
- $body = $row[4];
|
|
|
- $count++;
|
|
|
- $lastID = $row[0];
|
|
|
+ //first find an exact
|
|
|
+ if(strlen($requiredword) > 0){
|
|
|
+ $pos = stripos($body, $requiredword);
|
|
|
+ }else{
|
|
|
+ $pos = stripos($body, $queryNoQuotes);
|
|
|
+ }
|
|
|
|
|
|
- if($exactMatch == false)
|
|
|
- {
|
|
|
- //remove the '*' at the end of the longest word if present
|
|
|
- if(strpos($longestWord,'*') == true)
|
|
|
+ //search within body for position of longest query word. If not found, try another word
|
|
|
+ if($pos == false){
|
|
|
+ $pos = stripos($body, $longestWord);
|
|
|
+ if($pos == false && $wordcount > 1)
|
|
|
+ {
|
|
|
+ if($longestwordelementnum > 0)
|
|
|
+ {
|
|
|
+ if(strpos($words[0],'*') == true)//remove the '*' at the end of the query if present
|
|
|
+ $words[0] = str_replace('*', "",$words[0]);
|
|
|
+ $pos = stripos($body, $words[0]);
|
|
|
+ }
|
|
|
+ else if($longestwordelementnum == 0)
|
|
|
+ {
|
|
|
+ if(strpos($words[1],'*') == true)//remove the '*' at the end of the query if present
|
|
|
+ $words[1] = str_replace('*', "",$words[1]);
|
|
|
+ $pos = stripos($body, $words[1]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- $longestWord = str_replace('*', "",$longestWord);
|
|
|
+ $pos = stripos($body, $queryNoQuotes);
|
|
|
+ }
|
|
|
+ //still not found?, set position to 0
|
|
|
+ if($pos == false){
|
|
|
+ $pos = 0;
|
|
|
}
|
|
|
|
|
|
- //first find an exact
|
|
|
- if(strlen($requiredword) > 0){
|
|
|
- $pos = stripos($body, $requiredword);
|
|
|
- }else{
|
|
|
- $pos = stripos($body, $queryNoQuotes);
|
|
|
+ //get all positions of all keywords in body
|
|
|
+ /* $lastPos = 0;
|
|
|
+ $positions = array();
|
|
|
+ foreach($words as $word)
|
|
|
+ {
|
|
|
+ while (($lastPos = mb_strpos($body, $word, $lastPos))!== false) {
|
|
|
+ $positions[$word][] = $lastPos;
|
|
|
+ $lastPos = $lastPos + strlen($word);
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+
|
|
|
+ //figure out how much preceding text to use
|
|
|
+ if($pos < 32)
|
|
|
+ $starttext = 0;
|
|
|
+ else if($pos > 25)
|
|
|
+ $starttext = $pos - 25;
|
|
|
+ else if($pos > 20)
|
|
|
+ $starttext = $pos - 15;
|
|
|
+ //else $starttext = 0;
|
|
|
+
|
|
|
+ //total length of the ballpark
|
|
|
+ $textlength = 180;
|
|
|
+
|
|
|
+ //populate the ballpark
|
|
|
+ if($pos >= 0)
|
|
|
+ {
|
|
|
+ $ballparktext = substr($body,$starttext,$textlength);
|
|
|
}
|
|
|
-
|
|
|
- //search within body for position of longest query word. If not found, try another word
|
|
|
- if($pos == false){
|
|
|
- $pos = stripos($body, $longestWord);
|
|
|
- if($pos == false && $wordcount > 1)
|
|
|
+ else $ballpark = '0';
|
|
|
+
|
|
|
+ //find position of nearest Period
|
|
|
+ $foundPeriod = true;
|
|
|
+ $posPeriod = stripos($ballparktext, '. ') + $starttext +1;
|
|
|
+
|
|
|
+ //find position of nearest Space
|
|
|
+ $foundSpace = true;
|
|
|
+ $posSpace = stripos($ballparktext, ' ') + $starttext;
|
|
|
+
|
|
|
+ //if longest word in query is after a period+space within ballpark, reset $starttext to that point
|
|
|
+ if($pos-$starttext > $posPeriod)
|
|
|
+ {
|
|
|
+ $starttext = $posPeriod;
|
|
|
+ //populate the bodymatch
|
|
|
+ if($pos-$starttext >= 0)
|
|
|
{
|
|
|
- if($longestwordelementnum > 0)
|
|
|
- {
|
|
|
- if(strpos($words[0],'*') == true)//remove the '*' at the end of the query if present
|
|
|
- $words[0] = str_replace('*', "",$words[0]);
|
|
|
- $pos = stripos($body, $words[0]);
|
|
|
- }
|
|
|
- else if($longestwordelementnum == 0)
|
|
|
- {
|
|
|
- if(strpos($words[1],'*') == true)//remove the '*' at the end of the query if present
|
|
|
- $words[1] = str_replace('*', "",$words[1]);
|
|
|
- $pos = stripos($body, $words[1]);
|
|
|
- }
|
|
|
+ $bodymatch[] = substr($body,$starttext,$textlength);
|
|
|
}
|
|
|
+ else $bodymatch[] = '';
|
|
|
}
|
|
|
+ //else if($pos-starttext > $posSpace)//else if longest word in query is after a space within ballpark, reset $starttext to that point
|
|
|
+ else if($pos > $posSpace)//else if longest word in query is after a space within ballpark, reset $starttext to that point
|
|
|
+ {
|
|
|
+ $starttext = $posSpace;
|
|
|
+ //populate the bodymatch
|
|
|
+ if($pos-$starttext >= 0)
|
|
|
+ {
|
|
|
+ $bodymatch[] = substr($body,$starttext,$textlength);
|
|
|
+ }
|
|
|
+ else $bodymatch[] = '';
|
|
|
+ }
|
|
|
+ else //else just set the bodymatch to the ballparktext
|
|
|
+ {
|
|
|
+ //populate the bodymatch
|
|
|
+ if($pos-$starttext >= 0)
|
|
|
+ {
|
|
|
+ $bodymatch[] = $ballparktext;
|
|
|
+ }
|
|
|
+ else $bodymatch[] = '';
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- $pos = stripos($body, $queryNoQuotes);
|
|
|
- }
|
|
|
- //still not found?, set position to 0
|
|
|
- if($pos == false){
|
|
|
- $pos = 0;
|
|
|
+ }
|
|
|
+ $outputFTSrows=$count;
|
|
|
+ //do a general search if exact results peter off
|
|
|
+ if($outputFTSrows < 8 && $exactMatch == false){
|
|
|
+ $count = 0;
|
|
|
+ $general = true;
|
|
|
+
|
|
|
+ //Check if query contains a hyphenated word. MySQL is finicky about them. We will wrap quotes around hyphenated words that aren't part of a string which is already wraped in quotes.
|
|
|
+ if((strpos($queryNoQuotes,'-') !== false || strpos($queryNoQuotes,'+') !== false) && $urlDetected == false){
|
|
|
+ $hyphenwords = explode(' ',$query);
|
|
|
+ $query = '';
|
|
|
+ $quotes = 0;
|
|
|
+ $i = 0;
|
|
|
+ foreach ($hyphenwords as $word) {
|
|
|
+ if(strpos($queryNoQuotes,'"') !== false){
|
|
|
+ $quotes++;
|
|
|
+ }
|
|
|
+ if(((strpos($queryNoQuotes,'-') !== false && $word[0] != '-') || (strpos($queryNoQuotes,'+') !== false && $word[0] != '+')) && $quotes%2 == 0){//if hyphen exists, not a flag, not wrapped in quotes already
|
|
|
+ $word = '"' . $word . '"';
|
|
|
+ }
|
|
|
+ if($i > 0){
|
|
|
+ $query .= ' ';
|
|
|
+ }
|
|
|
+ $query .= $word;
|
|
|
+ $i++;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- //get all positions of all keywords in body
|
|
|
- /* $lastPos = 0;
|
|
|
- $positions = array();
|
|
|
- foreach($words as $word)
|
|
|
- {
|
|
|
- while (($lastPos = mb_strpos($body, $word, $lastPos))!== false) {
|
|
|
- $positions[$word][] = $lastPos;
|
|
|
- $lastPos = $lastPos + strlen($word);
|
|
|
- }
|
|
|
- }*/
|
|
|
-
|
|
|
- //figure out how much preceding text to use
|
|
|
- if($pos < 32)
|
|
|
- $starttext = 0;
|
|
|
- else if($pos > 25)
|
|
|
- $starttext = $pos - 25;
|
|
|
- else if($pos > 20)
|
|
|
- $starttext = $pos - 15;
|
|
|
- //else $starttext = 0;
|
|
|
-
|
|
|
- //total length of the ballpark
|
|
|
- $textlength = 180;
|
|
|
-
|
|
|
- //populate the ballpark
|
|
|
- if($pos >= 0)
|
|
|
+ //perform full text search FOR InnoDB or MyISAM STORAGE ENGINE
|
|
|
+ $outputFTSgeneral = mysqli_query($link, "SELECT id, url, title, description, body FROM windex WHERE Match(tags, body, description, title, url) Against('$query' IN BOOLEAN MODE) AND enable = '1' $additions ORDER BY CASE WHEN LOCATE('$queryNoQuotes_SQLsafe', tags)>0 THEN 30 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 AND Match(title) AGAINST('$query' IN BOOLEAN MODE) THEN 20 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 THEN 16 WHEN Match(title) AGAINST('$query' IN BOOLEAN MODE) THEN Match(title) AGAINST('$query' IN BOOLEAN MODE) END DESC, id DESC LIMIT $lim OFFSET $offset");
|
|
|
+
|
|
|
+
|
|
|
+ //if all else fails, try a full text search with * appended (better to get something than nothing I suppose)
|
|
|
+ if(mysqli_num_rows($outputFTSgeneral) == 0 && $offset == 0 && $urlDetected == 0)
|
|
|
{
|
|
|
- $ballparktext = substr($body,$starttext,$textlength);
|
|
|
- }
|
|
|
- else $ballpark = '0';
|
|
|
+ $starappend = 1;
|
|
|
+ $querystar = $query;
|
|
|
+ //innodb will get fussy over some things if put in like '''' or ****, uncomment below lines if using innoDB
|
|
|
+ $querystar = str_replace('*', "",$querystar);
|
|
|
+ $querystar = str_replace('"', "",$querystar);
|
|
|
+ $querystar = str_replace('"', "",$querystar);
|
|
|
+ $querystar = str_replace('\'', "",$querystar);
|
|
|
+ //-----------------------------------------------
|
|
|
|
|
|
- //find position of nearest Period
|
|
|
- $foundPeriod = true;
|
|
|
- $posPeriod = stripos($ballparktext, '. ') + $starttext +1;
|
|
|
+ $querystar = $querystar . '*';
|
|
|
|
|
|
- //find position of nearest Space
|
|
|
- $foundSpace = true;
|
|
|
- $posSpace = stripos($ballparktext, ' ') + $starttext;
|
|
|
-
|
|
|
- //if longest word in query is after a period+space within ballpark, reset $starttext to that point
|
|
|
- if($pos-$starttext > $posPeriod)
|
|
|
- {
|
|
|
- $starttext = $posPeriod;
|
|
|
- //populate the bodymatch
|
|
|
- if($pos-$starttext >= 0)
|
|
|
+ //perform full text search FOR InnoDB or MyISAM STORAGE ENGINE
|
|
|
+ $outputFTSgeneral = mysqli_query($link, "SELECT id, url, title, description, body FROM windex WHERE Match(tags, body, description, title, url) Against('$querystar' IN BOOLEAN MODE) AND enable = '1' $additions ORDER BY CASE WHEN LOCATE('$queryNoQuotes_SQLsafe', tags)>0 THEN 30 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 AND Match(title) AGAINST('$querystar' IN BOOLEAN MODE) THEN 20 WHEN LOCATE('$queryNoQuotes_SQLsafe', title)>0 THEN 16 WHEN Match(title) AGAINST('$querystar' IN BOOLEAN MODE) THEN Match(title) AGAINST('$querystar' IN BOOLEAN MODE) END DESC, id DESC LIMIT $lim OFFSET $offset");
|
|
|
+
|
|
|
+ if(!$outputFTSgeneral)
|
|
|
{
|
|
|
- $bodymatch[] = substr($body,$starttext,$textlength);
|
|
|
- }
|
|
|
- else $bodymatch[] = '';
|
|
|
+ $error = 'Error ' . mysqli_error($link);
|
|
|
+ include 'error.html.php';
|
|
|
+ exit();
|
|
|
+ }
|
|
|
}
|
|
|
- //else if($pos-starttext > $posSpace)//else if longest word in query is after a space within ballpark, reset $starttext to that point
|
|
|
- else if($pos > $posSpace)//else if longest word in query is after a space within ballpark, reset $starttext to that point
|
|
|
+
|
|
|
+ //this will get set if position of longest word of query is found within body
|
|
|
+ $pos = -1;
|
|
|
+
|
|
|
+ //lets put contents of the full text search into the array
|
|
|
+ while($row = mysqli_fetch_array($outputFTSgeneral))
|
|
|
{
|
|
|
- $starttext = $posSpace;
|
|
|
- //populate the bodymatch
|
|
|
- if($pos-$starttext >= 0)
|
|
|
- {
|
|
|
- $bodymatch[] = substr($body,$starttext,$textlength);
|
|
|
+ $count++;
|
|
|
+ //check for duplicates if appending general search matches on the same page where exact matches were found
|
|
|
+ $duplicate = false;
|
|
|
+ if($outputFTSrows < 8 && $outputFTSrows > 0){
|
|
|
+ foreach($id as $idtocheck){
|
|
|
+ if($idtocheck==$row[0]){
|
|
|
+ $duplicate=true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
- else $bodymatch[] = '';
|
|
|
- }
|
|
|
- else //else just set the bodymatch to the ballparktext
|
|
|
- {
|
|
|
- //populate the bodymatch
|
|
|
- if($pos-$starttext >= 0)
|
|
|
- {
|
|
|
- $bodymatch[] = $ballparktext;
|
|
|
+ if($duplicate==false){
|
|
|
+ //put the contents of the URL column within the DB into an array
|
|
|
+ $id[] = $row[0];
|
|
|
+ $url[] = $row[1];
|
|
|
+ $title[] = substr($row[2],0,150);
|
|
|
+ $description[] = substr($row[3],0,180);
|
|
|
+ $body = $row[4];
|
|
|
+ $lastID = $row[0];
|
|
|
+ if($exactMatch == false)
|
|
|
+ {
|
|
|
+ //remove the '*' at the end of the longest word if present
|
|
|
+ if(strpos($longestWord,'*') == true)
|
|
|
+ {
|
|
|
+ $longestWord = str_replace('*', "",$longestWord);
|
|
|
+ }
|
|
|
+
|
|
|
+ //first find an exact
|
|
|
+ if(strlen($requiredword) > 0){
|
|
|
+ $pos = stripos($body, $requiredword);
|
|
|
+ }else{
|
|
|
+ $pos = stripos($body, $queryNoQuotes);
|
|
|
+ }
|
|
|
+
|
|
|
+ //search within body for position of longest query word. If not found, try another word
|
|
|
+ if($pos == false){
|
|
|
+ $pos = stripos($body, $longestWord);
|
|
|
+ if($pos == false && $wordcount > 1)
|
|
|
+ {
|
|
|
+ if($longestwordelementnum > 0)
|
|
|
+ {
|
|
|
+ if(strpos($words[0],'*') == true)//remove the '*' at the end of the query if present
|
|
|
+ $words[0] = str_replace('*', "",$words[0]);
|
|
|
+ $pos = stripos($body, $words[0]);
|
|
|
+ }
|
|
|
+ else if($longestwordelementnum == 0)
|
|
|
+ {
|
|
|
+ if(strpos($words[1],'*') == true)//remove the '*' at the end of the query if present
|
|
|
+ $words[1] = str_replace('*', "",$words[1]);
|
|
|
+ $pos = stripos($body, $words[1]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ $pos = stripos($body, $queryNoQuotes);
|
|
|
+ }
|
|
|
+ //still not found?, set position to 0
|
|
|
+ if($pos == false){
|
|
|
+ $pos = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //get all positions of all keywords in body
|
|
|
+ /* $lastPos = 0;
|
|
|
+ $positions = array();
|
|
|
+ foreach($words as $word)
|
|
|
+ {
|
|
|
+ while (($lastPos = mb_strpos($body, $word, $lastPos))!== false) {
|
|
|
+ $positions[$word][] = $lastPos;
|
|
|
+ $lastPos = $lastPos + strlen($word);
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+
|
|
|
+ //figure out how much preceding text to use
|
|
|
+ if($pos < 32)
|
|
|
+ $starttext = 0;
|
|
|
+ else if($pos > 25)
|
|
|
+ $starttext = $pos - 25;
|
|
|
+ else if($pos > 20)
|
|
|
+ $starttext = $pos - 15;
|
|
|
+ //else $starttext = 0;
|
|
|
+
|
|
|
+ //total length of the ballpark
|
|
|
+ $textlength = 180;
|
|
|
+
|
|
|
+ //populate the ballpark
|
|
|
+ if($pos >= 0)
|
|
|
+ {
|
|
|
+ $ballparktext = substr($body,$starttext,$textlength);
|
|
|
+ }
|
|
|
+ else $ballpark = '0';
|
|
|
+
|
|
|
+ //find position of nearest Period
|
|
|
+ $foundPeriod = true;
|
|
|
+ $posPeriod = stripos($ballparktext, '. ') + $starttext +1;
|
|
|
+
|
|
|
+ //find position of nearest Space
|
|
|
+ $foundSpace = true;
|
|
|
+ $posSpace = stripos($ballparktext, ' ') + $starttext;
|
|
|
+
|
|
|
+ //if longest word in query is after a period+space within ballpark, reset $starttext to that point
|
|
|
+ if($pos-$starttext > $posPeriod)
|
|
|
+ {
|
|
|
+ $starttext = $posPeriod;
|
|
|
+ //populate the bodymatch
|
|
|
+ if($pos-$starttext >= 0)
|
|
|
+ {
|
|
|
+ $bodymatch[] = substr($body,$starttext,$textlength);
|
|
|
+ }
|
|
|
+ else $bodymatch[] = '';
|
|
|
+ }
|
|
|
+ //else if($pos-starttext > $posSpace)//else if longest word in query is after a space within ballpark, reset $starttext to that point
|
|
|
+ else if($pos > $posSpace)//else if longest word in query is after a space within ballpark, reset $starttext to that point
|
|
|
+ {
|
|
|
+ $starttext = $posSpace;
|
|
|
+ //populate the bodymatch
|
|
|
+ if($pos-$starttext >= 0)
|
|
|
+ {
|
|
|
+ $bodymatch[] = substr($body,$starttext,$textlength);
|
|
|
+ }
|
|
|
+ else $bodymatch[] = '';
|
|
|
+ }
|
|
|
+ else //else just set the bodymatch to the ballparktext
|
|
|
+ {
|
|
|
+ //populate the bodymatch
|
|
|
+ if($pos-$starttext >= 0)
|
|
|
+ {
|
|
|
+ $bodymatch[] = $ballparktext;
|
|
|
+ }
|
|
|
+ else $bodymatch[] = '';
|
|
|
+ }
|
|
|
}
|
|
|
- else $bodymatch[] = '';
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ $query = $_GET['q'];
|
|
|
$row = null;
|
|
|
- $totalcount = (($count + $offset)/$lim)+1;
|
|
|
+
|
|
|
+ if($page == 0){
|
|
|
+ $page+=2;
|
|
|
+ }else{
|
|
|
+ $page++;
|
|
|
+ }
|
|
|
|
|
|
include 'results.html.php';
|
|
|
}
|