WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Sökning i MySQL (https://www.wn.se/forum/showthread.php?t=28703)

grinditwp 2008-04-17 10:37

Tjena,
försöker göra en sökfunktion i en "nyhetsblogg".

Och det fungerar så länge man inte skriver ÅÄÖ.

text, är html formaterad text sparad i MySQL databas.

Hur kan jag fixa så det fungerar även med ÅÄÖ? Vad gör jag för fel?

Kod:

$seek = $_POST['seek'];

$seek = str_replace('å', 'å', $seek);
        $seek = str_replace('Å', 'Å', $seek);
        $seek = str_replace('ä', 'ä', $seek);
        $seek = str_replace('Ä', 'Ä', $seek);
        $seek = str_replace('ö', 'ö', $seek);
        $seek = str_replace('Ö', 'Ö', $seek);
        $seek = str_replace('"', '"', $seek);
        $seek = str_replace('”', '”', $seek);
        $seek = str_replace('“', '“', $seek);
        $seek = str_replace('&', '&', $seek);

$sql = "SELECT id, text, date, image, headline, flag FROM `".$prefix."_newsblog` WHERE text LIKE '%".$seek."%' ORDER BY date DESC";


Magnus_A 2008-04-17 10:56

När du söker i fulltext bör man använda MySql:s inbyggda funktion för detta. Lägg till FULLTEXT som index för de aktuella kolumnerna i databasen. Sökningen sker sedan med villkoret:
WHERE MATCH(kolumn) AGAINST('sökord').

Sedan vill du konvertera till html entitites. Det gör du enklare och säkrare genom att använda php:s inbyggda funktion htmlentities

Det verkar som om du lägger in strängarna kodade med htmlentities. Det är egentligen onödigt, och det vore antagligen bättre om du kunde lagra texten där som den är och eventeullt konvertera den när du tar ut den för visning.

grinditwp 2008-04-17 11:31

Hej, tack för ditt snabba svar.. men jag vet inte om det är jag som inte fattar eller vad.

Kod:

if(isset($_POST['go']) && $_POST['search'] != '' && strlen($_POST['search']) >= 2){
        $seek = htmlentities($_POST['search']);
        $sql = "SELECT id, text, date, image, headline, flag FROM `".$prefix."_newsblog` WHERE MATCH(text, headline) AGAINST('".$seek."') ORDER BY date DESC";
        $result = mysql_query($sql);
        while ($row = mysql_fetch_assoc($result)) {
//...osv.

Fungerar sisådär.... söker jag på första så hittar den 3, söker jag på förändrats hittar jag 1, vilket låter rimligt.
Söker jag dock på gärna eller både så hittar den inget, och detta är ord jag vet finns med i texten den söker igenom.

Hur kommer detta sig?


Ett sparat inlägg ser ut såhär i databasen;
Kod:

<p><strong>Fr&aring;n och med den 20 maj 2008 har vi en helt ny hemsida.</strong></p>
<p>Som du ser, har mycket p&aring; sajten f&ouml;r&auml;ndrats, dock
Vi vill g&auml;rna veta vad du som bes&ouml;kare tycker, b&aring;de positiv och negativ kritik. Det viktiga &auml;r dock att ditt omd&ouml;me &auml;r konstruktivt.</p>

Citat:

Originally posted by Magnus_A@Apr 17 2008, 10:56

Det verkar som om du lägger in strängarna kodade med htmlentities. Det är egentligen onödigt, och det vore antagligen bättre om du kunde lagra texten där som den är och eventeullt konvertera den när du tar ut den för visning.

Dessvärre lagras "texten", eller kanske snarare ska kalla det datan, som html. För att användaren skall kunna redigera fritt (använder en WYSIWYG-motor).

martine 2008-04-17 11:47

Använd utf-8:
1. deklarera utf-8 i html,
2. sätt databasen till utf-8
(och strunta i den omständiga och onödiga konverteringen till &osv; )

grinditwp 2008-04-17 11:54

Citat:

Originally posted by martine@Apr 17 2008, 11:47

Använd utf-8:
1. deklarera utf-8 i html,
2. sätt databasen till utf-8
(och strunta i den omständiga och onödiga konverteringen till osv; )

Okej, men det måste väll fungera utan att köra UTF-8?

vad är det för skillnad på att söka efter b&aring;de när det är sparat som b&aring;de i texten eller söka efter både när det är sparat som både?

Tänk om jag måste söka efter b&aring;de ?

Magnus_A 2008-04-17 13:48

Vet inte om Mysql:s fulltextsök är gjort för att användas på html-entities-kodade texter. Tror att den tolkar & och ; som ordslut.
Html är inga problem att söka i, ända tills någon försöker söka på till exempel strong, då borde han få hitts på varje inlägg.
Det bästa är att göra som martine rekommenderar, sluta använda entities och hålla sig till utf8.
Om du absolut och mot bättre vetande måste ha kvar dina inlägg i denna kodade form, så är min rekommendation att skapa ett till fält i databasen där du lägger in text körd genom html_entity_decode och eventuellt strip_tags så att du får en riktig text att söka på.
Lycka till.

grinditwp 2008-04-17 21:12

ok tack!

men låt oss säga, att man skulel söka genom "HTML" sidor, så vi inte hänger upp oss på "blogg" inlägg, alltså sidor som kräver att det är html, för att det tex finns tabeller, bilder och en massa annan skräp, då är det alltså bäst att rensa datan med strip_tags och html_entity_decode, och söka i den texten istället. Tack.


Alla tider är GMT +2. Klockan är nu 23:52.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson