[RISOLTO] Php/mysql - ricerca con più parametri contemporaneamente, come risolvo?

di il
4 risposte

[RISOLTO] Php/mysql - ricerca con più parametri contemporaneamente, come risolvo?

Salve ragazz*, è la prima volta che scrivo e lo faccio per chiedere un consiglio: devo realizzare un sito web che permetta di visualizzare gli artisti e le relative opere presenti nel database dei musei Tate, è il progetto per l'esame di Basi di Dati. Da premettere che ho iniziato con questo esame a scrivere in html, css, php e ad utilizzare mysql quindi sono ancora a livello base. Stando alle linee guida del progetto, il sito web deve poter offrire alcune funzionalità di minima che sto cercando di implementare. Questa è quella che sto provando a fare in questo momento:
-"ricerca di un artista inserendo uno o più parametri (anche parziali) - nel caso in cui nessun parametro venga specificato deve essere presentata la lista completa degli artisti".
Richiamo correttamente il nome dell'artista inserendo il nome per intero o la lettera, l'anno, il sesso ecc ecc e funziona correttamente.
Quello che dovrei fare ora è "inserendo uno o più parametri". Immagino quindi che oltre alla barra di ricerca per il nome (o per il singolo parametro che decida di usare), debba aggiungere anche quella per un secondo o terzo parametro per la ricerca (ad esempio nome+data di nascita, o nome + luogo di nascita + anno ecc ecc). Come faccio quindi a creare un form con più caselle per la stessa ricerca e poi fare in modo che questa ricerca a più parametri vada a buon fine? Ho provato ad andare ad intuito ma invece di una ricerca incrociata, mi esce l'elenco completo di tutti gli artisti e non va bene.
Probabilmente la soluzione è stupida ma a me non viene in mente (data ancora la scarsa conoscenza di php). Come posso risolvere la cosa?
Vi posto qui le pagine già scritte e funzionanti:

Questa è la pagina iniziale dove ho il form per la ricerca:
<?php
	include 'progIntestazione.php';
?>


<form action="progRicerca.php" method="POST">
	<input type="text" name="search" placeholder="Nome Autore">
	<button type="submit" name="submit-search">Cerca</button>

</form>

<h1>Prima pagina</h1>
<h2>Elenco generale:</h2>

<div class="elenco-autori-opere">
	<?php
		$sql = "SELECT A.name, O.title
			FROM Artista AS A, Opera AS O
			WHERE A.id=O.artistId AND A.name=O.artist";
		$result = mysqli_query($conn, $sql);
		$queryResults = mysqli_num_rows($result);


		if ($queryResults > 0) {
			echo '<table border: 1px solid #000 ><tr><th>Nome Autore</th><th>Titolo Opera</th></tr>';			

			while ($row = mysqli_fetch_assoc($result)){
				
				echo "<tr class='tabella-autori-opere'><td>".$row['name']."</td>
					<td>".$row['title']."</td></tr>";
			}
		}

	?>

</div>

</body>
</html>
Questa invece è la ricerca vera e propria:
<?php
	include 'progIntestazione.php';
?>

<h1>Pagina di ricerca per Autore</h1>

<div class="elenco-autori-opere">
	<?php
		if(isset($_POST['submit-search'])) {
			$search = mysqli_real_escape_string($conn, $_POST['search']);
			$anno = mysqli_real_escape_string($conn, $_POST['anno']);
			$sql = "SELECT * 
				FROM Artista 
				WHERE name LIKE '%$search%' OR id LIKE '%$search%' OR gender LIKE '%$search%' OR dates LIKE '%$search%'";
			$result = mysqli_query($conn, $sql);
			$queryResult = mysqli_num_rows($result);

			if ($queryResult > 0) {
				echo '<table border: 1px solid #000 ><tr><th>Id</th><th>Nome</th><th>Sesso</th><th>Date</th><th>Anno di nascita</th><th>Anno di morte</th><th>Luogo di nascita</th><th>Luogo di morte</th><th>url</th></tr>';
				
				while($row = mysqli_fetch_assoc($result)){
					
					echo "<tr class='tabella-autori-opere'><td>".$row['id']."</td>
					<td>".$row['name']."</td><td>".$row['gender']."</td><td>".$row['dates']."</td><td>".$row['yearOfBirth']."</td><td>".$row['yearOfDeath']."</td><td>".$row['placeOfBirth']."</td><td>".$row['placeOfDeath']."</td><td>".$row['url']."</td></tr>";

				}
			}else{

				echo "Non ci sono risultati corrispondenti alla tua ricerca!";
			}
		}

	?>
	

</div>
Infine una cosa che non sto capendo, vi posto l'immagine perchè non saprei come altro descrivere il problema:


A cosa sono dovuti i punti interrogativi? E come posso toglierli facendo vedere correttamente i trattini (ed altre robe) che dovrebbero esserci?

4 Risposte

  • Re: [RISOLTO] Php/mysql - ricerca con più parametri contemporaneamente, come risolvo?

    A parte che non mi è chiaro cosa c'entri PHP con l'esame di basi di dati (si vede che l'università va sempre peggio... vabbè).
    A parte che usi metodi PHP di accesso al database sconsigliati e ormai in phase out (ma suppongo non sia colpa tua).
    A parte tutto ciò... non è che abbia proprio chiarissimo cosa vuoi fare.

    ti serviranno dei parametri di selezione, che possono essere tipicamente di AND oppure OR
    "SELECT *
    FROM Artista
    WHERE name LIKE '%$search%' OR id LIKE '%$search%' OR gender LIKE '%$search%' OR dates LIKE '%$search%'";
    A parte che ti consiglio fortemente di usare le parentesi, quelle sono ricerche in OR.
    Dipende da te decidere se vuoi cercare in quel modo.
    Normalmente sono filtri in AND (e non in OR).

    Seguendo il tuo metodo "barbaro" dovrai testare i vari campi che contengono i parametri di ricerca
    (nome, id, genere, ...).
    Se NON sono vuoti, allora nella stringa del WHERE aggiungerai ... AND (campo LIKE qualcosa ) ...
    Alla fine eseguirai la query con la lista generata in tal modo.

    Non aggiungo nulla sul lato PHP-sicurezza-injection e chi più ne ha ne metta, essendo un esame (?) di BD non credo gli aspetti di questo tipo siano particolarmente rilevanti.
  • Re: [RISOLTO] Php/mysql - ricerca con più parametri contemporaneamente, come risolvo?

    +m2+ ha scritto:


    A parte che non mi è chiaro cosa c'entri PHP con l'esame di basi di dati (si vede che l'università va sempre peggio... vabbè).
    Beh non lo so, il programma è quello, mio malgrado.

    +m2+ ha scritto:


    A parte tutto ciò... non è che abbia proprio chiarissimo cosa vuoi fare.
    Vorrei poter avere nella pagina principale più "caselle" per un'unica ricerca: ad esempio una casella dove scrivere il nome, una in cui immettere l'anno e con un solo tasto "cerca" ottenere nella nuova pagina -ad esempio- tutti gli autori che si chiamano Turner e che sono nati nel 1936.

    +m2+ ha scritto:


    A parte che ti consiglio fortemente di usare le parentesi, quelle sono ricerche in OR.
    Ho seguito il tuo consiglio e sistemato le parentesi, grazie.

    +m2+ ha scritto:


    Dipende da te decidere se vuoi cercare in quel modo.
    Normalmente sono filtri in AND (e non in OR).
    Seguendo il tuo metodo "barbaro" dovrai testare i vari campi che contengono i parametri di ricerca
    (nome, id, genere, ...).
    Se NON sono vuoti, allora nella stringa del WHERE aggiungerai ... AND (campo LIKE qualcosa ) ...
    Alla fine eseguirai la query con la lista generata in tal modo.
    Non credo di aver capito qui: quello che ho fatto all'inizio è stato provare a mettere due <input ...> nel form, creando una seconda variabile collegata a quell'input ($gender = $_POST['gender'] e richiamando questa nel WHERE, usando AND e non OR, ma o mi dà risultati sbagliati, o mi dice che non esistono. Questa è una prova che ho fatto ad intuito perchè non ho trovato una soluzione al mio problema altrove, prima di chiedere qui.
  • Re: [RISOLTO] Php/mysql - ricerca con più parametri contemporaneamente, come risolvo?

    1) basi di dati non ha nulla a che fare con PHP, nota di servizio. Vabbè
    2) sei sulla strada buona, ma è più facile di quello che pensi.
    tutti gli autori che si chiamano Turner e che sono nati nel 1936.
    Come vedi c'è la E (AND)
    Devi creare una stringa giustapponendo gli eventuali parametri.
    Quindi partirai da una variabile che so query, vuota (bhè puoi inizializzarla a select * from tabella where (1=1) se sei pigro)
    Poi dirai "se la variabile NOME (presa dalla form) è non vuota, allora aggiungi alla query " AND (nome like "%qualcosa%") " (fai attenzione agli spazi).
    "Se la variabile ANNO (sempre presa dalla form) è non vuota, allora aggiungi alla query " AND (anno=qualcosa) "

    A scopo di debug fai stampare a video la query intera, così puoi vedere se è ben formata.
    La query finale sarà del tipo nei 4 casi

    1) sia nome, che anno
    select * from tabella where (1=1) AND (nome like "%pippo baudo%") AND (anno=2016)

    2) solo nome
    select * from tabella where (1=1) AND (nome like "%pippo baudo%")

    3) solo anno
    select * from tabella where (1=1) AND (anno=2016)

    4) niente (cioè tutti)
    select * from tabella where (1=1)

    Se ti stai chiedendo a cosa serve (1=1) iniziale, è per gestire la possibilità di non avere parametri.
    Se nome e anno sono vuote, non puoi fare una query
    select * from tabella where e basta, avresti un errore.
    Per fare una cosa "pulita" dovresti fare i vari casi:
    - tutte le variabili sono vuote, fai una select * from tabella SENZA where
    - una variabile è vuota? fai select * from tabella where (nome like "%qualcosa%") SENZA la AND iniziale
    (...)
    Non è che sia difficile, e inoltre puoi "disorientare" l'ottimizzatore RDBMS mettendo un (1=1) all'inizio... comunque per il livello universitario va bene.


    ---
    Sottolineo che dal punto di vista della sicurezza PHP è diciamo così a livello meno che dilettantistico, ma d'altronde dovrebbe essere un esame sui database e non su linguaggi di scripting
  • Re: [RISOLTO] Php/mysql - ricerca con più parametri contemporaneamente, come risolvo?

    +m2+ ha scritto:


    1) basi di dati non ha nulla a che fare con PHP, nota di servizio. Vabbè
    2) sei sulla strada buona, ma è più facile di quello che pensi.
    tutti gli autori che si chiamano Turner e che sono nati nel 1936.
    Come vedi c'è la E (AND)
    Devi creare una stringa giustapponendo gli eventuali parametri.
    Quindi partirai da una variabile che so query, vuota (bhè puoi inizializzarla a select * from tabella where (1=1) se sei pigro)
    Poi dirai "se la variabile NOME (presa dalla form) è non vuota, allora aggiungi alla query " AND (nome like "%qualcosa%") " (fai attenzione agli spazi).
    "Se la variabile ANNO (sempre presa dalla form) è non vuota, allora aggiungi alla query " AND (anno=qualcosa) "

    A scopo di debug fai stampare a video la query intera, così puoi vedere se è ben formata.
    La query finale sarà del tipo nei 4 casi

    1) sia nome, che anno
    select * from tabella where (1=1) AND (nome like "%pippo baudo%") AND (anno=2016)

    2) solo nome
    select * from tabella where (1=1) AND (nome like "%pippo baudo%")

    3) solo anno
    select * from tabella where (1=1) AND (anno=2016)

    4) niente (cioè tutti)
    select * from tabella where (1=1)

    Se ti stai chiedendo a cosa serve (1=1) iniziale, è per gestire la possibilità di non avere parametri.
    Se nome e anno sono vuote, non puoi fare una query
    select * from tabella where e basta, avresti un errore.
    Per fare una cosa "pulita" dovresti fare i vari casi:
    - tutte le variabili sono vuote, fai una select * from tabella SENZA where
    - una variabile è vuota? fai select * from tabella where (nome like "%qualcosa%") SENZA la AND iniziale
    (...)
    Non è che sia difficile, e inoltre puoi "disorientare" l'ottimizzatore RDBMS mettendo un (1=1) all'inizio... comunque per il livello universitario va bene.


    ---
    Sottolineo che dal punto di vista della sicurezza PHP è diciamo così a livello meno che dilettantistico, ma d'altronde dovrebbe essere un esame sui database e non su linguaggi di scripting
    Eeeeeeh ce l'ho fatta!!! Inizialmente non mi usciva, poi ho fatto un po' di prove, seguendo i tuoi suggerimenti ed andando piano piano a tentativi ed ora funziona tutto! Adesso proverò a proseguire con gli altri punti della consegna. Grazie infinite per i consigli e per la pazienza.
Devi accedere o registrarti per scrivere nel forum
4 risposte