Problemi motore di ricerca

pinoshine

Utente Attivo
15 Set 2012
95
0
0
Ciao a tutti, sto cercando di creare un motore di ricerca in full text per un sito di agenzia immobiliare che ha annunci si di vendita e di fitti ma ho riscontrato due problemi che proprio non riesco a risolvere per questo chiedo gentilmente aiuto agli esperti, la tabella nel database si chiama annunci ed e' cosi' formata:
Codice:
CREATE TABLE `annunci` (
  `idannuncio` int(11) NOT NULL AUTO_INCREMENT,
  `localita` varchar(200) NOT NULL,
  `bagni` text NOT NULL,
  `camere` text NOT NULL,
  PRIMARY KEY (`idannuncio`),
  FULLTEXT KEY `localita` (`localita`,`bagni`,`camere`)
) ENGINE=MyISAM


Questo e' il form:
Codice:
<form  method="post" action="cerca-annunci.php">
                                    <div class='widget-section'>
                                        <div class='inner'>
                                            <label for="location">Località</label>
                                            <input type="text" name='localita' id='location' class='input-block-level' placeholder="es. Ischia Porto, Casamicciola"/>
                                        </div>
                                    </div>
                                    <div class='widget-section'>
                                        <div class='inner'>
                                            <label for="propertyType">Numero Camere</label>
                                            <input type="text" name='camere'  class='input-block-level' placeholder="es. 1,2,3"/>
                                        </div>
                                    </div>
                                    <div class='widget-section'>
                                        <div class='inner'>
                                            <label for="bedrooms">Numero Bagni</label>
                                            <input type="text" name='bagni'  class='input-block-level' placeholder="es. 1,2,3,"/>
                                        </div>
                                    </div>
                                    
                                    <section class='widget-buttons'>
                                        <div class='inner'>
                                            <button type="submit" class='btn btn-primary btn-large btn-block'><i class="icon-search icon-white"></i> CERCA</button>
                                    
                                </form>

il codice e' questo:
PHP:
<?
		
//recupero i valori via post dal precendete form di ricerca
$localita = $_POST['localita'];
$camere = $_POST['camere'];
$bagni = $_POST['bagni'];

//inizio il loop
require_once("config.php");  //connessione db

mysql_select_db("$db_name",$connessione); 

//verisone più avanzata
$risultato = mysql_query("SELECT *, MATCH(localita, camere, bagni) AGAINST('$localita, $camere, $bagni') as score
		FROM annunci
		WHERE MATCH(localita, camere, bagni) AGAINST('$localita, $camere, $bagni')
		ORDER BY score ASC");
		
		//in caso di errore
			if (!$risultato) {

					exit ('<p> Errore mentre recuperavo i dati' . mysql_error() . '</p>');
			}

if (mysql_num_rows($risultato) == 0) {
echo '<table align="center" class="clear" cellpadding="4" cellspacing="0" border="0" width="100%">';
	echo '<td align=center class="require">NON CI SONO ANNUNCI INSERITI! RIPROVA LA RICERCA</td>';
	 echo '</table>';
			
		} else

while ($row = mysql_fetch_array($risultato))   

		{

//stampo risultati a video come siete abituati
?>
il primo problema sta che se cerco ad esempio la località roma ed aggiunco il mumero delle camere e dei bagni la ricerca e' vuota se metto invece solo la località mi trova i risultatisia per gli annunci dei fitti che delle vendite, l'altro problema invece e' che se tengo la localita' roma per fitti e vendite non mi trova niente: Ragazzi vi chiedo aiuto perche non riesco proprio ad uscirne fuori.
Grazie
 
Nota bene, il metodo MATCH/AGAINST restituisce risultati solo se la tabella ha almeno un certo numero di record... di solito almeno cinque..
Tuttavia non credo sia il tuo caso (ma per sicurezza, se poco popolato, aggiungi qualche record alla tabella in fase di sviluppo giusto per tranquillità).

Poi perchè bagno e camere sono dei "text"? cosa contengono?


ho notato che non hai un feddback nel caso in cui la query fallisca... sicuro che non sia un problema di codice? prova a d aggiungere:
PHP:
//verisone più avanzata
$risultato = mysql_query("SELECT *, MATCH(localita, camere, bagni) AGAINST('$localita, $camere, $bagni') as score
        FROM annunci
        WHERE MATCH(localita, camere, bagni) AGAINST('$localita, $camere, $bagni')
        ORDER BY score ASC") or die( mysql_error() );
 
Ciao grazie per la risposta, ho provato a modificare come mi hai sugerito m purtroppo la ricerca continua a non funzionare, le doppie località non me le visualizza e se inserisco la quantità di camere o bagni nel form stessa storia proprio non capisco, cmq nella tabella mysql la riga bagni e camere contiene in numero(es. 2) la quantità di camere o bagni disponibili
 
ciao allora, ricapitolando..

localita: contiene il nome di una citta, quindi un varchar(50) va più che bene
camere: contiene un numero, quindi sarebbe meglio impostarlo ad int
bagni: vedi camere

usare MATCH/AGAINST non ha senso... avrebbe senso solo per ricerche all'interno di testi (stile Google)

la tabella diventa quindi


Codice:
CREATE TABLE `annunci` (
  `idannuncio` int(11) NOT NULL AUTO_INCREMENT,
  `localita` varchar(50) NOT NULL,
  `bagni` int(11) NOT NULL,
  `camere` int(11) NOT NULL,
  PRIMARY KEY (`idannuncio`),
  INDEX `localita` (`localita`), 
  INDEX `bagni` (`bagni`), 
  INDEX `camere` (`camere`), 
) ENGINE=InnoDB


a questo punto ti basta una più classica, ma nel tuo caso molto più efficace:

PHP:
$slq = "SELECT * FROM annunci WHERE localita like '%s' AND camere >= %d AND bagni >= %d";
$query = sprintf($slq, mysql_real_escape_string($localita), (int)$camere, (int)$bagni);
$risultato = mysql_query($query) or die( mysql_error() );
 
Ho provato a creare la tabella come mi hai suggerito ma mi da questo problema:
Codice:
#1064 - 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 ') ENGINE=InnoDB' at line 10
qualche idea?
Grazie

Edit: problema risolto cera una virgola su l'ultima riga di codice :)
 
Ultima modifica:
Provato ma la query non mi restituisce nessun risultato, continua ad uscirmi il messaggio impostato in caso che non trova annunci, in realta e' pienori annunci credo ce' qualcosa nella query che non va
 
Ok lo script funziona il problema sta che ho aggiunto altre colonne nella tabella e non funziona piu adeso la tabella annunci e' così:
Codice:
CREATE TABLE `annunci` (
  `idannuncio` int(11) NOT NULL AUTO_INCREMENT,
  `localita` varchar(50) NOT NULL,
  `tipologia` text NOT NULL,
  `tipo` text NOT NULL,
  `stato` text NOT NULL,
  `descrizione` text NOT NULL,
  `destinazione` text NOT NULL,
  `prezzo` text NOT NULL,
  `note` text NOT NULL,
  `cucina` varchar(200) NOT NULL,
  `bagni` int(11) NOT NULL,
  `camere` int(11) NOT NULL,
  `terrazza` text NOT NULL,
  `balcone` text NOT NULL,
  `auto` text NOT NULL,
  `ordine` text NOT NULL,
  `agente` text NOT NULL,
  `tel` text NOT NULL,
  PRIMARY KEY (`idannuncio`),
  KEY `localita` (`localita`),
  KEY `bagni` (`bagni`),
  KEY `camere` (`camere`)
) ENGINE=InnoDB ;

pero' per la ricerca mi servono solo camere, bagni, località non capisco dove sta' il problema!!
Grazie
 
Ultima modifica:
perchè metti a tutti text se sono dei varchar... inizia con il farti una bella lettura del giusto utilizzo dei tipi di stringhe http://dev.mysql.com/doc/refman/5.0/en/string-types.html


poi scusa, se lanci questo codice che ti esce?

PHP:
$localita = 'roma';
$camere = 0;
$bagni   = 0;

$slq = "SELECT * FROM annunci WHERE localita like '%s' AND camere >= %d AND bagni >= %d";
$query = sprintf($slq, mysql_real_escape_string($localita), (int)$camere, (int)$bagni);
 
echo $query;

$risultato = mysql_query($query) or die( mysql_error() ); 

if ( mysql_num_rows($risultato) > 0) 
{
        while ($row = mysql_fetch_array($risultato))   
        {
               print_r($row);
         }
}
else
{
       echo 'non ci sono risultati';
}
 
Adesso provo il codice che mi hai dato cmq se scrivo la tabella come tu mi hai suggerito funziona alla grande ma quando la modifico come ho scritto sopra non tra piu' i risultati
 
Ciao allora ho provato il codice che mi hai dato ho anche inserito un annuncio con località "roma" e questo e' il messaggio che i da:
Codice:
SELECT * FROM annunci WHERE localita like 'ischia' AND camere >= 0 AND bagni >= 0non ci sono risultati
pero' ripeto con la tabella da te suggerita funziona e con quella mia che nn va devo cambiare da txet in varchar per farlo funzionare?
Grazie

Edit: ho cambiato da text a varchar(50) tutte le righe ma niente da fare non va
 
Ultima modifica:
Scritta in quel modo se hai le città con il nome maiuscolo come ad esempio Ischia e tu cerchi ischia allora non te la trova.
 
allora fai così

PHP:
$localita = 'Ischia';
$camere = 0;
$bagni   = 0;

$slq = "SELECT * FROM annunci WHERE LOWER(localita) like '%s' AND camere >= %d AND bagni >= %d";
$query = sprintf($slq, mysql_real_escape_string(strtolower($localita)), (int)$camere, (int)$bagni);
 
echo $query;

$risultato = mysql_query($query) or die( mysql_error() ); 

if ( mysql_num_rows($risultato) > 0) 
{
        while ($row = mysql_fetch_array($risultato))   
        {
               print_r($row);
         }
}
else
{
       echo 'non ci sono risultati';
}
 

Discussioni simili