Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: utf8

Sivun loppuun

manninen [09.05.2011 14:32:02]

#

Miksi

CONCAT(postinumero, ' 'postitoimipaikka)

sotkee tietokannasta tulevan tulostaan, joka on muotoa utf8. Ilman concat funktiota toimii oikein

Metabolix [09.05.2011 17:22:04]

#

Mitähän nuo '-merkit tuossa yrittävät olla? "Sotkee" on myös aika epämääräinen kuvaus ongelmasta, kerro lisää.

LaNu [09.05.2011 19:29:40]

#

Miten tuo edes kelpaa MySQL-tulkille? Jotain tämmöistä kai sinä yrität:

CONCAT(postinumero, ' ', postitoimipaikka)

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

manninen [09.05.2011 20:31:31]

#

Juu pahoittelen kirjoitusvirhettä,

eli

CONCAT(postinumero, ' ',postitoimipaikka)

oli tarkoitus kirjoittaa.

Tarkennus ongelmaan :

1. Tallennan tietokantaan tekstiä, joka mielestäni menee sinne utf-8 muodossa
2. Tulostan tekstin, esim postiosoite.
- Tulostus tulee oikein Ähtäri
3. Tulostan tekstin CONCAT(postinumero,' ',postitoimipaikka)
- Postinumero tulostuu oikein, mutta postitoimipaikka tulosteessa ä,ö ovat sekaisin

LaNu [09.05.2011 21:13:24]

#

Oletko lukenut tuota MySQL:n concat-funktion kuvausta, minkä linkkasin? Kokeilitko?

manninen [09.05.2011 23:58:13]

#

Heh ;)

Nyt on luettu, mutta samaan aiheeseen liittyen kysyisin vielä dumbin otosta.

Otan palvelimelta 1 varmuuskopion tietokannasta ( paikallinen kone )
siirrän kopion ulkopuolisen palveluntarjoajan kantaan, ä ja ö:t sekaisin.

Miksi?

Metabolix [10.05.2011 00:03:27]

#

Olet luultavasti tunaroinut merkistöjen kanssa. Yleisimmät virheet lienevät, että MySQL-yhteyden merkistö jää asettamatta ja että MySQL:n taulut käyttävät oletusmerkistöä, joka ei välttämättä ole UTF-8. Lue aiheesta tämä viesti ja tutustu funktioon mysql_set_charset. Muista myös asettaa taulun sarakkeille oikea merkistö.

manninen [10.05.2011 09:12:28]

#

Niin moni tästä asiasta jauhaa eikä oikein meinaa toimia kellään niin :

<?php
// Tämä tehdään sivun alussa
if(headers_sent() == false){
  header("Content-type: text/html; charset=utf-8");
}

// Tämä tehdään yhteyden muodostamisen jälkeen
mysql_set_charset("utf8");

// Tämä tungetaan sivulle
?>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Eli käsittääkseni ongelma on tietokannassa, jossa näyttää olevan aakkosjärjestys latin1_swedish_ci ja tämä pitäisi sitten varmaan olla
ut8_general_ci ?

Metabolix [10.05.2011 14:10:34]

#

Aakkostuksella (collation) ei pitäisi olla tässä asiassa merkitystä, vaan merkistö (character set) ratkaisee. Toki UTF-8-tekstien järjestämisessä UTF-8-aakkostuskin on tarpeen. Joka tapauksessa korjaa tietokantasi. Olennaisen linkin dokumentaatioon jo annoinkin.

manninen [11.05.2011 14:22:47]

#

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Yhteys tietokantaan epäonnistui");
if(!mysql_select_db($dbname,$conn)){
    die();
}
/*
 Jos jollakin sama ongelma kuin minulla, tämä pätkä koitui pelastuksekseni. Jos
 taas teen tässä jotain väärin, viisaammat korjatkaa minua.
 Nyt tieto menee oikein, varmuuskopiot toiselle palvelimelle kannasta menee
 oikein ja muutenkin elämä hymyilee.
*/
mysql_query("SET
  character_set_results = 'utf8',
  character_set_client = 'utf8',
  character_set_connection = 'utf8',
  character_set_database = 'utf8',
  character_set_server = 'utf8'",
$conn);

manninen [30.05.2011 12:57:25]

#

Kun luulin kaiken olleen selvää törmäsin uuteen utf8 ongelmaan!!

Tallennan tietokantaan salasanan tiivisteen, sekä testauksen vuoksi salasanan!

Kun yritän kirjautua järjestelmään sellaisella salasanalla, jossa on ä ja ö kirjaimia en pääse sisään.

Tietokantaan salasana menee muotoa äöäöäö
Tuloste kirjautmissivulla tästä on äöäöäö

Jos laitan tiedon salana menemään utf8_encoden läpi, pääsen yhden kerran sisään.

public function __construct($salasana, $kayttaja)
{
  $this->Salasana  = empty($salasana) ? NULL : mysql_real_escape_string($salasana);
  $this->Kayttaja  = empty($kayttaja) ? NULL : mysql_real_escape_string($kayttaja);
  $this->Tarkiste  = empty($tarkiste) ? NULL : $tarkiste;
  $this->uusiSuola = uniqid('', true);
  $this->Istunto   = uniqid(rand(), true);

  $this->Tiiviste = sha1($this->Salasana.$this->uusiSuola);
}

public function Kirjaudu(){
if(isset($this->Kayttaja, $this->Salasana)){

  $k = "UPDATE kayttajat "
   . "JOIN (SELECT suola AS tempsuola FROM kayttajat WHERE kayttaja = '" . $this->Kayttaja . "') AS temptaulu "
   . "SET istuntotunnus = '" . $this->Istunto . "', suola = '" . $this->uusiSuola . "', tiiviste = '" . $this->Tiiviste . "' "
   . "WHERE kayttaja = '". $this->Kayttaja . "' AND tiiviste = sha1(CONCAT('" . $this->Salasana . "', temptaulu.tempsuola))";

  if(!($t = mysql_query($k))) return;

  if(mysql_affected_rows() == 1){ echo 'jee'; }

PS. Jostain kumman syystä sivu, josta yhteys muodostetaan ä ja ö kirjaimet näkyvät myös väärin.

- Yhteys tietokantaan ep&#65533;onnistui

The Alchemist [30.05.2011 13:45:43]

#

Otahan nyt viimein jo pois nuo ylimääräiset sha1()-kutsut tuolta. Niitä tulee olla täsmälleen yksi per prosessointikerta, ei yksi per välivaihe.

Merkistöongelmiin ei auta kuin se, että laitat merkistöt kuntoon nettisivuilla eli HTML-dokumentissa. PHP:llä ei sen kanssa ole nimeksikään tekemistä.

manninen [30.05.2011 13:52:14]

#

Mielestäni ne pitäisi olla kunnossa, eikä ongelma näytä ilmenevän kuin salasanan kohdalla. käyttäjätunnus voi olla vaikka ääööää, mutta salasana ei!

otan pois, ylimääräiset sha1 kikkareet :)

Metabolix [30.05.2011 14:21:18]

#

Ilmeisesti olet edelleenkin sössinyt jotain tietokannan merkistöjen kanssa. Helpoiten ongelma varmaankin ratkeaa sillä, että et tee SQL-kyselyssä mitään operaatioita vaan hoidat koko logiikan PHP:llä. Eli hae ensin kannasta käyttäjän tiedot tunnuksen perusteella, tarkista sitten tiedot PHP:llä ja laita lopuksi uudet tiedot kantaan.

The Alchemist [30.05.2011 14:43:03]

#

Enpähän tiedä, vaikuttaako palvelimen merkistöongelmat tuohon SQL-kyselyssä tehtävään hashaukseen vai ei, mutta ainakin ne saa täysin eliminoitua sillä, että tiivisteen laskee PHP:llä ja kyselyä käyttää vain tuloksen tallentamiseen.

Toisaalta taas itsekin käytän vain ascii-merkistöllä ilmaistavissa olevia salasanoja, sillä koskaan ei voi tietää, miten pahasti palvelimen päässä asiat sössitään. Toinen juttu on se, että jos joutuu käyttämään esim. jenkkinäppistä, niin voi hetken aikaa joutua miettimään, että millä se erikoiskoukero saadaankaan tehtyä.

Se, mitä itse ajoin takaa edellisellä viestilläni, oli että kaikkien sivuston sivujen pitää käyttää samaa merkistöä. Mikäli rekisteröitymissivu näytetään selaimessa UTF-8-merkistöllä, niin palvelimelle lähetettävän datankin enkoodaus on UTF-8. Jos sitten login-sivu on käyttääkin jotain muuta merkistöä, niin "yllättäen" kandit ja muut erikoismerkit aiheuttavat ongelmia varmennuksen kanssa.

manninen [30.05.2011 15:01:44]

#

Alkaa pikkuhiljaa tuntumaan, että pitää paukauttaa koko UTF-8 ISO standardiin niin saa lopetta tämän "itkemisen". Tuntuu, että joka suunnalta tulee pieniä ongelmia vastaan.

Viimeinen epätoivon itku!

1. Tallennan tiedostot muotoon UTF-8
2. käytän metasanaa

  <meta http-equiv="content-type" content="text/html; charset=utf-8" />

3. Tietokantayhteyden muodostamisen jälkeen käytän seuraavaa rimpsua :

mysql_query("SET
  character_set_results = 'utf8',
  character_set_client = 'utf8',
  character_set_connection = 'utf8',
  character_set_database = 'utf8',
  character_set_server = 'utf8'",
 $conn);

4. Yhteyden muodostussivulla on vielä seuraava rimpsu

 if(headers_sent() == false)
 {
   header("Expires: -1");
   header("Content-type: text/html; charset=utf-8");
   header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
   header("Cache-Control: no-store, no-cache, must-revalidate");
   header("Cache-Control: post-check=0, pre-check=0", false);
   header("Pragma: no-cache");
}

Tässä on kaikki mitä teen UTF-8:n eteen. Voinko vielä jotain tehdä?

The Alchemist [30.05.2011 18:57:13]

#

Varmistat nyt aluksi, että jokaisella sivulla todellakin käytetään UTF-8-merkistöä. Firefox ainakin näyttää käytetyn merkistön, kun valitsee context menu'sta kohdan "View page info". Suosittelisin myös vaihtamaan tiivisteen laskemisen pois tietokantakyselystä ja suorittamaan sen puhtaasti PHP:llä. Syyt voi lukea ylempää.

manninen [30.05.2011 21:18:16]

#

Tarkistin sivut jotka tuottavat tällä hetkellä ongelmia.

Mozilla : Näytä => sivun merkistökoodaus = unnicode(UTF-8)

paitsi jos laitan sieltä vaihtoehdon käyttäjän määrittelemä,(tarkoittako se käyttäjän määrittämää vai koodissamääritettyä)? tulos on laatikkomainen ;)

Kirjaudu functiota muutettu näin :

$q = "SELECT suola FROM kayttajat WHERE kayttaja = '$this->Kayttaja'";
if(!($r = mysql_query($q))) return;

$row = mysql_fetch_assoc($r);

$this->UusiTiiviste = sha1($this->Salasana.$row['suola']);

$k = "UPDATE kayttajat SET istuntotunnus = '$this->Istunto', suola = '$this->uusiSuola', tiiviste = '$this->Tiiviste'
      WHERE kayttaja = '$this->Kayttaja' AND tiiviste = '$this->UusiTiiviste'";

Tämän jälkeen kelpaa kirjautumiseenkin ääkköset ja öökköset! Tiedä en onko utf-8 edelleenkään oikein, koska silloin tällöin ei öökköset toimi!


Sivun alkuun

Vastaus

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

Tietoa sivustosta