Visualizzazione risultati 1 fino 15 di 15

Discussione: Query ricerca tramite campi select

  1. #1
    Guest

    Predefinito Query ricerca tramite campi select

    Salve, sono nuovo di php MySql, (ho fatto qualcosa con asp Access) e devo fare ora delle ricerche su un database MySql tramite dei campi select su pagine php.
    Il database è composto da varie tabelle; quella principale contiene l'anagrafica di un certo numero di cooperative del territorio e un'altra contiene un elenco di tutti i servizi che queste possono svolgere. In quest'ultima denominata "settori" Ogni campo ha il nome di un servizio (pulizie, manutenzione, eccetera) ed i record hanno valore 1 o zero (inseriti da checkbox) a seconda del fatto che una cooperativa svolga o meno quel servizio. Le tabelle sono in relazione tramite un campo comune ID_coop.
    Sulla pagina di ricerca http://coges.altervista.org/select_settori.php ho due select collegate: nella prima seleziono un macrosettore e nella seconda il settore specifico; questo secondo valore viene passato tramite variabile e deve darmi il nome del campo su quale cercare se ci sono valori 1.
    In pratica dovrebbe essere:

    Codice PHP:
    $serv_Rs_ricerca = "-1";
    if (isset(
    $_GET['servizio'])) {
    $serv_Rs_ricerca = $_GET['servizio'];
    }
    mysql_select_db($database_ConnCoop, $ConnCoop);
    $query_Rs_ricerca = sprintf("SELECT '$%s' FROM settori WHERE '$%s=1", GetSQLValueString($serv_Rs_ricerca, "int"),GetSQLValueString($serv_Rs_ricerca, "int"));
    scritta con l'aiuto di Dreamweaver, mi da errore di sintassi.
    Ringrazio anticipatamente per qualsiasi suggerimento.
    Buon lavoro a tutti

  2. #2
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    cosa contiene la variabile $serv_Rs_ricerca ??? perchè usi la stessa variabile per selezionare il campo e il suo valore ???!!!!

    prova modificando la sintassi della query così:

    Codice PHP:
    $query_Rs_ricerca = sprintf("SELECT * FROM settori WHERE qui_un_campo = '%s'",
    GetSQLValueString($serv_Rs_ricerca, "int")
    );
    oppure:

    Codice PHP:
    $query_Rs_ricerca = sprintf("SELECT qui_un_campo FROM settori WHERE qui_un_campo = '%s'",
    GetSQLValueString($serv_Rs_ricerca, "int")
    );
    oppure se $serv_Rs_ricerca se è = al nome del campo:

    Codice PHP:
    $query_Rs_ricerca = sprintf("SELECT %s FROM settori WHERE %s = '1'",
    GetSQLValueString($serv_Rs_ricerca, "int"),
    GetSQLValueString($serv_Rs_ricerca, "int")
    );
    Ultima modifica di EuroSalute : 30-03-2011 alle ore 01.08.29 Motivo: correzzioni...più info
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  3. #3
    Guest

    Predefinito

    Citazione Originalmente inviato da EuroSalute Visualizza messaggio
    oppure se $serv_Rs_ricerca se è = al nome del campo:
    MAI FAR IMPOSTARE IN QUESTO MODO IL NOME DEL CAMPO... con una sql injection banale potrebbero farti un mazzo così (________________)

  4. #4
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    prima di tutto non ho abbastanza informazioni....non so come è strutturata la tabella, poi non si ha info sulla funzione GetSQLValueString(), cosa fa esattamente....

    per le sql injection, basta filtrarle opportunamente.....

    ho proposto delle opzioni, non avendo abbastanza info....
    Ultima modifica di EuroSalute : 30-03-2011 alle ore 10.32.16 Motivo: info...
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da EuroSalute Visualizza messaggio
    per le sql injection, basta filtrarle opportunamente...
    No... non c'è filtro che tenga se non quello di definire staticamente (o quasi) il campo e la/le tabella/e!

    GetSQLValueString è una funzione "famosa" (ma in disuso) che applica: intval, doubleval, addslashes, (e non mi ricordo cos'altro) a seconda dell'indicazione contenuta nel secondo parametro.

    Questa è utilizzata per filtrare le stringhe in ingresso nella query per i VALUE, WHERE e LIMIT (e forse anche qualcos'altro) ma non per definire i nomi di campi e tabelle

    L'utente può controllare tranquillamente la variabile GET e:
    - se mette manualmente un campo inesistente si ha errore mysql
    - se mette un campo esistente può selezionare dalla query quel che gli pare... (addirittura puoi formulare delle JOIN o delle UNION!!!!!)

    Poi nel suo caso specifico utilizza il parametro "int" nella funzione GetSQLValueString applicando intval() al parametro in ingresso... MHà....

    PS eccon la funzione in oggetto
    Codice PHP:
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
    {
    $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

    switch (
    $theType) {
    case
    "text":
    $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
    break;
    case
    "long":
    case
    "int":
    $theValue = ($theValue != "") ? intval($theValue) : "NULL";
    break;
    case
    "double":
    $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
    break;
    case
    "date":
    $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
    break;
    case
    "defined":
    $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
    break;
    }
    return
    $theValue;
    }
    Ultima modifica di miniscript : 30-03-2011 alle ore 11.10.32

  6. #6
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    sono d'accordo con te, che i nomi dei campi non possono essere definiti dall'utente, ma in questo caso è una selezione di campi già definiti da <select e <option che l'utente in teoria non potrebbe variare....correggimi se sbaglio....

    oltremodo la funzione intval() ritorna un valore intero della variabile....
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  7. #7
    Guest

    Predefinito

    Citazione Originalmente inviato da EuroSalute Visualizza messaggio
    ...correggimi se sbaglio....
    sbagli!

    Con il discorso su Intval() ha ragione... ma i numeri interi sono infiniti: 1,2,3,4,5,6,7,8,9,10,11,12,13... 12257... i campi della tabella no!!
    Senza contare poi che avere campi di una tabella con semplici numeri mi sembra una scemenza...

    Per il discorso sulla select-option è sbagliatissimo... Tutte la variabili GET POST e COOKIE sono controllate al 100% dall'utente navigatore (client)... a prescindere che vengono inviati tramite un form, o un link

    e ciò vale sia per il nome della variabile (la chiave dell'array) sia per il suo valore.

    Molto rozzamente, ad esempio, mi creo sul desktop del mio pc questo file

    Codice PHP:
    <form action="http://www.sito.it" method="get">
    <
    input type="text" name="nome_che_mi pare" value="valore_che_mi_pare">
    <
    input type="submit" value="vai">
    </
    form>
    I tuoi controlli con js dove son finiti? i campi hidden li rendo visibili... i select le trasformo in input type text... etc etc... e in ogni input ci ficco ciò che mi pare sia come nome campo sia come valore inviato...

    SOLUZIONE:
    - validare tutti gli input in ingresso
    - (se opportuno) proteggersi da cross-site-reuqest

    Faccio un esempio semplice semplice in riferimento al caso in cui voglio definire "dinamicamente" il campo della tabella da selezionare.
    Codice PHP:
    <?php
    /*
    Ho una tabella con 5 campi:
    id - colA - colB - colC - riservato

    Poniamo che voglio far selezionare a scelta uno fra questi tre campi: 'colA', 'colB', 'colC'
    ...
    mentre devo assolutamente evitare che esegua il select di 'riservato'
    */

    // se ha selezionato qualcosa valorizzo la variabile
    // altrimenti è NULL
    $select_utente = (isset($_GET['dato_selezionato'])) ? $_GET['dato_selezionato'] : NULL;

    // verifichiamo cosa ha selezionato
    switch($select_utente)
    {
    case
    'colA': $campo_nella_query = 'colA'; break;
    case
    'colB': $campo_nella_query = 'colB'; break;
    case
    'colC': $campo_nella_query = 'colC'; break;
    // per l'utente furbacchione che ci prova protrei anche
    case 'riservato': die('Vai a fanc...'); break;
    // per il case NULL potrei, o cmq per gli altri casi in genere
    // prevedo una scelta di default
    // per esempio colC
    case NULL:
    default:
    $campo_nella_query = 'colC'; break;
    }

    $query = "SELECT ".$campo_nella_query." FROM tabella";
    // etc etc...
    ?>
    Ultima modifica di miniscript : 30-03-2011 alle ore 12.15.12

  8. #8
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    ma questo è ovvio che bisogna controllare le variabili in ingresso e validarle..

    validerò soltanto le variabili e i valori che mi interessano, per tutti gli altri casi potrò decidere di terminare l'applicazione o meno...saranno passati solo quelli idonei al corretto funzionamento....

    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  9. #9
    Guest

    Predefinito Variabile con il nome del campo su cui cercare

    Salve, grazie per le indicazioni.
    Devo provare a mettere in pratica per il mio caso l'esempio con gli accorgimenti per la sicurezza.

  10. #10
    Guest

    Predefinito Variabile con il nome del campo su cui cercare

    Riprendo l'argomento. Scusate l'ignoranza in materia.
    Ho usato l'ultimo esempio di "miniscript" per una prova in merito al mio problema iniziale e quindi ho creato una select con 4 voci di di servizi sulla pagina con il form che punta all'altra pagina php che dovrebbe ricevere il dato selezionato e verificare il campo omonimo alla ricerca di valori 1 (i valori registrati sono 1 o zero da checkbox). http://coges.altervista.org/select_settori.php
    Codice PHP:
    <?php require_once('Connections/ConnCoop.php'); ?>
    <?php
    $select_utente
    = (isset($_GET['servizi'])) ? $_GET['servizi'] : NULL;
    // verifichiamo cosa ha selezionato
    switch($select_utente)
    {
    case
    'TRASCRIZIONE': $campo_nella_query = 'TRASCRIZIONE'; break;
    case
    'SEGRETERIA': $campo_nella_query = 'SEGRETERIA'; break;
    case
    'VERDE_MANUTENZIONE': $campo_nella_query = 'VERDE_MANUTENZIONE'; break;
    case
    NULL:
    default:
    $campo_nella_query = ''; break;
    }

    mysql_select_db($database_ConnCoop, $ConnCoop);
    $query_Rs_ricerca = "SELECT ".$campo_nella_query." IDcoop FROM settori WHERE ".$campo_nella_query." = '1'";
    $Rs_ricerca = mysql_query($query_Rs_ricerca, $ConnCoop) or die(mysql_error());
    $row_Rs_ricerca = mysql_fetch_assoc($Rs_ricerca);
    $totalRows_Rs_ricerca = mysql_num_rows($Rs_ricerca);
    ?>
    Ma c'è qualcosa di sbagliato:
    Codice:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM settori WHERE = '1'' at line 1

  11. #11
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    ti da quell'errore perchè il campo $campo_nella_query è sempre nullo anche se selezioni una delle voci....

    io aggiungerei, per es.:

    Codice PHP:
    $error=null;

    //oppure --> if (empty($select_utente))
    if ($select_utente==null) $error="Errore: campo obbligatorio, devi scegliere una delle voci.";

    if (!
    $error) {
    //qui esegui la query
    }
    else echo
    $error;
    poi farei un array e controllo tutte le voci:

    Codice PHP:
    $array_voci=array('TRASCRIZIONE','SEGRETERIA','VERDE_MANUTENZIONE');//add altre voci...

    $good=false;

    foreach (
    $array_voci as $voce) if ($select_utente == $voce) $good=true;

    //oppure --> if ($good==false)
    if (!$good) $error="Errore: Attenzione la voce selezionata non esiste.";
    Ultima modifica di EuroSalute : 31-03-2011 alle ore 23.53.12 Motivo: più info...
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  12. #12
    Guest

    Predefinito

    Ok. Grazie EuroSalute. Ho seguito il consiglio e adattato il codice.
    Codice PHP:
    <?php
    $select_utente
    = (isset($_GET['servizi'])) ? $_GET['servizi'] : NULL;

    //oppure --> if (empty($select_utente))
    if ($select_utente==null) $error="Errore: campo obbligatorio, devi scegliere una delle voci.";

    if (!
    $error) {
    //qui esegui la query
    mysql_select_db($database_ConnCoop, $ConnCoop);
    $query_Rs_ricerca = "SELECT ".$campo_nella_query." FROM settori WHERE ".$campo_nella_query." = '1'";
    $Rs_ricerca = mysql_query($query_Rs_ricerca, $ConnCoop) or die(mysql_error());
    $row_Rs_ricerca = mysql_fetch_assoc($Rs_ricerca);
    $totalRows_Rs_ricerca = mysql_num_rows($Rs_ricerca);
    }
    else echo
    $error;

    $array_voci=array('TRASCRIZIONE','SEGRETERIA','VERDE_MANUTENZIONE');//add altre voci...

    $good=false;

    foreach (
    $array_voci as $voce) if ($select_utente == $voce) $good=true;
    ?>
    Adesso la pagina risponde come le è stato detto di rispondere: http://coges.altervista.org/select_settori.php
    Codice:
    Errore: campo obbligatorio, devi scegliere una delle voci.
    Ma, le prove vengono fatte selezionando sempre qualcosa dalla select e quindi il problema è che il dato non viene correttamente raccolto e utilizzato nella pagina successiva!
    Come mai la variabile rimane vuota?

  13. #13
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    hai un po' confuso con il codice....

    la parte di controllo delle voci del select option deve essere eseguita prima della query, insieme al controllo del campo nullo,io farei così:

    Codice PHP:

    <?php
    //prima definisci le variabili di default:
    $error=null;
    $good=false;
    //questo è un controllo di sicurezza anti sql injction:
    $array_voci=array('TRASCRIZIONE','SEGRETERIA','VERDE_MANUTENZIONE');//qui aggiungi tutte le altre voci del select option

    if (isset($_GET['servizi']) AND !empty($_GET['servizi'])) $select_utente = $_GET['servizi'];
    else
    $error="Errore: campo obbligatorio, devi scegliere una delle voci.";

    foreach (
    $array_voci as $voce) {
    //se $select_utente è uguale ad una delle voci del select option non c'è haccheraggio, altrimenti se non trova nessuna voce vuol dire che hanno modificato il valore di servizi nel query string
    if ($select_utente == $voce) $good=true;
    }

    if (
    $good==false) $error="Errore: Attenzione la voce selezionata non esiste.";

    if (!
    $error) {
    $campo_nella_query=$select_utente;

    //qui esegui la query
    mysql_select_db($database_ConnCoop, $ConnCoop);
    $query_Rs_ricerca = "SELECT ".$campo_nella_query." FROM settori WHERE ".$campo_nella_query." = '1'";
    $Rs_ricerca = mysql_query($query_Rs_ricerca, $ConnCoop) or die(mysql_error());
    $row_Rs_ricerca = mysql_fetch_assoc($Rs_ricerca);
    $totalRows_Rs_ricerca = mysql_num_rows($Rs_ricerca);
    }
    else echo
    $error;


    ?>
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

  14. #14
    Guest

    Predefinito

    Grazie davvero. Ora funziona e non possono fare scherzi.
    Ho aggiunto alla query la selezione del campo IDcoop che mi serve a recuperare l'identità delle cooperative che svolgono quel servizio.
    Codice PHP:
    mysql_select_db($database_ConnCoop, $ConnCoop);
    $query_Rs_ricerca = "SELECT ".$campo_nella_query." IDcoop FROM settori WHERE ".$campo_nella_query." = '1'";
    $Rs_ricerca = mysql_query($query_Rs_ricerca, $ConnCoop) or die(mysql_error());
    $row_Rs_ricerca = mysql_fetch_assoc($Rs_ricerca);
    $totalRows_Rs_ricerca = mysql_num_rows($Rs_ricerca);
    Ma evidentemente mi spiego veramente male nel linguaggio di richiesta al database
    http://coges.altervista.org/select_settori.php.
    Dal numero delle righe vedo quante cooperative svolgono quel servizio, ma l'IDcoop mostra sempre il numero 1.
    Un passo avanto comunque è stato fatto.
    Grazie ancora e buon week end

  15. #15
    L'avatar di EuroSalute
    EuroSalute non è connesso AlterVistiano
    Data registrazione
    12-05-2003
    Messaggi
    969

    Predefinito

    manca la virgola tra i due campi:
    Codice PHP:
    $query_Rs_ricerca = "SELECT ".$campo_nella_query." , IDcoop FROM settori WHERE ".$campo_nella_query." = '1'";
    se utilizzi il codice di cui sopra, se vuoi modifica le due righe di $error così:
    Codice PHP:
    //in questo modo appariranno entrambi i messaggi di errore:

    $error="<br>Errore: campo obbligatorio, devi scegliere una delle voci.";

    $error.="<br>Errore: Attenzione la voce selezionata non esiste.";
    LOTTO MATEMATICO-SCENTIFICO che FUNZIONA:
    Scripts di Calcolo Automatico Metodologie http://eurosalute.altervista.org

    VINCI OGNI SETTIMANA CON IL NUOVO METODO 5
    FAI IL TEST CON L'ANALISI VINCITE

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •