Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    387

    Possibile unire LIKE ed "=" in una query sql?

    Buongiorno a tutti,
    ho un parametro di ricerca, passato via GET, che può essere un numero (quindi un ID del database) od un testo.

    La query SQL è abbastanza semplice:

    codice:
    $ricerca = $mysqli->real_escape_string(strip_magic($_GET['ricerca']));
    
    $sql = "SELECT * FROM (";
    $sql .= "SELECT id_ristorante, nome_ristorante, regioni.regione AS regione_testo, province.provincia AS provincia_testo, comuni.comune AS comune_testo, latitudine, longitudine FROM ristoranti INNER JOIN regioni ON ristoranti.regione = regioni.id INNER JOIN province ON ristoranti.provincia = province.id INNER JOIN comuni ON ristoranti.comune = comuni.id";
    $sql .= ") AS tabella_derivata WHERE ";
    $sql .= "regione_testo LIKE '%".$ricerca."%' OR ";
    $sql .= "provincia_testo LIKE '%".$ricerca."%' OR ";
    $sql .= "comune_testo LIKE '%".$ricerca."%' OR ";
    $sql .= "nome_ristorante LIKE '%".$ricerca."%' OR ";
    $sql .= "id_ristorante LIKE '%".$ricerca."%'";
    Se lascio cosi, passando il valore "lazio" trovo correttamente i valori, idem per altri valori di testo.
    Se passo "2" ovviamente mi trova 2, 20, 21, 200, etc etc.

    Se inserisco l'ultimo "WHERE" in questa maniera
    codice:
    $sql .= "id_ristorante = $ricerca";
    OPPURE
    codice:
    $sql .= "id_ristorante LIKE $ricerca";
    Ottengo che passando il valore "2" ottengo solamente il record con ID 2 (perfetto), ma passando un testo (ad esempio "lazio") ottengo come risposta
    codice:
    Unknown column 'lazio' in 'where clause'
    Ora potrei risolvere splittando la sql, facendo un controllo "se ricerca è numerico" allora fai sql solo su ID, ma mi piacerebbe capire dove erro...

    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di jcsnake
    Registrato dal
    Jun 2010
    Messaggi
    629
    Ciao, l'errore che commetti è solo logico...in quanto molto probabilmente nel tuo db la colonna id_ristorante è stata dichiarata come numerica, quindi al passaggio della stringa "lazio" semplicemente non può eseguirla dovendo confrantare, per l'appunto, una stringa con un numerico. Come hai detto anche tu ti consiglio di costruirti due query diverse a seconda che il valore prelevato dal GET sia numerico o stringa

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    387
    Esatto... ovviamente ID è numerico incrementale bla bla bla

    Risolto appunto con una doppia query... e pazienza per un ciclo... rallenterà di quanti millisecondi?

  4. #4
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    L'errore non è solo logico, è anche sintattico: la clausola LIKE di mysql esige un parametro messo tra virgolette, altrimenti cerca di interpretarlo come se fosse il nome di una colonna (te lo sta anche dicendo nel messaggio di errore)

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.