Miten ihmeessä saan PHP:llä lomakkeen hyväksymään ääkköset?
Ongelman kuvaus:
Lomakkeessa on valmis teksti tiedostosta, jota voi editoida. Esimerkiksi "Ilta". Jos muutan tekstin muotoon "Iltapäivä" ja tallennan, teksti on ja pysyy muodossa "Ilta" ja lukee myös lomakkeessa oletuksena. Jos korvaan ääkköset, silloin onnistuu, eli "Iltapaiva" kelpaa ja tallentuu lomakkeeseen oletukseksi... :(
Oletuksena pitäisi hyväksyä, joten ongelma taitaa olla jossain muualla, mutta ilman näkyvää koodia ei voi kuin arvailla, jos sitäkään.
Sivu alkaa näin:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <HTML lang="fi" xmlns="http://www.w3.org/1999/xhtml" dir="ltr" xml:lang="fi"> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <meta http-equiv="content-style-type" content="text/css"> <meta http-equiv="content-language" content="fi">
-----
if (isset($_POST['teksti'])) { $message = htmlentities($_POST['teksti']); if (strlen($message) > 0) { $fp = fopen('./teksti.txt', 'w'); fwrite($fp, $message); fclose($fp); } }
-----
<p><b>Muokattava teksti</b></p> <p></p> <table> <tr> <form method="POST"> <input type="hidden" name="token" value="<?php echo $token; ?>" /> <TEXTAREA Name="teksti" rows="20" cols="50"><?php include("./teksti.txt"); ?></TEXTAREA> <br /> <input type="submit" VALUE="TALLENNA"> </form> </tr> </table>
Pätkin koodia, jotta olennainen erottuu selvemmin.
Lisäys: Tuossa siis tallennetaan tekstitiedostoon, mutta ei tallennu, jos käyttää ääkkösiä... Jotakin ilmiselvää tietenkään en huomaa tässä, tovi meni, ennenkuin huomasin ääkkösiä sisältävän tekstin jäävän tallentumatta.
Älä nyt pätki yhtään mitään vaan laita koodi tänne. Tuosta mössöstä ei kukaan tajua mitään. Jos tiedät missä virhe on, niin korjaa se itse, mutta josset tiedä, niin sittenhän et voi poistaa mitään, koska saatat piilottaa juuri virheen.
Yleensä arvailu on ihan hyödytöntä, mutta jos testailet jossain lagisella webbipalvelimella, niin todennäköisesti tuo include lukee filun jostain välimuistista ja siksi palauttaa tiedoston vanhan sisällön satunnaisesti. Satut vain vähillä testailuillasi saamaan satunnaisesti oikean tuloksen. Debugatessasi olet kuitenkin tarkistanut tiedoston sisällön ihan oikeasti etkä vain luota nettisivulle tulostettuun tekstiin, joten vikahan ei voi olla tuossa?
Ei tuossa muusta ole kiinni kuin merkistökoodauksesta (aseta oikea merkistö htmlentitiesille niin sillä selvä).
No niin, tunteja poissa ongelman parista. Kiitoksia viesteistä, nyt se ongelma sitten ratkesi.
@The Alchemist [22.09.2014 14:12:22]:
Tuossa koodissahan on lomakekäsittelijän koko osuus, ainakin komponentteineen, mitkä viittaavat mitenkään kieleen, mikä ääkkösongelmassa oli olennainen.
@timoh [22.09.2014 15:08:04]:
Kiitos huomiosi, tutkin asiaa ja tein onnistuneen muutoksen, ääkköset kelpaavat nyt mukisemati. En ollut ottanut huomioon sitä, että htmlentitieskin sisältää enempi ja vähempi parametreja.
Aikaisemman viestini koodin osissa täten paljastui virheelliseksi rivi:
$message = htmlentities($_POST['teksti']);
Toimivassa koodissa rivi menee näin:
$message = htmlentities($_POST['teksti'], ENT_COMPAT,'ISO-8859-1', true);
Nyt on kyllä kaffen paikka. Se toimii kuin toimiikin! Paljon kiitoksia.
Kannattaakin kertailla tuota PHP-puolta, kun sen kanssa ei ole ihan äskeen liikoja touhuillut... :D
Käytä nyt kuitenkin unicodea, koska se on nykyajan merkistö.
@The Alchemist [22.09.2014 18:22:53]
Kiitos huomautuksesta. Pitääpä penkoa tuota merkistöasiaa tarkemmin, ehkä W3C- ja muista standardeista ja ohjeistuksista on hyvä alkaa. Kuitenkin tuo äskeinen muutos ainakin jo korjasi ongelman, mikä koodissa oli, mutta siitä en todellakaan ole ollut ajan tasalla, miten se noudattaa nykypäivän standardeja. Eikä ainoastaan merkistöasiassa, ehkä on paikallaan katsastaa koko käyttämääni tagirepertuaaria läpi.
EDIT: Näköjään validaattori herjaa ainakin, elikkä todellakin tekemistä riittää. No, ei ole huono juttu se. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.