Taas typeryyttäni kyselen, kun en en lukemattomuuttani ymmärrä miksi:
Mulla on ajax-kutsussa seuraava koodinpätkä, jossa parametrit ovat seuraavat:
param1 = kutsuttava palvelinskripti
param2 = get-metodille välitettävät parametri
param3 = paluuarvon käsittelevän funktio
param4 = ajetaanko syknronisena vai asynkkina
Käytettävät funktiot on kopsattu ohjelmointiputkan esimerkistä
https://www.ohjelmointiputka.net/oppaat/opas.
Kasittele('paivita.php','kaveri=479&nimi=Ville Järvinen&h_t=h',tarkista,true);
Tämä koodi toimii ok ja se välittää parametrit palvelinskriptille ok.
Ongelma:
param2-muuttujassa oleva ä ei välity palvelimelle oikein. Palvelinskiptissä otan sen vastaan ja tulostan.
<?php echo $_POST['nimi']; ?>
Arvo näkyy kuitenkin seuraavasti.
Ville Järvinen
Tarjoile skriptisivu UTF-8:na niin ongelma katoaa. Ennen tulostusta siis vaikka header('text/plain; charset=utf-8');
jos tahdot vaan tekstitiedostodebuggia.
Tarkoititko tuonne palvelinskriptiin?
Jos noin, niin ei vaikutusta.
Hups, unohdin ajatuksissani content-type:n edestä :)
'content-type: text/plain; charset=utf-8'
Yeps olet oikeassa, hienosti toimii - kiitos!
Jatketaan pykälää pidemmälle. Kun samassa skriptissä yritetään hakea kannasta (Postgres) tuolla samalla arvolla osuvuutta, niin miten se pitäisi siellä saada toimimaan??
<?php require('kanta.php'); header('content-type: text/plain; charset=utf-8'); echo $_POST['nimi']; // Tämä näyttää siis tiedon nyt oikein if (isset($_POST['kaveri'])) { $upd = "update kaveri set id ="; $upd .= pg_escape_string($_POST['kaveri'])." "; $upd .= "where nimi = '".pg_escape_string($_POST['nimi'])."';"; // Ei löydä, jos nimi-kentässä on skandeja pg_query($db,$upd) or die('Pieleen meni'); } ?>
Painiskelin viikonloppuna useamman tunnin ilman tulosta tämän kanssa. Eikö kukaan osaa auttaa - please?
Teet haun kannasta siinä merkistössä, jota käytät siellä.
Mielestäni teen kyllä näin. Normaaleilla php-scripteillä lomaketta tehtäessä toimii ok, mutta ajax-kutsun kautta ei.
Lopputuloksesta kyllä nähdään, että mielipiteesi on väärä – jos tekisit haun oikeassa merkistössä, tuloksetkin olisivat oikeat.
Näin varmaankin, mutta kun en ymmärrä (ei yllätys), missä se menee pieleen.
Jos olet tallentanut kantaan utf-8 muodossa dataa, niin sen kyselyn pitää kanssa olla utf-8 muodossa. Sama toimii kaikissa muissakin merkistökoodauksissa.
ja kannattaa tarkistaa myös mitä merkistöä itse sivusto käyttää
Sivusto näyttää olevan iso-8859-1
Poistin turhia ongelmani yksinkertaistamiseksi
<?php echo $_REQUEST['nimi']; ?>
Tämän kun ajaa suoralla selaimen osoitteella, niin paluuarvo on ihan oikein, myös skandien kohdalta.
Jos samaa php-tiedostoa kutsuu ajax:n kautta, niin skandien koodaus on väärin?
Jos taas koodiin lisään tämän Merrin ehdotaman headerin, niin käy toisinpäin eli osoitamalla tiedostoa toimii väärin, mutta ajax toimii oikein.
Sinulla on siis jostain syystä tiedostoja eri muodossa merkistöjen osalta. Muuta tuon ajax kutsun tekevän tiedoston merkistökoodaus vastaamaan muuta sivustoa.
Missä ihmeessä tuo voisi olla?
Kun katson sivua, josta tuo ajax-kutsu lähtee, sen headerissa on:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
Kutsuttavassa php-modulissa ei ole mitään määrittelyjä, paitsi jos lisään tuon
header('content-type: text/plain; charset=utf-8');
Tällä se näkyy oikein, mutta tällä seuraavalla ei
header('content-type: text/plain; charset=iso-8859-1');
Sitten pitäisi taas palauttaa mieleen, että milläs merkistöllä se ajax taas käsittelikään lähetettyjä tietoja... ja mitä merkistöä kannattaisi aina käyttää ajaxin kanssa...
veikkaampa utf-8 :-)
ja mikäs merkistö tällä sivulla olikaan käytössä?
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
Varmaankin olet myös tietokantaasi tallentanut datan iso-8859-1:nä, kun taas AJAXilta tulee UTF-8-tekstiä, jolla yrität sitten hakea. Varsinainen ongelmahan nyt on, että et ole ilmoittanut PostgreSQL:lle merkistöä (UNICODE tai LATIN1), jolla kyselyt tehdään.
Moro,
Metabolix kirjoitti:
Varmaankin olet myös tietokantaasi tallentanut datan iso-8859-1:nä, kun taas AJAXilta tulee UTF-8-tekstiä, jolla yrität sitten hakea. Varsinainen ongelmahan nyt on, että et ole ilmoittanut PostgreSQL:lle merkistöä, jolla kyselyt tehdään.
Kyllä! Olet oikeassa. Kantani on näköjään tehty:
Encoding = LATIN1
Locale = fi_FI
Kun kerron kannalle millä merkistöllä kysely tehdään, homma toimii ok.
pg_query($db, "set client_encoding to 'UTF8'") or die('Asetus ei luonnistu'); pg_query($db, $upd) or die('Pieleen meni');
Kiitos taas!
Aihe on jo aika vanha, joten et voi enää vastata siihen.