Witam piszę prostą wyszukiwarkę dla treningu i chciał bym was zapytać czy podążam w dobrym kierunku i co należało by zmienić.
Forumalrz składa się z:
POLE TEKSTOWE - keywords
LISTA ROZWIJANA - objtype
CHECKBOX - option
Wszystko działa jak by co (IMG:
style_emoticons/default/smile.gif)
Chodzi o samą sztukę.
WYWOLANIE$engine = new Search();
$engine->getKeywords($_POST['keywords']);
$engine->getObjectType($_POST['objectType']);
$engine->getOptions($_POST);
$error = $engine->setError();
$data = $engine->queryCreator();
Kodzk clasy<?php
class Search extends DataManager {
private $keywordsStr = NULL;
private $keywords = NULL;
private $options = NULL;
private $objectType;
private $errors = array();
function __construct() {
}
/**
* Funkcja pobiera z formularza->poletekstowe za pomoca np $_POST['tekst'] i przystosowuje zapytanie obcinajac spacje itp,
* @param string $keywords jako poletekstowe formularza np $_POST['tekst']
*/
public function getKeywords($keywords = NULL) {
//Usuwamy biale znaki
if(!$keywords == NULL)
}
/**
* Funkcja pobiera z formularza->typobiektu za pomoca np $_POST['typ'] i przystosowuje zapytanie obcinajac spacje itp,
* @param string $objectType jako poletekstowe formularza np $_POST['tekst']
*/
public function getObjectType($objectType = NULL) {
//Usuwamy biale znaki
}
public function getOptions($arrayPost) {
foreach ($arrayPost as $key => $value) {
$this->options[$key] = $value;
}
}
private function errors() {
if(empty($this->keywordsStr)) $errors[] = EMPTYERROR;
if(strlen($this->keywordsStr) < 3
) $errors[] = LENGHTERROR;
$this->errors[] = $errors;
return $errors;
}
/**
* Zaglada do cache pliku i prawdza czy istnieje jezeli tak zwraca 1 jezeli nei zwraca 0
* @param string $value pobieramy wyraz
* @return boolean zwraca true lub false jezeli wystepuje w tablicy cache lub nie.
*/
private function searchCache($value) {
include 'cache/cacheSearch.php';
$key = in_array(mb_strtolower
($value, "UTF-8"), $array); if($key == TRUE)
return TRUE;
else
return FALSE;
}
/**
* Przetwarza tablice zapytania z formularza->inputtext co wazne robi tez validacje przy pomocy cache pliku jezeli jest to dodaje + do match against $this->searchCache($value);
* @param array słowa kluczowe w formie tablicy
* @param string $searchSymbol jest to symbol do zapytania match against +_~ itd
* @param string $separator międzty wyrazami tutaj spacja.
* @return string zwraca sformatowany ciag.
*/
private function arrayToString($array, $searchSymbol = '+' ,$separator = ' ') {
foreach ($array as $key => $value) {
$sepTF = $this->searchCache($value);
if($key == 0 || $sepTF == TRUE ){
$str .= $searchSymbol. ':'.$value . '*' . $separator;
}
else{
$str .= $value . '*' . $separator;
}
}
}else{
$str = NULL;
}
return $str;
}
private function arrayBind($sth, $data) {
foreach ((array) $data as $key => $value) { $sth->bindValue(":$key", $value);
}
}
private function optionSql($array) {
$sql = 'AND test.id = opcje.id';
foreach ($array as $key => $value) {
$sql .= ' AND opcje.' . $key . '=1';
}
}
else{
return NULL;
}
return $sql;
}
public function queryCreator() {
$cos = $this->errors();
}else{
try {
$keywords = $this->arrayToString($this->keywords);
$types = $this->objectType[0];
echo ':'.$keywords.':<br />';
$optionSql = $this->optionSql($this->options);
$sql = "SELECT *
, (MATCH(test) AGAINST('$keywords' IN BOOLEAN MODE))
FROM test, druga, opcje
WHERE test.id = druga.id AND test.id = opcje.id $optionSql
AND MATCH(test) AGAINST('$keywords' IN BOOLEAN MODE)
AND MATCH(type) AGAINST('$types*' IN BOOLEAN MODE)
ORDER BY (MATCH(test) AGAINST('$keywords' IN BOOLEAN MODE)) DESC
"; //+$types dac do odzielnej.
$db = new DataManager(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
$sth = $db->prepare($sql);
foreach ((array) $this->keywords as $key => $value) { $sth->bindValue(":$key", $value);
}
$this->arrayBind($sth,$this->keywords);
$this->arrayBind($sth,$this->objectType);
$this->arrayBind($sth,$this->options);
$sth->execute();
return $sth->fetchAll();
} catch (Exception $exc) {
echo $exc->getTraceAsString(); }
}
}
/**
* Funkcja pierwszy napotkany blad podczas validacji (służy do zakomunikowania uzytkownikowi co zrobil zle).
*/
public function setError() {
if(isset($this->errors[0
])) return $this->errors[0];
}
public function setData($param) {
}
/**
* Funkcja wypisuje podstawowe informacje na temat przyjetych oraz przetworzonych informacji.
*/
public function echoData() {
echo 'Podstawowe informacje <br />'; }
}