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.
Rispondi
ragnetto
Linux 1.x
Linux 1.x
Messaggi: 178
Iscritto il: sab 2 feb 2008, 22:07

Problema creando un motore di ricerca seguendo una guida.

Messaggio 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>"; }
?>

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

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

Messaggio da aschenaz »

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

Sostituisci $chiave con $_POST["chiave"] e dovrebbe funzionare.

ragnetto
Linux 1.x
Linux 1.x
Messaggi: 178
Iscritto il: sab 2 feb 2008, 22:07

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

Messaggio 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";
?>

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

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

Messaggio 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.

ragnetto
Linux 1.x
Linux 1.x
Messaggi: 178
Iscritto il: sab 2 feb 2008, 22:07

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

Messaggio 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?

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

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

Messaggio 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

ragnetto
Linux 1.x
Linux 1.x
Messaggi: 178
Iscritto il: sab 2 feb 2008, 22:07

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

Messaggio 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.

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

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

Messaggio 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

ragnetto
Linux 1.x
Linux 1.x
Messaggi: 178
Iscritto il: sab 2 feb 2008, 22:07

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

Messaggio 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.

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

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

Messaggio 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

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

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

Messaggio 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. :)

ragnetto
Linux 1.x
Linux 1.x
Messaggi: 178
Iscritto il: sab 2 feb 2008, 22:07

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

Messaggio 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".

Avatar utente
aschenaz
Staff
Staff
Messaggi: 4623
Iscritto il: mer 28 lug 2004, 0:00
Nome Cognome: Nino
Slackware: current
Kernel: 5.4.x
Desktop: KDE
Località: Reggio Calabria
Contatta:

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

Messaggio 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 .

Rispondi