[PHP] filtro

steve97

Utente Attivo
30 Mar 2017
51
0
6
nel mio db ho 2 tabelle, 1-utenti, 2-raccolta, nel primo registro tutti i nuovi utenti, nell'altro registro i gusti musicali dei miei utenti. nella tabella utenti ho il campo nazione, nell'altra ho i campi, artista e disponibilita che incrementa ogni volta che a un utente piace l'artista di un altro utente.
dunque nella homepage ho un formulario di ricerca con 2 campi, 1-artistta, 2-nazione, detto cio vorrei avere un filtro nei risultati, in tal modo che se un utente fa la ricerca con il nome di un artista vorrei che gli venisse mostrato tutti gli utenti che piacciono lo stesso artista e la nazionalita di questi utenti.
invece se qualcuno vuole sapere i gusti degli utenti della sua zona puo fare una ricerca per nazione e ottenere la lista di tutti gli utenti di quella precisa zona. un classico esempio e una bacheca degli annunci, se si cerca qualcosa si riceve la lista dei venditori e la posizione di queesti, invece se si cerca solo per zona si ottiene solo la lista di oggetti venduti in quella zona

visto la quantita di codice dei miei script ho preferito lasciarlo su github
https://github.com/stevenpro/sistema-di-prestiti-
 

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
Ciao steve97,
sempre che abbia bene interpretato ciò che chiedevi, ho fatto alcune prove, per le quali mi sono creato due tabelle, stilizzate al massimo:

PHP:
CREATE TABLE UTENTI (
        ID int(3) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        UTENTE varchar(10) NOT NULL,
        NAZIONE varchar(10) NOT NULL,
);      

CREATE TABLE RACCOLTA (
        ID int(3) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        ID_UTENTE int(3) NOT NULL,
        ARTISTA varchar(10) NOT NULL,
);

questo è il form, anch'esso molto stilizzato:


PHP:
<?php
echo '<form action="contrform.php" method="get">';
echo '    Cerca per: artista: ';
echo '    <input type="text" name="artista">';
echo '    nazione: ';
echo '    <input type="text" name="nazione">';
echo '    <br><br><input type="submit" name="invia" value="Invia i dati">';
echo '</form>';
?>
e infine il controllo:

PHP:
<?php
$artista = $_GET['artista'];
$nazione = $_GET['nazione'];

$connessione = new mysqli('.....','....','...-','....');

// verifica su eventuali errori di connessione
if ($connessione->connect_errno) {
    echo "Connessione fallita: ". $connessione->connect_error . ".";
    exit();
}

if ($artista != '') {
    if (!$result = $connessione->query("SELECT UTENTI.*,RACCOLTA.* FROM UTENTI INNER JOIN RACCOLTA ON RACCOLTA.ID_UTENTE = UTENTI.ID WHERE RACCOLTA.ARTISTA = '$artista'")) {
        echo "Errore della query: " . $connessione->error . ".";
    } else {
        // conteggio dei record
        if ($result->num_rows > 0) {
            // conteggio dei record restituiti dalla query
            while($row = $result->fetch_array(MYSQLI_ASSOC)) {
                  $id = $row['ID'];
                  $utente = $row['UTENTE'];
                  $nazione = $row['NAZIONE'];

                 echo $utente.' '.$nazione.'<br>';
           }
        }
    }
} else {
    if (!$result = $connessione->query("SELECT * FROM UTENTI WHERE NAZIONE = '$nazione'")) {
        echo "Errore della query: " . $connessione->error . ".";
    } else {
        // conteggio dei record
        if ($result->num_rows > 0) {
            // conteggio dei record restituiti dalla query
            while($row = $result->fetch_array(MYSQLI_ASSOC)) {
                  $id = $row['ID'];
                  $utente = $row['UTENTE'];
                  $nazione = $row['NAZIONE'];

                 echo $utente.' '.$nazione.'<br>';
           }
        }
    }

}

// liberazione delle risorse occupate dal risultato
$result->close();

?>

Zorro
 

steve97

Utente Attivo
30 Mar 2017
51
0
6
Ciao steve97,
sempre che abbia bene interpretato ciò che chiedevi, ho fatto alcune prove, per le quali mi sono creato due tabelle, stilizzate al massimo:

PHP:
CREATE TABLE UTENTI (
        ID int(3) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        UTENTE varchar(10) NOT NULL,
        NAZIONE varchar(10) NOT NULL,
);     

CREATE TABLE RACCOLTA (
        ID int(3) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        ID_UTENTE int(3) NOT NULL,
        ARTISTA varchar(10) NOT NULL,
);

questo è il form, anch'esso molto stilizzato:


PHP:
<?php
echo '<form action="contrform.php" method="get">';
echo '    Cerca per: artista: ';
echo '    <input type="text" name="artista">';
echo '    nazione: ';
echo '    <input type="text" name="nazione">';
echo '    <br><br><input type="submit" name="invia" value="Invia i dati">';
echo '</form>';
?>
e infine il controllo:

PHP:
<?php
$artista = $_GET['artista'];
$nazione = $_GET['nazione'];

$connessione = new mysqli('.....','....','...-','....');

// verifica su eventuali errori di connessione
if ($connessione->connect_errno) {
    echo "Connessione fallita: ". $connessione->connect_error . ".";
    exit();
}

if ($artista != '') {
    if (!$result = $connessione->query("SELECT UTENTI.*,RACCOLTA.* FROM UTENTI INNER JOIN RACCOLTA ON RACCOLTA.ID_UTENTE = UTENTI.ID WHERE RACCOLTA.ARTISTA = '$artista'")) {
        echo "Errore della query: " . $connessione->error . ".";
    } else {
        // conteggio dei record
        if ($result->num_rows > 0) {
            // conteggio dei record restituiti dalla query
            while($row = $result->fetch_array(MYSQLI_ASSOC)) {
                  $id = $row['ID'];
                  $utente = $row['UTENTE'];
                  $nazione = $row['NAZIONE'];

                 echo $utente.' '.$nazione.'<br>';
           }
        }
    }
} else {
    if (!$result = $connessione->query("SELECT * FROM UTENTI WHERE NAZIONE = '$nazione'")) {
        echo "Errore della query: " . $connessione->error . ".";
    } else {
        // conteggio dei record
        if ($result->num_rows > 0) {
            // conteggio dei record restituiti dalla query
            while($row = $result->fetch_array(MYSQLI_ASSOC)) {
                  $id = $row['ID'];
                  $utente = $row['UTENTE'];
                  $nazione = $row['NAZIONE'];

                 echo $utente.' '.$nazione.'<br>';
           }
        }
    }

}

// liberazione delle risorse occupate dal risultato
$result->close();

?>

Zorro
grazie zorro ma io avrei preferito un fork da parte tua, cosi da provare subito la tua soluzione. d'altronde io non uso il paradigma opp.
 

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
Ciao, se per fork intendi un esempio pratico, eccolo. Ovviamente dovrai adattarlo alle tue esigenze, inoltre penso che non importi molto come ti connetti, ma la query che usi per estrapolare i dati
 

steve97

Utente Attivo
30 Mar 2017
51
0
6
Ciao, se per fork intendi un esempio pratico, eccolo. Ovviamente dovrai adattarlo alle tue esigenze, inoltre penso che non importi molto come ti connetti, ma la query che usi per estrapolare i dati
ma nel campo di ricerca, non c'entra la nazione dell'artista ma la nazione dell'utente, comunque grazie, io sono ancora alle prime armi con php e non domino il paradigma opp e mi confondo. comunque con fork intendevo di prendere il mio codice e modificarlo, e poi ricaricarlo nella mia repository.
forse e meglio se facciamo x i libri. ad esempio se cerco il libro di harry potter e lascio il campo nazione vuoto dovrei avere nei risultati tutti i libri di harry potter e il luogo in cui e disponibile. invece se lascio il campo titolo del libro vuoto e metto lombardia nel campo nazione, dovrei avere tutti i libri che sono disponibili in quella zona, spero che sia chiaro il concetto, grazie.
la pagina e www.wardrivers.altervista.org

recapitolando tutto brevemente, nella mia homepage ho 3 sezioni,
1. form di login, 2 form di registrazione, 3 campo dei risultati, di default qui mi mostra tutti i dati estrapoltati nel db
 
Ultima modifica:

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
ma nel campo di ricerca, non c'entra la nazione dell'artista ma la nazione dell'utente,

ma infatti la nazione (o regione) è dell'utente, non dell'artista (infatti si trova nella tabella UTENTI). Se tu inserisci la nazione nel form di ricerca, ti estrapola tutti gli utenti che risiedono in quella nazione/regione; se fai la ricerca per artista invece ti fa vedere solo gli utenti, con la relativa nazione, amanti di quel particolare artista
 

steve97

Utente Attivo
30 Mar 2017
51
0
6
ma infatti la nazione (o regione) è dell'utente, non dell'artista (infatti si trova nella tabella UTENTI). Se tu inserisci la nazione nel form di ricerca, ti estrapola tutti gli utenti che risiedono in quella nazione/regione; se fai la ricerca per artista invece ti fa vedere solo gli utenti, con la relativa nazione, amanti di quel particolare artista
scusa ma la freccia destra nel codice x cosa sta, come sarebbe il codice normalmente senza quello
 

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
Cosa intendi con freccia destra e in quale parte del codice; spiegati meglio
 

steve97

Utente Attivo
30 Mar 2017
51
0
6
vorrei avere in un solo risultato la disponibilita e la ubicazione del libro

PHP:
<?php

$nome = $_GET['nome'];
$nazione = $_GET['nazione'];

$conex = mysql_connect('localhost', 'wardrivers');
mysql_select_db('my_wardrivers', $conex);

$sql = "SELECT * FROM raccolta WHERE nome='$nome'";
$result = mysql_query($sql);

if(mysql_num_rows($result) == 0) {echo "non ce ancora niente";}
elseif(mysql_num_rows($result) >= 1) {

while($reg = mysql_fetch_array($result)) {
echo "<div id='risultati'>";
echo "nome :".$reg['nome']."<br>";
echo "disponibilita :".$reg['disponibilita']."<br>";
echo "nazione :".$reg['nazione']."<br>";


}
?>
 
Ultima modifica di un moderatore:

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
la 'freccia destra' si chiama appunto operatore freccia, si scrive col trattino seguito dal simbolo di maggiore e si usa nella
oop, in particolare con le classi, e serve per accedere ad una proprietà o ad un metodo della classe.
Farò qualche prova con i libri; quindi, se ho capito bene, tu vorresti che, di un particolare libro, conoscere la disponibilità totale e le nazioni dove si trova es: disp. 5 nazioni: germania 2 italia 1 olanda 2
 
  • Like
Reactions: steve97

steve97

Utente Attivo
30 Mar 2017
51
0
6
la 'freccia destra' si chiama appunto operatore freccia, si scrive col trattino seguito dal simbolo di maggiore e si usa nella
oop, in particolare con le classi, e serve per accedere ad una proprietà o ad un metodo della classe.
Farò qualche prova con i libri; quindi, se ho capito bene, tu vorresti che, di un particolare libro, conoscere la disponibilità totale e le nazioni dove si trova es: disp. 5 nazioni: germania 2 italia 1 olanda 2
si e propio quello che voglio, ho cercato in rete ma mi confondo
 

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
....Fatto
Ho leggermente modificato le due tabelle (UTENTI e LIBRI). Ho inserito 4 libri dil prova: harry potter, il corsaro nero, cenerentola e bambi. Questo il link di esempio. Fai la prova con tuttli e 4 i libri. Spero vada bene


Zorro
 

steve97

Utente Attivo
30 Mar 2017
51
0
6
scussa adesso funziona il link e anche il sito bravo, ma adesso come faccio a integrarlo nel mio sito, potresti caricare il codice su git o qua, grazie
 

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
Prima di tutto le tabelle

PHP:
CREATE TABLE UTENTI (
        ID int(3) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        ID_LIBRO int(3) NOT NULL,
        UTENTE varchar(10) NOT NULL,
        NAZIONE varchar(10) NOT NULL,
);  

CREATE TABLE LIBRI (
        ID int(3) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        LIBRO varchar(10) NOT NULL,
);
quindi il form

PHP:
<?php
echo '<form action="contrform.php" method="get">';
echo '    Cerca per: libro: ';
echo '    <input type="text" name="libro">';
echo '    <br><br><input type="submit" name="invia" value="Invia i dati">';
echo '</form>';
?>
e infine il controllo

PHP:
<?php
$libro = $_GET['libro'];
$nazione = $_GET['nazione'];
$tot_libri = 0;
$arr_libri = array();
$indice = 0;
$nazione = '';

$connessione = new mysqli($host, $user, $password, $db);

// verifica su eventuali errori di connessione
if ($connessione->connect_errno) {
    echo "Connessione fallita: ". $connessione->connect_error . ".";
    exit();
}


if (!$result = $connessione->query("SELECT UTENTI.*,LIBRI.* FROM LIBRI INNER JOIN UTENTI ON LIBRI.ID = UTENTI.ID_LIBRO WHERE LIBRI.LIBRO = '$libro' ORDER BY NAZIONE")) {
    echo "Errore della query: " . $connessione->error . ".";
} else {
    // conteggio dei record
    if ($result->num_rows > 0) {
        // conteggio dei record restituiti dalla query
        while($row = $result->fetch_array(MYSQLI_ASSOC)) {
              $id = $row['ID'];
              $utente = $row['UTENTE'];
              $nazione = $row['NAZIONE'];
                 
              $tot_libri++;
              $arr_libri[$indice]['utente'] = $utente;
              $arr_libri[$indice]['nazione'] = $nazione;
              $indice++;
        }
        echo 'Totale libri disponibili: '.$tot_libri.'<br><br>';
        for ($ind=0;$ind<$tot_libri;$ind++) {
             if ($arr_libri[$ind]['nazione'] != $nazione) {
                 $nazione = $arr_libri[$ind]['nazione'];
                 echo '<br><b>'.$nazione.'</b><br>';
             }
             echo '&emsp;'.$arr_libri[$ind]['utente'].'  '.$arr_libri[$ind]['nazione'].'<br>';
        }
    } else {
        echo 'Spiacenti. Libro non disponibile.';
    }
}


// liberazione delle risorse occupate dal risultato
$result->close();

?>
Come vedi, ho creato un array (arr_libri) a due dimensioni misto (il primo indice numerico, il secondo 'associativo'). Se hai qualche dubbio, posta pure. Ciao


Zorro
 

zorro

Utente Attivo
20 Ott 2014
231
10
18
ROMA
PS
Ho dimenticato di cambiare il method del form in post (e quindi anche le variabili $_POST.....)