Salve a tutti,
ho finito di scrivere da zero il motore di ricerca del gestionale di cui a pezzi vi ho fatto partecipi nei mesi passati tramite problemi riscontrati e curiosità sopraggiunte.
Ho costruito una classe search con alcuni metodi ed un metodo contenitore finale che va a costruire dinamicamente la query di ricerca, e se non c'è ricerca costruisce il body del form di ricerca. Tutto bene finchè non si seleziona la clausola OR in una delle congiunzioni, cosa che mi costringe a fare un numero "n" di controlli sull'OR della linea precedente e anche su quello della successiva per capire come settare le parentesi nel modo giusto.
Parte del codice
Codice PHP:
//body composto da optgroup e select tratte da array di appoggio con le liste di optionkey => value.
public function implodeQuery() {
$implode = implode(" ", $this->query1);
return $implode;
}
public function CheckQueryExists($query) {
if (!in_array ($query, $this->query1)) {
$this->query1[]= $query;
}
}
public function SetJoin($input) {
if(in_array($input, $this->quote_associative)) {
$query = "LEFT JOIN db.quote_associative on anagrafica.id = quote_associative.anagrafica_id";
$this->CheckQueryExists($query);
}
public function Search1() {
$result = $this->Check("AND", $this->voce1, $this->comparazione1, $this->input1, $this->andor1, $this->andor2); // Check () è il metodo di controllo sui criteri "uguale a", "minore di" etc.etc che varia la forma della query da LIKE %value a LIKE %value% etc. in base alla necessità.
return $result; }
//metodo implementazione
public function querysearch () {
if (isset($_POST['input1'])) {
$this->SetJoin($this->voce1);
$query2 = $this->Search1(); //e cosi via per ogni singolo input del form
Il codice è solo uno stralcio del tutto, ma credo dia l'idea del sistema che ho usato per costruire la ricerca.
In pratica, $this->query1 è un array nel quale concateno le stringe di query che vado a ricomporre con il metodo ImplodeQuery(). Alcuni dei controlli li ho impostati con il confronto su array preimpostato a mano.
la mia domanda ora è:
Esiste un trick in php (o mysql) per non settare controlli incrociati continui fra le congiunzioni per creare la giusta query con la clausola OR e le parentesi?