Pagina 1 di 1
Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 13:50
da ragnetto
Penso che il prob si trovi nel metodo post e nella variabile array che và ad esportare. La guida in questione è la seguente:
http://php.html.it/guide/lezione/2285/i ... i-ricerca/
search.php
Codice: Seleziona tutto
<?php
include("config.inc.php");
?>
<form method=post action=result.php>
<input type=text name=chiave><input type=submit value=cerca><br>
</form>
result.php
Codice: Seleziona tutto
<?php
include("config.inc.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");
$keys = explode (",", $chiave);
$query = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{ $parola = trim($parola);
if ($parola != "")
$query .= "titolo LIKE '%$parola%' OR testo LIKE '%$parola%' OR autore LIKE '%$parola%' OR ";
}
$query .= "0";
$query = "SELECT id, titolo, data FROM news WHERE " . $query;
$result = mysql_query($query, $db);
while ($row = mysql_fetch_array($result))
{ echo "<a href="view.php?id=$row[id]">" . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; }
?>
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 14:05
da aschenaz
Credo sia un tutorial vecchio (quando ancora si usava settare a "off" register_globals).
Sostituisci $chiave con $_POST["chiave"] e dovrebbe funzionare.
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 16:57
da ragnetto
Ho fatto quanto detto, ma non funzia, non appare neanche l' ultima istruzione "echo "vvvsvsv";" (che ho messo apposta). Possibile che ci sia un' erroredi sintassi? Nella pagina "search.php" cambia qualcosa se scrivo "post" o "POST"?
Codice: Seleziona tutto
<?php
include("config.inc.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");
$keys = explode (",", $_POST["chiave"]);
$query = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{ $parola = trim($parola);
if ($parola != "")
$query .= "titolo LIKE '%$parola%' OR testo LIKE '%$parola%' OR autore LIKE '%$parola%' OR ";
}
$query .= "0";
$query = "SELECT id, titolo, data FROM news WHERE " . $query;
$result = mysql_query($query, $db);
while ($row = mysql_fetch_array($result))
{ echo "<a href="view.php?id=$row[id]">" . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; }
echo "vvvsvsv";
?>
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 17:10
da conraid
Codice: Seleziona tutto
{ echo "<a href="view.php?id=$row[id]">" . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; }
Se usi le virgolette dopo l'echo, fai un escape quando capitano nella stringa
Per evitare queste cose, in fase di sviluppo, configura il php per mostrarti ogni errore.
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 17:24
da ragnetto
Grazie a tutti per il vostro aiuto. Avrei ancora un paio di domande...
Se io immetto come parola chiave "ciao" viene fuori un risultato, se io immetto "luca" viene fuori un risultato ma se io immetto "ciao luca" (naturalmente senza virgolette in nessun caso) viene fuori niente. E' normale? Come posso fare per far in modo che venga fuori i risultati delle due parole chiave? Cioè che la variabile "$_POST["chiave"]" venga scomposta e considerata per tutte le parole che la compongono e non una sola?
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 17:29
da conraid
ragnetto ha scritto:Cioè che la variabile "$_POST["chiave"]" venga scomposta e considerata per tutte le parole che la compongono e non una sola?
http://it.php.net/manual/en/ref.regex.php
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 17:59
da ragnetto
Mi vorresti dire che quello che io chiedo lo fà già? Lo sò, ma nella parola chiave devo separare separare ogni parola con la virgola e io vorrei evitare questo.
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 18:08
da conraid
ragnetto ha scritto:Mi vorresti dire che quello che io chiedo lo fà già? Lo sò, ma nella parola chiave devo separare separare ogni parola con la virgola e io vorrei evitare questo.
Ti vorrei dire che con le espressioni regolari (guarda anche
http://it.php.net/manual/en/ref.pcre.php) dividi la stringa che ti viene passata in più stringhe. Il separatore lo scegli tu.
Per esempio
Codice: Seleziona tutto
$stringa = "Guarda tutte le funzioni";
$array_stringhe = split(" ", $stringa);
A quel punto hai un array su cui fare quel che vuoi
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 18:39
da ragnetto
Ho capito ma non riesco a capire ancora come posso applicare questa cosa al motore di ricerca per fare in modo che non debba inserire la virgola tra una parola e l' altra. Se il ciclo "while" crea una query per ogni parola contenuta nell' arrey "$keys" (se dico bene) perchè quando scrivo "ciao luca" mi ritrovo la pagina bianca e quando scrivo "ciao, luca" mi ritrovo due risultati? Ho anche notato che:
Codice: Seleziona tutto
$cdr = "ciao a tutti";
$ddr = explode(' ', "$cdr");
echo $ddr[2];
è uguale e mi dà lo stesso output di:
Codice: Seleziona tutto
$cdr = "ciao, a, tutti";
$ddr = explode(' ', "$cdr");
echo $ddr[2];
correggetemi se sbaglio.
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 19:39
da conraid
io se fossi in te prima di dare in pasto la query a mysql, farei un echo $query, in modo che controlli bene cosa viene passato al database.
Per il resto explode o qualcosa di più complesso con le espressioni regolari (così da prevere casi con virgola e/o con spazio), ti da un insieme di stringhe. Dopo sta a te gestirle.
Come l'avevi prima prevedeva la virgola come separatore, è logico che senza lui prendeva una stringa intera composta da due parole, ecco perché non trovava niente.
Io per esempio solitamente lascio anche un campo AND o OR da far scegliere all'utente.
Nel tuo script, a parte che lo capisco poco per come è formattato, vedo un query .= 0 che mi sembra serva per terminare un OR finale. Io non farei così, ma fare in modo che non ci sia un OR finale. Ma queste sono pignolerie.
Controlla la stringa passata e la query
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mar 25 mar 2008, 20:36
da aschenaz
Ti consiglio di provare, direttamente nella query MySQL, anche REGEXP al posto di LIKE.
Inoltre, la stringa passata la potresti lavorare con...
Codice: Seleziona tutto
$parole=eregi_replace("[^a-z0-9]",",",$_POST["chiave"])
così sostituisci qualsiasi carattere non alfa-numerico con una virgola e tagli la testa al toro.

Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mer 26 mar 2008, 13:58
da ragnetto
Codice: Seleziona tutto
<?php
include("config.inc.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");
$keys = explode (",", $_POST["chiave"]);
echo $keys;
$query = "";
reset ($keys);
while (list(,$parola) = each ($keys))
{ $parola = eregi_replace("[^a-z0-9]",",",$_POST["chiave"]));
if ($parola != "")
$query .= "titolo LIKE '%$parola%' OR testo LIKE '%$parola%' OR autore LIKE '%$parola%' OR ";
}
$query .= "0";
$query = "SELECT id, titolo, data FROM news WHERE " . $query;
$result = mysql_query($query, $db);
while ($row = mysql_fetch_array($result))
{ echo '<a href="view.php?id=$row[id]">' . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; }
echo "bbs";
?>
Lavorando la stringa (come dice aschenaz) mi ritrovo una pagina bianca. Invece sostituendo REGEXP a LIKE (nella versione originale funzionante dello script) ottengo una scritta "Array".
Re: Problema creando un motore di ricerca seguendo una guida.
Inviato: mer 26 mar 2008, 14:37
da aschenaz
I caratteri li devi sostituire prima dell'explode. Così funziona:
Codice: Seleziona tutto
<?php
include("config.inc.php");
$db = mysql_connect($db_host, $db_user, $db_password);
if ($db == FALSE)
die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");
mysql_select_db($db_name, $db)
or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");
$chiavemodificata=eregi_replace("[^a-z0-0]",",",$_POST["chiave"]);
$keys = explode (",", $chiavemodificata);
echo $keys;
$query = "";
reset ($keys);
while (list(,$parola) = each ($keys)) {
if ($parola != "")
$query .= "titolo LIKE '%$parola%' OR testo LIKE '%$parola%' OR autore LIKE '%$parola%' OR ";
}
$query .= "0";
$query = "SELECT id, titolo, data FROM news WHERE " . $query;
$result = mysql_query($query, $db);
while ($row = mysql_fetch_array($result))
{ echo '<a href="view.php?id=$row[id]">' . date("j/n/y", $row[data]) . " - $row[titolo]</a><br>"; }
echo "bbs";
?>
Inoltre, se vuoi usare REGEXP, non mettere caratteri jolly (
REGEXP '$parola'). O, se vuoi usare le espressioni regolari, guarda qui:
http://dev.mysql.com/doc/refman/5.0/en/regexp.html .