Scripts

DBsearch Class

Ik heb mij al een eerder gebogen over een searchengine, en toen was de uitkomst een beetje slapjes. Weinig mogelijkheden tot uitbreiden, en noem het maar op. Dus bij deze een 2e poging, om jullie het zoeken naar zoekende scriptjes en het zoeken zelf een stapje makkelijker te maken. Aan de opbouw van de zoekresultaten moet je het voorlopig doen met een bitter kale $key => $var output. Hier ga ik mij binnenkort over buigen. Er volgen zeker nog updates, verder zijn suggesties ook altijd welkom. Maar hierbij deze de eerste op het eerste oog 'werkende' (hem hem nog niet 100% kunnen testen) versie van de DBsearch Class Nota bene Je moet je kollommen natuurlijk wel een fulltextindex meegeven, wil je gebruik kunnen maken van de fulltextsearch.

dbsearch-class
Voorbeeldje van gebruik
[code]<?
require('./libs/lib.dbsearch.php');

if(empty($_GET['q'])){
	$_GET['q'] = '[niet gedefinieerd]';
}
?>
<h1><?=Googlelize('zoeken');?></h1> 
<form action="" method="get">
	<input type="hidden" name="page" value="searchresults" />
	<input type="text" name="q" value="<?=$_GET['q']?>"/>
	<input type="submit" name="search" value="zoek!" /><br />
	<select name="type">
	<?
		unset($sel);
		switch($_GET['type']){
			case 'rel': $a = 0; break;
			case 'starts': $a = 1; break;
			case 'like': $a = 2; break;
			case 'ends': $a = 3; break;
			default: $a = 0; break;
		}
		$sel[$a] = "selected";
	?>
		<option value="rel" <?=$sel[0]?>>Relevantie</option>
		<option value="starts" <?=$sel[1]?>>Beginnend met</option>
		<option value="like" <?=$sel[2]?>>Bevat</option>
		<option value="ends" <?=$sel[3]?>>Eindigd met</option>
	</select>
	Aantal resultaten per pagina <select name="amount">
	<?
		unset($sel);
		switch($_GET['amount']){		
			case 10: $a = 0; break;
			case 20: $a = 1; break;
			case 30: $a = 2; break;
			case 40: $a = 3; break;
			case 50: $a = 4; break;
			default: $a = 0; break;
		}
		$sel[$a] = "selected";
	?>
		<option value="10" <?=$sel[0]?>>10</option>
		<option value="20" <?=$sel[1]?>>20</option>
		<option value="30" <?=$sel[2]?>>30</option>
		<option value="40" <?=$sel[3]?>>40</option>
		<option value="50" <?=$sel[4]?>>50</option>
	</select><br />
	<input type="checkbox" name="in_0" <?=($_GET['in_0']=='on'?'checked="on"':'')?> /> Klanten<br />
	<input type="checkbox" name="in_1" <?=($_GET['in_1']=='on'?'checked="on"':'')?> /> Contactpersonen<br />
	<input type="checkbox" name="in_2" <?=($_GET['in_2']=='on'?'checked="on"':'')?> /> Projecten<br />
    <input type="checkbox" name="in_3" <?=($_GET['in_3']=='on'?'checked="on"':'')?> /> Producten<br />
	

</form>
<?

if(isset($_GET['search'])){
	if(!empty($_GET['q'])){	
		$dbsearch = new MyOwnGoogle(mysql_real_escape_string($_GET['q']),$_GET['type']);
		foreach($_GET as $key => $var){
			if(substr($key,0,3) == 'in_'){
				if($var == 'on'){
					switch(substr($key,3)){
						case 0: $dbsearch->addColumn("customers", "name"); break;
						case 1: 
							$dbsearch->addColumn("customer_employees", "firstname");
							$dbsearch->addColumn("customer_employees", "lastname"); 
							break;
						case 2: $dbsearch->addColumn("projects", "name"); break;
						case 3: $dbsearch->addColumn("products", "title"); break;
					}
				}
			}
		}
		switch($_GET['amount']){		
			case 10: $dbsearch->searchAmount = 10; break;
			case 20: $dbsearch->searchAmount = 20; break;
			case 30: $dbsearch->searchAmount = 30; break;
			case 40: $dbsearch->searchAmount = 40; break;
			case 50: $dbsearch->searchAmount = 50; break;
			default: $dbsearch->searchAmount = 10; break;
		}
		
		print $dbsearch->Search();
				
	}
}
?>[/code]

De classe
[code]
<?
# gemaakt door P van Linschoten

class MyOwnGoogle{
	
	#@ variabelen setten enzeau
	protected $searchColumns = array();
	protected $searchWords = NULL;
	protected $searchType = NULL;
	protected $StartTime = 0;
	protected $EndTime = 0;
	protected $aResults = array();
	public $searchAmount = 0;
	
	# init
	public function __construct($words,$type){
		$this->StartTime = microtime();
		$this->searchAmount = 10;
		if(preg_match('[a-zA-Z0-9]',$words)){
				
		}
		$this->searchWords = trim($words);
		$this->searchType = $this->getSearchType($type);
	}	

	#@ Bepaal in welke kollommen gezocht moet worden.
	public function addColumn($table,$column){
		$this->searchColumns[$table][] = $column;
	}
	#@ Voer de zoekopdracht uit.
	public function Search(){
		switch($this->searchType){
			case 'rel': 
				$this->searchFulltext();
			break;
			case 'like':
				$this->searchLike();
			break;
		}
		if(count($this->aResults) == 0){
			return 'Er zijn geen zoekresultaten voor <strong>'.htmlentities($this->searchWords).'</strong>';
		}else{
			return $this->tableFormat();
		}
	}
	#@ Fulltext zoeken!
	protected function searchFulltext(){
		foreach($this->searchColumns as $table => $columns){
			$i = 0;
			$sColumns = NULL;
			foreach($columns as $column){
				$i++;
				$sColumns .= ($i==1?'':',').$column;
			}
			$query = "SELECT * FROM ".$table." WHERE MATCH(".$sColumns.") AGAINST('".$this->searchWords."') LIMIT ".$this->searchAmount;
			$query = mysql_query($query) or print('<p>'.mysql_error().'</p>');
			while($result = mysql_fetch_assoc($query)){
			 	$this->aResults[] = $result;
			}
		}
	}
	#@ zoeken dmv %like%
	protected function searchLike(){
		foreach($this->searchColumns as $table => $columns){
			
			foreach($columns as $column){
				
				$query = "SELECT * FROM ".$table." WHERE ".$column." LIKE '%".$this->searchWords."%' LIMIT ".$this->searchAmount;
				print $query.'<br />';
				$query = mysql_query($query);
				
				 while($result = mysql_fetch_assoc($query)){
				 	$this->aResults[] = $result;
				 }
			}
		}
	}
	#@ zoeken dmv %like
	protected function searchStartWith(){
		foreach($this->searchColumns as $table => $columns){
			foreach($columns as $column){
				
				$query = "SELECT * FROM ".$table." WHERE ".$column." LIKE '%".$this->searchWords."' LIMIT ".$this->searchAmount;
				print $query.'<br />';
				$query = mysql_query($query);
				
				 while($result = mysql_fetch_assoc($query)){
				 	$this->aResults[] = $result;
				 }
			}
		}
	}
	#@ zoeken dmv like%.
	protected function searchEndWith(){
		foreach($this->searchColumns as $table => $columns){		
			foreach($columns as $column){
				
				$query = "SELECT * FROM ".$table." WHERE ".$column." LIKE '".$this->searchWords."%' LIMIT ".$this->searchAmount;
				print $query.'<br />';
				$query = mysql_query($query);
				
				 while($result = mysql_fetch_assoc($query)){
				 	$this->aResults[] = $result;
				 }
			}
		}
	}

	#@ Bepaal zoek methode
	protected function getSearchType($type){
		switch($type){
			case 'rel': return $type;break;
			case 'starts': return $type;break;
			case 'ends': return $type;break;
			case 'like': return $type;break;
			case 'gamble': return $type; break;
			default: return 'rel';break;
		}
	}
	
	# Zet de zoek resultaten in een tabelletje. 
	protected function tableFormat(){
		$content .= '<table cellspacing="0" cellpadding="0" border="0" width="100%">';
		foreach($this->aResults as $result){
			$content.='<tr><td>'."\n";
			$i++;
			foreach($result as $key => $var){
				$content.= $key .' => '. $var.'<br />'."\n";
			}
			$content.='</td></tr>'."\n";
			if($i==10){
				break;
			}
		}
		$content.= "</table>";
		return $content;
	}

	# Highlighten van de zoekwoorden.
	protected function HighLight($text,$string){
		return preg_replace("/(?!<!--)(?!<)(^|[\s\.,>])($string)($|[\s,\.])(?!>)(?!-->)/i",
"\\1<span class=\"highlight\">\\2</span>\\3", $text);
	}
}


# googlelize your name :)
function Googlelize($var){
	$var = strtoupper($var);
	if(strlen($var) >= 6){
		for($i=0;$i<(strlen($var)-3);$i++){
			$digit = substr($var,$i,1);
			switch($i){
				case 0: $color = "#0000FF";break;
				case 1: $color = "#FF0000";break;
				default: $color = "#FFCC00";break;
				
			}
			
			$str .= "<span style='color:" . $color . "'>" . $digit . "</span>";    
		}    
		$str .= "<span style='color:#0000FF'>" . substr($var,-3,1) . "</span>";
		$str .= "<span style='color:#00FF00'>" . substr($var,-2,1) . "</span>";
		$str .= "<span style='color:#FF0000'>" . substr($var,-1,1) . "</span>";
		#$str = "<strong>" . $str . "</strong>";
	}
	return $str;
}
?>
[/code]

Reacties

0
Nog geen reacties.