Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP/MySQL merkkijonon haku taulusta

mercier [08.07.2019 18:39:42]

#

$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 åäöÅÄÖ?

Metabolix [08.07.2019 18:45:08]

#

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.

mercier [08.07.2019 19:02:31]

#

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.

Metabolix [08.07.2019 19:47:14]

#

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 &auml;-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.

mercier [12.07.2019 16:33:34]

#

Tietokannan ääkkösten korjaamiselle tuli no-go. Monirivistä tekstiä käsitellään muulla scriptillä, joka vaatii tuon muodon.
Mutta näin toimii:

$trans = array("ö" => "&ouml;", "ä" => "&auml;", "å" => "&aring;");$search1 = strtr($search_note, $trans);
$total = "SELECT COUNT(*) FROM rolls WHERE `note` LIKE '%{$search1}%' COLLATE utf8_swedish_ci";

Vastaus

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

Tietoa sivustosta