Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: En vieläkään osaa näitä koodauksia

Sivun loppuun

Juhko [01.12.2009 23:59:58]

#

http://jjp.jouluserver.com/foorumi/pagetop.php

Tiedosto on UTF-8:na ja metatagikin ilmoittaa niin, mutta headereiden mukaan se on iso-8859-15 -muodossa. Miten saan korjattua? Pitäisi saada joko headereihin kirjoitettua, että se on UTF-8:aa tai sitten saada tiedosto iso-8859-15:ksi. En ymmärrä näistä yhtään mitään, joten joku voinee auttaa?

Metabolix [02.12.2009 00:02:41]

#

<?php
header("Content-Type: text/html; charset=UTF-8");

Tuo BOM eli ylimääräiset tyhmät tavut tiedoston alussa pitäisi kuitenkin saada pois. Kannattaa käyttää jotain kunnollista tekstieditoria, joka ei laita niitä.

Juhko [02.12.2009 00:03:32]

#

Entä jos kyseessä ei ole .php-tiedosto?

edit: Käytän Notepad++:aa, mutta en (yllätys yllätys) tajua siitäkään mitään.

Metabolix [02.12.2009 00:04:40]

#

Eikös tässä äskettäin sammakkomiehelle neuvottu htaccess-rivi siihen tarkoitukseen? Jos vaikka sinä onnistuisit käyttämään sitä paremmin.

Juhko [02.12.2009 00:05:28]

#

Kiitoksia, olin unohtanut. Kokeilen.

Edit
Entäs nyt, kun äskeinen pätkä on lisätty include()-komennolla http://jjp.jouluserver.com/foorumi/topics.php <= tuon alkuun? Pistän pari koodia:

topics.php

<?php include("pagetop.php"); ?>
<p class="plaintext"><?php echo $if_topictext; ?></p>
<div id="topics">
<p>
<h2><?php echo $if_topics; ?></h2>
<table>
	<tr class='list0'><td><?php echo $if_topictitle; ?></td><td><?php echo $if_user; ?></td></tr><?php

$yhteys = mysql_connect($dbhost,$dbuser,$dbpassword) or die($dbconnecterror);
mysql_select_db($dbname, $yhteys) or die($dbnotfound);

$user=1;
$subject=$_POST['subject'];
$topics=mysql_query("SELECT id, user, subject, time FROM topics");

for($i=0; $i < mysql_num_rows($topics); $i++) {
	$ls = ($i % 2)+1;
	$id = mysql_result($topics, $i, "id");
	$subject = mysql_result($topics, $i, "subject");
	$user = mysql_result($topics, $i, "user");
	echo "	<tr class='list$ls'><td><a href='topic.php?id=$id'>$subject</a></td><td><a href='profile.php'>$user</a></td></tr>\r\n";
}

mysql_close($yhteys);

?>
</table>
</div>
</p><p>
<div id="functions"><form action="newtopic.php" method="post">
<h2><?php echo $if_newtopic; ?></h2><?php echo $if_topictitle; ?>: <input type="text" name="subject" size="50"><br><?php echo $if_message; ?>:<br><textarea name="message" rows="15" cols="100"></textarea><br><input type="submit" value="<?php echo $if_newtopic; ?>"></form>
</div>
</p>
<?php include("pagebottom.php"); ?>

pagetopplain.php

<?php header("Content-Type: text/html; charset=UTF-8"); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<meta http-equiv="Content-Language" content="fi">
		<title><?php echo $if_topics; ?> - <?php echo $if_sitename; ?></title>
		<link rel="stylesheet" href="style.php">
		<link rel="stylesheet" href="style2.php">
	</head>
	<body>

<div id="everything"><div id="title"><h1><?php echo $if_sitename; ?></h1><div id="user"><h2><?php echo $if_user; ?></h2><ul><li>åöäöäöåöäöåö<?php

if(!($userid=="")) {
	$yhteys = mysql_connect($dbhost,$dbuser,$dbpassword) or die($dbconnecterror);
	mysql_select_db($dbname, $yhteys) or die($dbnotfound);
	$kysely=mysql_query("SELECT username FROM users WHERE userid=$userid", $yhteys);
	$username=mysql_result($kysely,0,"username");
	echo "<span class='logged'>$username:</span></li><li><a href='profile.php?id=$userid'>$if_profile</a></li><li><a href='logout.php'>$if_logout</a>";
}
else
{
	echo "<a href='login.php'>Kirjaudu sisään</a>";
}

?></li></ul></div></div>

<div id="content">

pagetop.php

<?php
include("topinclude.php");
include("pagetopplain.php");
?>

topinclude.php ei tulosta mitään, ainoastaan asettaa muuttujia, jotka näkyvät koodissa.

Metabolix [02.12.2009 13:08:17]

#

UTF-8-ääkköset näkyvät aivan oikein. Sivun alareunassa on näköjään ISO-8859-1-ääkkösiä, jotka näkyvät nyt väärin (asdf����AAAGaaa). Oliko muuta kysyttävää?

tsuriga [02.12.2009 14:15:52]

#

Älä tapa sivun muodostusta kesken die-komennolla, vaan tulosta joku käyttäjälle oleellinen virheviesti (käyttäjän tuskin tarvitsee tietää tietokantavirheistä, vai muodostetaanko $db-alkuiset virheviestit sovelluksen hetkellisen ympäristön mukaan?).

Juhko [02.12.2009 19:30:29]

#

Metabolix kirjoitti:

UTF-8-ääkköset näkyvät aivan oikein. Sivun alareunassa on näköjään ISO-8859-1-ääkkösiä, jotka näkyvät nyt väärin (asdf����AAAGaaa). Oliko muuta kysyttävää?

Alareunan koodi on tiedostossa pagebottom.php, joka lähetetään ISO-8859-1:nä. Mutta jos yritän lisätä siihen PHP:n avulla headereita, tulee ilmoitus "Warning: Cannot modify header information - headers already sent by (output started at /home/jjp/www/foorumi/pagetopplain.php:6) in /home/jjp/www/foorumi/pagebottom.php on line 1".

Minulla on .htaccess-tiedostossa rivit:

AddCharset UTF-8 .php
AddCharset UTF-8 .html

...joten minkä takia se ei toimi oikein? pagetopplain.php on ainoa, joka sisältää headerin content-type -määrittelyn.

tsuriga kirjoitti:

Älä tapa sivun muodostusta kesken die-komennolla, vaan tulosta joku käyttäjälle oleellinen virheviesti (käyttäjän tuskin tarvitsee tietää tietokantavirheistä, vai muodostetaanko $db-alkuiset virheviestit sovelluksen hetkellisen ympäristön mukaan?).

Käytän niitä lähinnä ohjelmiston ollessa kehitysvaiheessa. Ne sisältävät tällä hetkellä tekstit "Database error: Database not found" tai "Database error: Connection failed". Ne on asetettu tiedostossa topinclude.php, joka alustaa kaikki tarvittavat muuttujat (käyttöliittymätekstit, userid, tietokannan nimi, tunnus, salasana, tms.)

Chiman [02.12.2009 20:17:10]

#

Juhko kirjoitti:

Alareunan koodi on tiedostossa pagebottom.php, joka lähetetään ISO-8859-1:nä. Mutta jos yritän lisätä siihen PHP:n avulla headereita, tulee ilmoitus "Warning: Cannot modify header information - headers already sent by (output started at /home/jjp/www/foorumi/pagetopplain.php:6) in /home/jjp/www/foorumi/pagebottom.php on line 1".

Koodaus on sivulatauskohtainen. Jos koostat yhden sivun useammalla eri php-tiedostolla, tulosta niissä kaikissa samaa merkistöä käyttäen. Et voi lähettää headereita enää, kun olet jo aloittanut tulostuksen (sivun yläosan).

Juhko [02.12.2009 20:21:03]

#

Nii-in, mutta miten voin muuttaa niiden merkistöä, kun en voi muuttaa headereita?

Chiman [02.12.2009 21:56:40]

#

Tottakai voit muuttaa PHP-tiedostoon kohdistuvan sivupyynnön vastauksen headereita. Katso tämän ketjun toinen viesti. Eli sinun tapauksessasi siellä mainittu header-kutsu kuuluu ilmeisesti pagetopplain.php:n alkuun, ennen kuin mitään tulostetaan.

Jos laitat headeriin UTF-8-määrityksen, laita sama merkistö myös <head>-osan meta-tagiin. Samoin tulosta kaikki sivulle tuleva teksti UTF-8-muodossa, eli tallennat kooditiedoston UTF-8-muodossa editorista, ja jos otat tekstiä tietokannasta, siellä olevan datan olisi parasta olla UTF-8-muodossa.

Yhtenäisyys toimii parhaiten ja UTF-8 on paras valinta nykyään, jos ei ole erityistä syytä käyttää muuta.

Metabolix [03.12.2009 00:09:17]

#

Avaa pagebottom.php hyvällä tekstieditorilla ja tallenna uudestaan UTF-8-enkoodattuna. Ei sen kummempaa.

tsuriga [03.12.2009 15:19:33]

#

Juhko kirjoitti:

tsuriga kirjoitti:

Älä tapa sivun muodostusta kesken die-komennolla --

Käytän niitä lähinnä ohjelmiston ollessa kehitysvaiheessa. --

Metodi-/funktiokutsut, jotka heittävät virheen eivät tarvitse erillistä virheentulostusta, mikäli PHP on konfiguroitu järkevästi siten, että kehitysympäristössä virheet tulostetaan näkyviin ja tuotantoympäristössä virhelogiin. Jos kutsu itsessään ei heitä virhettä/poikkeusta, voit heittää poikkeuksen manuaalisesti. Jos (ja kun) haluat muotoilla tulostusta (tuotantoympäristössä käyttäjille informatiiviset virheviestit) tai sen sijaintia, voit määritellä oman poikkeuskäsittelijän:

<?php

class Handler
{
    public static function handleError($code, $message, $file, $line)
    {
        if (!error_reporting()) {
            return;
        }
        throw new ErrorException($message, 0, $code, $file, $line);
    }

    public static function handleException($exception)
    {
        try {
            $vis = ini_get('display_errors');
            if ($vis && strtolower($vis) !== 'stderr') {
                printf('Exception thrown: %s', $exception->getMessage());
            }

        } catch (Exception $e) {
            printf('%s thrown within the exception handler. Message: %s on line %d',
                get_class($e), $e->getMessage(), $e->getLine());
        }
    }
}

set_error_handler(array('Handler', 'handleError'));
set_exception_handler(array('Handler', 'handleException'));

?>

sammakkomies [03.12.2009 15:55:34]

#

Tuo näyttää hienolta tuo yläosa (jos värit olisivat erit). Käytän sitä koodia mikä siinä nyt on ja kopion sen ilman CP (CopyPaste) menetelmää ja korjaan itse virheet. En itse osaa hyvin mutta jos vaikka pitää asiattomien kommenttien vuoksi pistämää Jotku jutut rek. käyttäjille niin en osaisi. Kerro jos et halua niin en laita. Menee aikasintaa klo 20:00 ku pääsen kotiin.

alottelijaa [03.12.2009 16:00:19]

#

en tiedä hyötyykö tästä enää mitään mutta jos notepad++ käytät saat BOM pois kun menet:

Tiedostomuoto->Muuta koodaukseen UTF-8 (Ei BOM)

Juhko [03.12.2009 18:11:16]

#

Kiitokset ohjeista, nyt taitaa toimia. Katson seuraavaksi tuon tsurigan jutun.

Edit: Mikähän idea tässä nyt oikein on?

alottelijaa [03.12.2009 18:57:31]

#

Undefined index: userid
Katsot taulukosta jotain kohtaa mitä ei ole olemassa.

Juhko [03.12.2009 19:51:45]

#

Hupsista, ei siitä pitänyt kysyä (korjasin joka tapauksessa), vaan tuosta date-jutusta. Käskee ilmoittamaan timezonen "turvallisuussyistä".

Metabolix [03.12.2009 20:04:22]

#

No ilmoita.

Juhko [03.12.2009 20:41:34]

#

Siis, en tiedä miten saan käyttäjän timezonen selville PHP:llä.

Edit: Vai kannattaako se mieluummin tehdä niin, että asetuksissa määritetään aikavyöhyke? Kuten esim. Wikipediassa.

Metabolix [03.12.2009 22:14:20]

#

Ei tässä ole käyttäjän aikavyöhykkeestä kyse, vaan laita siihen esimerkiksi palvelimen aikavyöhyke. Jos jostain syystä haluat kohdella eri käyttäjiä eri tavalla, niin laita käyttäjän profiiliin, mutta yleensä yksi järkevä oletusvaihtoehto riittää.

Juhko [03.12.2009 22:17:44]

#

Kiitos ohjeista. Laitoin "Europe/Helsinki".

Metabolix [04.12.2009 23:02:41]

#

AddCharset ei näköjään toimi JouluServerillä, mutta AddDefaultCharset UTF-8 asettaa toimivasti kaikille tekstityyppisille tiedostoille oletusmerkistön. Ihan näin jälkitietona. :)

Juhko [05.12.2009 00:23:30]

#

Huomasin, ja olenkin jo laittanut.

sammakkomies [06.12.2009 02:18:10]

#

niin saanko lainata tätä? Muutan värejä ja tekstiä niin ei tunnista helpolla. Mainitsen toki tekijän jos saan.

Juhko [06.12.2009 02:24:13]

#

Siitä vain...

sammakkomies [06.12.2009 04:10:37]

#

Kiitos


Sivun alkuun

Vastaus

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

Tietoa sivustosta