Browse Source

Add files via upload

wibyweb 2 years ago
parent
commit
7144c9b9c6
2 changed files with 170 additions and 332 deletions
  1. 166 326
      html/index.php
  2. 4 6
      html/results.html.php

+ 166 - 326
html/index.php

@@ -38,12 +38,6 @@ 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]==" "){
@@ -220,7 +214,7 @@ else
 			if ($word[0] == '+' && strlen($word) > 1){
 				$requiredword = substr($word,1);
 			}
-			if ($word[0] == '-' && $word[0] == '+'){
+			if ($word[0] == '-' || $word[0] == '+'){
 				$flags .= " $word";
 			}			
 			$i++;
@@ -251,6 +245,27 @@ 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){
+		$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){
@@ -262,353 +277,178 @@ else
 	
 	$count = 0;
 	
-	if(!$general){
-		$queryWithQuotesAndFlags = '"'. $queryNoQuotes_SQLsafe.'"'.$flags.'';
+	$queryWithQuotesAndFlags = '"'. $queryNoQuotes_SQLsafe.'"'.$flags.'';
+
+	//perform full text search FOR InnoDB or MyISAM STORAGE ENGINE
+	if($exactMatch == false && $urlDetected==0 && strpos($query, ' ') == true){
+		$outputFTS = mysqli_query($link, "SELECT id, url, title, description, body FROM windex WHERE enable = '1' $additions ORDER BY CASE WHEN MATCH(tags) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 30 WHEN MATCH(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) AND MATCH(title) AGAINST('$query' IN BOOLEAN MODE) THEN 20 WHEN MATCH(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 16 WHEN MATCH(body) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) OR MATCH(description) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 15 WHEN MATCH(title) AGAINST('$query' IN BOOLEAN MODE) THEN MATCH(title) AGAINST('$query' IN BOOLEAN MODE) WHEN MATCH(body) AGAINST('$query' IN BOOLEAN MODE) THEN 1 WHEN MATCH(url) AGAINST('$query' IN BOOLEAN MODE) THEN 0 END DESC, id DESC LIMIT $lim OFFSET $offset");
+	}else{
+		$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 MATCH(tags) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 30 WHEN MATCH(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 20 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(); 
+	}*/
+		
+	if($urlDetected == 1)
+	{
+		$query = $queryOriginal;
+	}
 
+	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 . '*';
 		//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('$queryWithQuotesAndFlags' IN BOOLEAN MODE) AND enable = '1' $additions ORDER BY CASE WHEN MATCH(tags) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 30 WHEN MATCH(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 20 END DESC, id DESC LIMIT $lim OFFSET $offset");
+		$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 MATCH(tags) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 30 END DESC, id DESC LIMIT $lim OFFSET $offset");
 
-		/*if(!$outputFTS)//dont error out yet, will give another try below
+		if(!$outputFTSgeneral)
 		{
 		  $error = 'Error ' . mysqli_error($link);  
 		  include 'error.html.php';  
 		  exit(); 
-		}*/
-		
-		if($urlDetected == 1)
-		{
-			$query = $queryOriginal;
-		}
-
-		//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);
-				}
+		}		
+	}
+	//this will get set if position of longest word of query is found within body
+	$pos = -1;
 
-				//first find an exact
-				if(strlen($requiredword) > 0){
-					$pos = stripos($body, $requiredword);			
-				}else{
-					$pos = stripos($body, $queryNoQuotes);
-				}
+	//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];
 		
-				//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)
+		if($exactMatch == false)
+		{
+			//remove the '*' at the end of the longest word if present
+			if(strpos($longestWord,'*') == true)
 			{
-				$ballparktext = substr($body,$starttext,$textlength);
+				$longestWord = str_replace('*', "",$longestWord);
 			}
-			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[] = '';
+			//first find an exact
+			if(strlen($requiredword) > 0){
+				$pos = stripos($body, $requiredword);			
+			}else{
+				$pos = stripos($body, $queryNoQuotes);
 			}
-			else //else just set the bodymatch to the ballparktext
-			{
-				//populate the bodymatch
-				if($pos-$starttext >= 0)
+		
+			//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)
 				{
-					$bodymatch[] = $ballparktext;
+					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 $bodymatch[] = '';	
 			}
-		
 		}
-	}
-	$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++;
-			}	
+		else
+		{
+			$pos = stripos($body, $queryNoQuotes);
+		}
+		//still not found?, set position to 0
+		if($pos == false){
+			$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 Match(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) AND Match(title) AGAINST('$query' IN BOOLEAN MODE) THEN 20 WHEN Match(title) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) 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)
+		//get all positions of all keywords in body
+	/*	$lastPos = 0;
+		$positions = array();
+		foreach($words as $word)
 		{
-			$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);
-			//-----------------------------------------------
+			while (($lastPos = mb_strpos($body, $word, $lastPos))!== false) {
+				$positions[$word][] = $lastPos;
+				$lastPos = $lastPos + strlen($word);
+			}		
+		}*/
 		
-			$querystar = $querystar . '*';
-
-			//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 MATCH(tags) AGAINST('$queryWithQuotesAndFlags' IN BOOLEAN MODE) THEN 30 END DESC, id DESC LIMIT $lim OFFSET $offset");
+		//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;
 
-			if(!$outputFTSgeneral)
+		//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)
 			{
-			  $error = 'Error ' . mysqli_error($link);  
-			  include 'error.html.php';  
-			  exit(); 
-			}		
+				$bodymatch[] = substr($body,$starttext,$textlength);
+			}
+			else $bodymatch[] = '';
 		}
-
-		//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))
+		//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
 		{
-			$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;
-					}
-
-				}
+			$starttext = $posSpace;
+			//populate the bodymatch
+			if($pos-$starttext >= 0)
+			{
+				$bodymatch[] = substr($body,$starttext,$textlength);
 			}
-			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[] = '';
+		}
+		else //else just set the bodymatch to the ballparktext
+		{
+			//populate the bodymatch
+			if($pos-$starttext >= 0)
+			{
+				$bodymatch[] = $ballparktext;
 			}
-	
+			else $bodymatch[] = '';	
 		}
+		
 	}
 
 	$query = $_GET['q'];

+ 4 - 6
html/results.html.php

@@ -2,15 +2,15 @@
 
 <html>  
   <head>  
-    <title>TITLE</title>  
+    <title><?php echo htmlspecialchars($query, ENT_QUOTES, 'UTF-8');?></title>  
     <meta http-equiv="content-type" content="text/html; charset=utf-8"/>  
 	<link rel=stylesheet href="/styles.css" type="text/css"> 
-	<link rel="search" type="application/opensearchdescription+xml" title="your title" href="/opensearch.xml">	
+	<link rel="search" type="application/opensearchdescription+xml" title="wiby search" href="/opensearch.xml">	
   </head>  
   <body>
     <form method="get">    
       <div style="float: left">
-        <a class="title" href="../">name</a>&nbsp;&nbsp;
+        <a class="title" href="../">wiby</a>&nbsp;&nbsp;
         <input type="text" size="35" name="q" id="q" value="<?php echo htmlspecialchars($query, ENT_QUOTES, 'UTF-8');?>" role="form" aria-label="Main search form"/>
         <input type="submit" value="Search"/>
       </div>    
@@ -33,9 +33,7 @@
 		</blockquote>  
     <?php endforeach; ?>  
     <?php if($i > 2 && $starappend == 0 && $general==0): ?> 
-        <p class="pin"><blockquote></p><br><a class="tlink" href="/?q=<?php echo htmlspecialchars($query, ENT_QUOTES, 'UTF-8');?>&p=<?php echo $page;?>">Find more...</a></blockquote>
-    <?php elseif($i > 2 && $starappend == 0 && $general==1): ?> 
-        <p class="pin"><blockquote></p><br><a class="tlink" href="/?q=<?php echo htmlspecialchars($query, ENT_QUOTES, 'UTF-8');?>&p=<?php echo $page;?>&g">Find more...</a></blockquote>        
+        <p class="pin"><blockquote></p><br><a class="tlink" href="/?q=<?php echo htmlspecialchars($query, ENT_QUOTES, 'UTF-8');?>&p=<?php echo $page;?>">Find more...</a></blockquote>      
     <?php else: ?>
         <blockquote><p class="pin"> <br>That's everything I could find.<br>Help make me smarter by <a class="pin1" href="/submit">submitting a page</a>.</p></blockquote>
     <?php endif; ?>