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?
SELECT jotain FROM taulu WHERE teksti LIKE '%kissa%' AND teksti NOT LIKE '%koira%'
Ja tarvittavan SQL-kyselyn voi luoda näppärästi PHP:llä:
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.
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; ?>
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...
Aihe on jo aika vanha, joten et voi enää vastata siihen.