Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208

    Clausola or e parentesi in query dinamica

    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?
    Ultima modifica di Korenaar; 23-07-2014 a 15:04

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Come deve imettere un utente per fare la ricerca ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Grazie Badaze, sto notando che ultimamente posto qui più per il panico che mi prende che per effettiva mancanza di capacità risolutiva.

    Credo di aver risolto.

    ho impostato due controlli, uno preliminare e uno post analisi del contenuto per aperta/chiusa parentesi:

    Codice PHP:
    public function OpenParentesi ($prev_andor,$andor$next_andor){
            if (
    $prev_andor != 'or' && $andor == 'OR') {
                
    $this->query1[] = '(';
            }
            elseif (
    $prev_andor == 'or' && ($andor == 'or' || $andor != 'or')) {
                
    $this->query1[] = '';
               }
            }

            public function 
    CloseParentesi($prev_andor$andor$next_andor) {
            if (
    $prev_andor == 'or' && $andor != 'or' ) {
                
    $this->query1[] = ')';        }
            elseif (
    $prev_andor == 'or' && andor == 'or') {
                
    $this->query1[] = '';
            }
        } 
    Devo puntualizzare forse meglio le condizioni, visto che se andiamo su 3 OR qualcosa potrebbe andar storto, ma di fatto ora il form apre e chiude le parentesi di almeno 2 clausole OR in maniera perfetta.



    Per rispondere alla tua domanda, il form (in forma stringata, ci sono optgroup e option in mezzo ovviamente) è così:

    Codice PHP:
    <select>VOCE</select> <select>UGUALE AMINORE DI /*etc.etc */</select>   <input type text>  <select>VUOTO/AND/OR</select
    P.S ho modificato anche la struttura per registrare tutti gli step della query in $this->query1.

    Cosicchè $query finale da infilare in mysqli sarà:

    Codice PHP:
    $query implode(" "$this->query1); 
    e tutto è mooooolto più coerente.
    Ultima modifica di Korenaar; 23-07-2014 a 18:24

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.