Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Hakusanat

juhaz [24.03.2008 11:11:00]

#

Tämä pitäisi tehdä varmaan Reqular Expressioneilla, mutta minulle se on täyttä hepreaa?

Eli tarkoitus olisi tehdä simmoinen toiminto hakuun, että käyttäjä voi hakea esimerkiksi "kissa -koira", jolloin se hakisi MySQL-tietokannasta sivuja, joissa mainitaan kissa, mutta ei koiraa. Miten se siis tehdään?

Blaze [24.03.2008 11:22:25]

#

SELECT jotain FROM taulu WHERE teksti LIKE '%kissa%' AND teksti NOT LIKE '%koira%'

Antti Laaksonen [24.03.2008 11:29:01]

#

Ja tarvittavan SQL-kyselyn voi luoda näppärästi PHP:llä:

<?php
$haku = "kissa hiiri -koira";
foreach (explode(" ", $haku) as $sana) {
    if ($sana[0] == "-") {
        $sqlo[] = "teksti NOT LIKE '%" . substr($sana, 1) . "%'";
    } else {
        $sqlo[] = "teksti LIKE '%" . $sana . "%'";
    }
}
$sql = "SELECT * FROM taulu WHERE " . implode(" AND ", $sqlo);
echo $sql;
?>

juhaz [24.03.2008 12:20:15]

#

Minulla lakkasi tuo koodi toimimasta, kun koitin lisätä lisää mysql-sarakkeita $sqloon:

$haku = $_GET['hakusana'];
foreach (explode(" ", $haku) as $sana) {
    if ($sana[0] == "-") {
  $sqlo[] = "AND hakusana NOT LIKE '%" . substr($sana, 1) . "%' AND nimi NOT LIKE '%" . substr($sana, 1) . "%' AND osoite NOT LIKE '%" . substr($sana, 1) . "%'";
    } else {
        $sqlo[] = "teksti LIKE '%" . $sana . "%'";
    }
}
$sql = "SELECT * FROM hakut WHERE " . implode(" OR ", $sqlo);
$sql = str_replace("OR AND", "AND", $sql);
echo $sql;

Se ei valita mitään, mutta se ei enää tee yhtään mitään niin kuin pitäisi. Se hakee kyllä kaikki sivut, mutta ei poista hakuun kuulumattomia (jotka siis käyttäjä poisti itse laittamalla hakusanan eteen miinusmerkin).

SELECT * FROM hakut WHERE hakusana LIKE '%testi%' OR nimi LIKE '%testi%' AND hakusana NOT LIKE '%tietotesti%' AND nimi NOT LIKE '%tietotesti%' AND osoite NOT LIKE '%tietotesti%'

Tuommoisen SQL-lausekkeen tulostaa echo $sql.

Antti Laaksonen [24.03.2008 14:37:07]

#

Kannattaa selventää suluilla, miten AND ja OR yhdistävät ehtoja. En kyllä ihan ymmärrä, mitä muutetun koodin on tarkoitus tehdä.

Jos tarkoitus on, että sallitun sanan täytyy esiintyä jossain kentässä ja kielletty sana ei saa esiintyä missään kentässä, koodia voisi laajentaa näin:

<?php
$kentat = array("hakusana", "nimi", "osoite");
$haku = "kissa hiiri -koira";
foreach (explode(" ", $haku) as $sana) {
    $sqlk = array();
    foreach ($kentat as $kentta) {
        if ($sana[0] == "-") {
            $sqlo[] = $kentta . " NOT LIKE '%" . substr($sana, 1) . "%'";
        } else {
            $sqlk[] = $kentta . " LIKE '%" . $sana . "%'";
        }
    }
    if (count($sqlk) > 0) $sqlo[] = "(" . implode(" OR ", $sqlk) . ")";
}
$sql = "SELECT * FROM taulu WHERE " . implode(" AND ", $sqlo);
echo $sql;
?>

juhaz [24.03.2008 14:43:02]

#

No siis mulla on tietokannassa taulussa sarakkeet nimi, osoite, tietoa, hakusanat, pisteet ja tila. Pisteet ja tila ovat ihan vain jotain lukuja (tila on normaalisti 1 ja se näyttää vain tilan 1 omaavat sivut), mutta haku hakee kaikesta muusta sitten, että jos käyttäjä hakee esimerkiksi siis sitä kissaa niin se hakee sitä sivun nimestä, osoitteesta, tiedoista ja hakusanoista ja sitten jos käyttäjä laittaa tosiaan sen -koira niin se jättäisi hakutuloksista pois taas ne sivut, joissa mainitaan kyllä kissa, mutta joissa mainitaan myös koira.

Täytyy testata tuota uutta koodipätkää kahvitauon jälkeen, mutta pikaisesti katsottuna vaikuttaisi sopivalta.

EDIT: Kiitos! Nyt tuntuisi toimivan...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta