Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2017
    residenza
    Trentino Alto-Adige
    Messaggi
    10

    Aiuto su CICLO specifico con incremento valori in QUERY

    Buongiorno a tutti. Spiego brevemente il mio problema.
    Ho un DB contenente 230 applicativi. Devo creare una pagina internet che mi consenta di interrogare il DB dando la possibilità di selezionare i criteri di ricerca.
    In questa fase sto cercando di visualizzare nel modo corretto la SELECT relativa agli applicativi di determinate categorie.

    L'utente seleziona 3 categorie e io devo mostrare una tabella contenente tutti gli applicativi di quelle categorie.

    Per prima cosa ho aperto il tag tabella:

    codice:
    <table id='tabellarisultati' class='sortable'>\n<tr>";
    poi ho settato l'array $Categorie con i dati selezionati dall'utente tramite POST:

    codice:
    $Categorie = isset($_POST['Categorie']) ? $_POST['Categorie'] : array();
    e poi ho avviato il mio ciclo foreach che spulcia l'array dalla prima categoria fino all'ultima:

    codice:
    foreach($Categorie as $categoria){
    La query che ho strutturato per estrapolare i dati è funzionante e già verificata, ma estrapola i dati una categoria alla volta (ovviamente):

    codice:
    $query="SELECT tbapplicativi.NomeApplicativo as NomeApplicativo, tbproduttori.NomeProduttore as NomeProduttore,tbapplicativi.Descrizione as Descrizione, tbapplicativi.LinkAlSito as Link,  GROUP_CONCAT(DISTINCT tbsistemioperativi.SistemaOperativo SEPARATOR ', ') AS SistemaOperativo, GROUP_CONCAT(DISTINCT tbdevices.NomeDevice SEPARATOR ', ') AS NomeDevices 
    FROM tbapplicativi, tbcategorie, tbsistemioperativi, tbconnappso, tbdevices, tbconnappdevices, tbproduttori
    WHERE tbapplicativi.FkCategoria = $categoria AND tbapplicativi.PkApplicativo = tbconnappso.FkApp AND tbsistemioperativi.PkSo = tbconnappso.FkSO AND tbapplicativi.PkApplicativo = tbconnappdevices.FkApp AND tbdevices.PkDevice 	= tbconnappdevices.FkDevices AND tbapplicativi.FkProduttore = tbproduttori.PkProduttore
    GROUP BY tbapplicativi.PkApplicativo";
    eseguo la query e setto il numero di campi:

    codice:
    $result= mysql_query($query);$numfields = mysql_num_fields($result);
    Con un ciclo do il nome ad ogni colonna:

    codice:
    for ($i=0; $i < $numfields; $i++) {
    echo '<th>'.mysql_field_name($result, $i).'</th>';
    }
    e chiudo la prima riga:

    codice:
    echo "</tr>\n";
    poi estrapolo tutti i dati dal mio risultato e li inserisco in ogni riga:

    codice:
    while ($row = mysql_fetch_row($result)) {
    	echo '<tr><td>'.implode($row,'</td><td>')."</td></tr>\n";
    	}
    chiudo foreach e tabella:
    codice:
    }
    echo "</table></div>\n";

    Bene, alla luce di tutto questo lavoro la tabella che mi viene generata è una tabella che mantiene separati i valori per Categoria e pur essendo in una singola tabella sembrano essere separati concettualmente. (Quindi output non in linea con le aspettative)

    Io vorrei creare un ciclo che mi vada ad aggiornare ogni volta la query e poi vada, con il comando "UNION", ad accostarla a quella successiva. Una volta finito il ciclo vorrei che venisse eseguita la QUERY con tutti gli UNION.

    Ho già visto che le query con UNION darebbero il risultato sperato.

    Grazie in anticipo.

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ma non ti conviene cambiare la condizione da

    tbapplicativi.FkCategoria = $categoria
    a
    tbapplicativi.FkCategoria IN ($cat1, $cat2, $cat3, ...)

    e ti elimini anche il foreach? Ovviamente devi stare attento quando l'array $Categorie è vuoto.
    Ad occhio fare così:
    Codice PHP:
    ...

    $condition '';
    if(isset(
    $_POST['categorie'])){
       
    $condition ' AND tbapplicativi.FkCategoria IN (' implode(', '$_POST['categorie']) . ')';
    }

    $query "SELECT ...
             .... AND tbapplicativi.FkProduttore = tbproduttori.PkProduttore 
    $condition
             GROUP BY ..."
    ;

    ... 

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2017
    residenza
    Trentino Alto-Adige
    Messaggi
    10
    Grazie mille. Problema risolto!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2017
    residenza
    Trentino Alto-Adige
    Messaggi
    10
    Quote Originariamente inviata da boots Visualizza il messaggio
    Ma non ti conviene cambiare la condizione da

    tbapplicativi.FkCategoria = $categoria
    a
    tbapplicativi.FkCategoria IN ($cat1, $cat2, $cat3, ...)

    e ti elimini anche il foreach? Ovviamente devi stare attento quando l'array $Categorie è vuoto.
    Ad occhio fare così:
    Codice PHP:
    ...

    $condition '';
    if(isset(
    $_POST['categorie'])){
       
    $condition ' AND tbapplicativi.FkCategoria IN (' implode(', '$_POST['categorie']) . ')';
    }

    $query "SELECT ...
             .... AND tbapplicativi.FkProduttore = tbproduttori.PkProduttore 
    $condition
             GROUP BY ..."
    ;

    ... 

    Risolto con questo sitema. Sono anche riuscito ad inserire nella query la richiesta di altri criteri di ricerca esattamente utilizzando lo stesso sistema.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Un paio di consigli qualitativi, non usare le funzioni mysql_ usa invece mysqli_ o la libreria pdo per lavorare con il database. Le funzioni mysql_ sono deprecate e sono state rimosse dalle ultime versioni (7+) di php.

    Quando prendi un input, e in special modo se poi lo inserisci dentro ad una query sql, filtralo sempre, con questo codice saresti esposto ad sql injection e non è certo una buona cosa.

    Per filtrare un input puoi usare le funzioni filter_input() e filter_input_array().

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.