Repository 32bit  Forum
Repository 64bit  Wiki

Problema creando un motore di ricerca seguendo una guida.

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Problema creando un motore di ricerca seguendo una guida.

Messaggioda ragnetto » mar mar 25, 2008 13:50

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>"; }
?>
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda aschenaz » mar mar 25, 2008 14:05

Credo sia un tutorial vecchio (quando ancora si usava settare a "off" register_globals).

Sostituisci $chiave con $_POST["chiave"] e dovrebbe funzionare.
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4438
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.24
Desktop: KDE 4.10.5

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda ragnetto » mar mar 25, 2008 16:57

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";
?>
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda conraid » mar mar 25, 2008 17:10

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.
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda ragnetto » mar mar 25, 2008 17:24

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?
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda conraid » mar mar 25, 2008 17:29

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
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda ragnetto » mar mar 25, 2008 17:59

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.
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda conraid » mar mar 25, 2008 18:08

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
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda ragnetto » mar mar 25, 2008 18:39

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.
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda conraid » mar mar 25, 2008 19:39

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
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda aschenaz » mar mar 25, 2008 20:36

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. :)
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4438
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.24
Desktop: KDE 4.10.5

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda ragnetto » mer mar 26, 2008 13:58

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".
ragnetto
Linux 2.0
Linux 2.0
 
Messaggi: 178
Iscritto il: sab feb 02, 2008 22:07

Re: Problema creando un motore di ricerca seguendo una guida.

Messaggioda aschenaz » mer mar 26, 2008 14:37

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 .
pensieriemotivi.aschenaz.eu - music-blog
Avatar utente
aschenaz
Staff
Staff
 
Messaggi: 4438
Iscritto il: mar lug 27, 2004 23:00
Località: Reggio Calabria
Nome Cognome: Nino
Slackware: current 64bit
Kernel: 3.14.24
Desktop: KDE 4.10.5


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti