$total = "SELECT COUNT(*) FROM rolls WHERE `note` LIKE '%{$search_note}%' COLLATE utf8_swedish_ci"; $query = "SELECT * FROM rolls WHERE `note` LIKE '%{$search_note}%' ORDER BY name COLLATE utf8_swedish_ci";
Koodi toimii erinomaisesti, kun käytetään englanninkieltä. Suomenkielisessä käyttötapauksessa vastaan tuli kyselyissä se, että tähän yhteen sarakkeeseen dataa on talletettu merkistö muokattuna. (Vrt aikaisempi kysymykseni.)
Tämä Å-pöytä on taulussa muodossa Tämä Å-pöytä
Miten olisi mahdollista tehdä hakuja myös kirjaimille åäöÅÄÖ?
Yksinkertainen ja oikea ratkaisu: älä tallenna dataa tuollaisessa muodossa, vaan pidä kaikki merkit alkuperäisessä muodossa. Yleensä dataa kuuluu muuttaa HTML-muotoon vasta silloin, kun sitä tulostetaan sivulle.
Vaihtoehtoinen purkkaratkaisu: muuta myös hakutermi samanlaiseen muotoon.
Muista, että jos et jotenkin tarkasti filtteröi tuota $search_note-muuttujaa, tuossa koodissa on SQL-injektioaukko ja käyttäjä voi hakea kaiken datan tietokannastasi lähettämällä sopivan $search_note-arvon.
Kiitos nopeasta vastauksesta. Data on muokattu silloin, kun ääkkösiä sinne ei arvattu tulevankaan. Harkinnassa on muokkaaminen.
Notet on näköjään käsitelty komennolla
$note = mysqli_real_escape_string($mysqli,htmlspecialchars($_POST['note']));
Hakutermin muokkaaminen samaan muotoon ei vain tunnu onnistuvan.
Filtteröimistä lukisin mieluusti myös jotain tarkempaa.
Voisit kertaluontoisesti korjata ääkköset tietokannasta jotenkin tähän tapaan:
<?php $UTF8 = true; // Jos käytät UTF-8-koodausta. $UTF8 = false; // Jos et käytä UTF-8-koodausta. $UTF8 = "ä" != "\xe4"; // Jos et tiedä, käytätkö UTF-8-koodausta. :D // Muutetaan tietokannasta ä-jutut normaaleiksi. foreach (range(0xa0, 0xff) as $i) { $tavu = chr($i); $auml = htmlentities($tavu, ENT_COMPAT | ENT_HTML401, "ISO-8859-1"); $oikea = $UTF8 ? iconv("ISO-8859-1", "UTF-8", $tavu) : $tavu; $query = "UPDATE rolls SET note = REPLACE(note, '$auml', '$oikea') WHERE INSTR(note, '$auml')"; mysqli_query($mysqli, $query); }
Tämän jälkeen haku toimisi varmaan enimmäkseen oikein.
Tietokannan ääkkösten korjaamiselle tuli no-go. Monirivistä tekstiä käsitellään muulla scriptillä, joka vaatii tuon muodon.
Mutta näin toimii:
Aihe on jo aika vanha, joten et voi enää vastata siihen.