Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    SELECT con numero parametri in WHERE variabili

    Ciao ho provato a cercare qualcosa ma... non so neppure con quali termini cercare.

    Il problema è questo, tra l'altro semplice credo: ho un form contenente i campi text nome, cognome, email, provincia.
    Non ci sono campi obbligatori, quindi l'utente può digitare su tutti e 4, su 3, su 2 o su 1 soltanto.
    Quanto passo i dati immessi allo script, devo fare una SELECT che peschi da un db di utenti, in base ai parametri digitati.

    Qual'è il sistema migliore per fare questo tipo di SELECT? Volevo evitare una lunga fila (e soprattutto intrecciata) serie di if.
    Come risolvere quindi?!

  2. #2
    proprio nessuno che sa aiutarmi... ?!?

  3. #3
    Ecco l'esempio chiaro (l'ho scritto apposta per farvi capire).
    Io vorrei evitare questo:
    Codice PHP:
    if ($_POST[provincia]) {
        
    $sql.=" provincia='$_POST[provincia]'";
        if (
    $_POST[nome]) {
            
    $sql.=" AND nome='$_POST[nome]'";
            if (
    $_POST[cognome]){
                
    $sql.=" AND cognome='$_POST[cognome]'";
                if (
    $_POST[email]) {
                    
    $sql.=" AND email='$_POST[email]'";
                }
            } elseif (
    $_POST[email]) {
                
    $sql.=" AND email='$_POST[email]'";
            }
        } elseif (
    $_POST[cognome]) {
            
    $sql.=" AND cognome='$_POST[cognome]'";
            if (
    $_POST[email]) {
                
    $sql.=" AND email='$_POST[email]'";
            }
        } elseif (
    $_POST[email]) {
            
    $sql.=" AND email='$_POST[email]'";
        }
    } elseif (
    $_POST[nome]) {
        
    $sql.=" AND nome='$_POST[nome]'";
        if (
    $_POST[cognome]){
            
    $sql.=" AND cognome='$_POST[cognome]'";
            if (
    $_POST[email]) {
                
    $sql.=" AND email='$_POST[email]'";
            }
        } elseif (
    $_POST[email]) {
            
    $sql.=" AND email='$_POST[email]'";
        }
    } elseif (
    $_POST[cognome]) {
        
    $sql.=" AND cognome='$_POST[cognome]'";
        if (
    $_POST[email]) {
            
    $sql.=" AND email='$_POST[email]'";
        }
    } else {
        
    $sql.=" AND email='$_POST[email]'";

    Vorrei evitare tutto questo annidamento di if, c'è possibilità secondo voi?!

  4. #4
    Avevo fatto tempo fa uno script, che avevo postato, che faceva proprio questo. Purtroppo chissa' dove' ...non l'ho tenuto.

    Dovresti provare a stampare il $_POST che ricevi in ingresso. Valuta quali sono le variabili che ricevi. Dopodiche' strutturi un foreach che vada a popolare il where in base ai soli campi compilati.

    La musica sarebbe appunto quella .... Ora provo a cercare se per caso lo trovo nei post vecchi. Altrimenti ci vuole poco a rifarlo di sana pianta...

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Prova questo: l'unica condizione e' che il name del form deve essere lo stesso nome campo che usi nel db. Ti ho messo l'ipotesi con un campo obbligatorio (se non serve basta eliminarlo), di un campo "submit" (da scartare) piu' i tuoi 4 campi citati. 1 campo obbligatorio comunque ci vorrebbe sempre, altrimenti ti tira fuori tutto il db...
    codice:
    <?php
    // dati di prova
    $_POST['provincia'] = 'Novara';
    $_POST['nome']      = '';
    $_POST['cognome']   = 'Brambilla';
    $_POST['email']     = 'brambilla@lamadunina.mi';
    $_POST['submit']    = 'Invia';
    
    echo "<pre>";
    print_r($_POST);
    
    
    // inizio estrazione dati...
    $where = "WHERE ";
    
    foreach($_POST as $key => $value  ) {
    
       if($key == 'provincia' AND $value == '' ) {
          echo "La Provincia e' un dato obbligatorio.
                ciao ciao micio micio";
          exit;
    
          } elseif($value == '' OR $key == 'submit' ) {
                    //    nessuna azione
                }  
                   else {
                           $where .=  "$key = '$value' AND ";
                         }
    }
    $where = substr($where, 0, -4);
    
    echo "
    SELECT *
    FROM tabella
    $where";
    
    ?>
    Avendo solo 4 campi potresti fare 4 elseif, una per ogni campo dove potresti controllare i dati inseriti oppure cambiare il "name" del form con l'eventuale nome_campo diverso nella tabella. (metti il nome_campo al posto di $key)

    Potrebbero anche essere 50 campi...


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Piero, non so come ringraziarti!!!
    Io ho riadattato, anche per esigenze di script, le tue indicazioni nel seguente modo:

    Codice PHP:
    $sql="SELECT id FROM anagrafica WHERE";
    foreach(
    $_POST as $key => $value) {
        if(
    $key=='provincia' AND $value!='') {
            if (
    eregi(',',$_POST[provincia])) {        
                
    $prov=split(","$_POST[provincia]);
                
    $sql.=" (";
                foreach (
    $prov as $valore) {
                    
    $valore=ltrim($valore);
                    
    $valore=rtrim($valore);
                    
    $sql.="provincia='$valore' OR ";
                }
                
    $lunghezza=strlen($sql);
                
    $sql=substr($sql,0,($lunghezza-4));
                
    $sql.=") AND";
            } else {
                
    $sql.=" provincia='$_POST[provincia]' AND";
            }
        } else {
            if ((
    $key=='nome' OR $key=='cognome' OR $key=='email') AND $value!=''$sql.=$key='$value' AND";
        }
    }
    $lunghezza=strlen($sql);
    $sql=substr($sql,0,$lunghezza-4); 
    Così funziona alla grande, grazie!


    note aggiuntive: i passaggi sul campo provincia sono dovuti al fatto che io permetto all'utente di specificare più provincie separandole dalla ",".

  7. #7
    Bene... cosi' mi piace. dare idee e non fare script serviti....

    devi solo mettere le apici all'indice associativo in queste due righe che ti cito sotto per evitare il NOTICE.
    codice:
     if (eregi(',',$_POST['provincia'])) {         
                $prov=split(",", $_POST['provincia']);
    Altrimenti come "provincia" cerca una costante. poi non serve piu' perche' il successivo e' tra doppi apici e va bene.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.