Diskuze: Znaková sada databáze

PHP PHP Znaková sada databáze American English version English version

Avatar
Salieri
Člen
Avatar
Salieri:

Předem se omlouvám, SQL forum jsem nenašel.

Zdravím Vás,

Mám takový problém, mám v databázi vše je nastaveno na znakovou sadu CP 1250

Chci pomocí textarea vložit "článek" lépe řečeno určitý obsah a v druhém souboru ho vypsat.

Bohužel se mi stane chyba, že místo č š a dalších písmen se zobrazí otazníky

Přidání článku

<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title></title>
</head>
<body>
<h1>Přidej článek</h1>
<form action="clanek.php" method="POST">
<table>
<tr><td><textarea rows="10" cols="150" name="clanek">

</textarea></td></tr>
<tr><td><input type="submit" value="Odeslat"></td></­tr>
</table>
</form>

<?php
require("connec­t.php");
if(isset($_POS­T["clanek"])){
$clanek=$_POS­T["clanek"];
$dotaz="insert into clanky(clanek)va­lues(\"$clanek\")";
$vysledek=mys­ql_query($dotaz) or die ("Clanek se nepodařilo vložit");
if($vysledek){
echo "Článek byl úspěšně uložen";

}
}

?>
</body>
</html>

Pro výpis

<!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title></title>
</head>
<body>
<h1>Vybraný článek</h1>
<?php
require("connec­t.php");
$dotaz="select * from clanky";
$vysledek=mys­ql_query($dotaz);
while($radek=mys­ql_fetch_arra­y($vysledek)){
echo $radek["clanek"];
}

?>
</body>
</html>
Adresa databáze: http://uloz.to/…P/clanky-sql

Předem děkuji za odpovědi.

Odpovědět 19.7.2013 14:48
Hlavní zlo? **Školství a Matematika**!
Avatar
Juraj Mlich
Redaktor
Avatar
Juraj Mlich:

skús

mysql_query("set names CP1250")
Nahoru Odpovědět  +1 19.7.2013 15:05
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Máš to v trochu divném pořadí. Nejprve má být zápis do databáze (zpracování POST) a pak teprve formulář. Takhle je problém se v tom vyznat.

Nejspíš je chybně založena tabulka s implicitní švédskou znakovou sadou. Před založením je potřeba se přepnout na českou. Používám výhradně UTF8 (doporučuji), takže pro 1250 si budeš muset přesné znění někde najít.

Nahoru Odpovědět 19.7.2013 15:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Juraj Mlich
Redaktor
Avatar
Juraj Mlich:

Inak ovládač mysql ktorý používaš je zastaraný. Skús PDO. A znakovú sadu používaj utf-8.

Nahoru Odpovědět 19.7.2013 15:08
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
FastNode
Redaktor
Avatar
FastNode:

Všichni jste nějak moc rychlý! :)

Editováno 19.7.2013 15:10
 
Nahoru Odpovědět 19.7.2013 15:09
Avatar
Kit
Redaktor
Avatar
Odpovídá na Juraj Mlich
Kit:

To je ono. Ten příkaz se musí zadat hned po každém otevření databáze, ještě před založením tabulek.

Nahoru Odpovědět 19.7.2013 15:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
FastNode
Redaktor
Avatar
FastNode:

mj. při přidávání článku bys měl ten vstup nějak ošetřit

mysql_real_escape_string($text);

nebo

strip_tags(addslashes($text));
Editováno 19.7.2013 15:14
 
Nahoru Odpovědět 19.7.2013 15:13
Avatar
Salieri
Člen
Avatar
Salieri:

Přidávání článku bude dělat pouze jeden člověk :)
Jinak, mám v tom bordel to je pravda. Švédská sada byla přeměněna na CP1250. Pořád nic

Nahoru Odpovědět 19.7.2013 15:21
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na FastNode
Kit:

Takhle ne. Místo řádku

$clanek=$_POST["clanek"];

patří

$clanek=mysql_real_escape_string($_POST["clanek"]);

na funkci addslashes() je lepší v tomhle kontextu raději zapomenout.

Nahoru Odpovědět 19.7.2013 15:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Nahoru Odpovědět 19.7.2013 15:22
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Musíš tu původní tabulku smazat a vytvořit znovu s CP1250 (nebo raději rovnou UTF8).

Nahoru Odpovědět  +1 19.7.2013 15:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Nahoru Odpovědět 19.7.2013 15:29
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Možná ten člověk bude chtít napsat větu o nakladatelství O´Reilly a v tu chvíli se ti systém zhroutí. I důvěryhodné texty je nutné ošetřit.

Nahoru Odpovědět  +1 19.7.2013 15:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Děkuji za radu, bohužel jsem srovnával jen tabulku smazal jsem databázi, porovnání jsem dal na utf8 a databáze je na plno funkční.

Děkuji.

Nahoru Odpovědět 19.7.2013 15:34
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

My tady jen věštíme z křišťálové koule, protože nevidíme, jestli sis tu tabulku nezaložil opět špatně. Zkus sem poslat, co ti vypíše dotaz

SHOW CREATE TABLE tabulka;
Nahoru Odpovědět 19.7.2013 15:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Vše již funguje správně.

Ok
CREATE TABLE clanky (  id int(255) NOT NULL AUTO_INCREMENT,  clanek varchar(4000) COLLATE utf8_czech_ci NOT NULL,  PRIMARY KEY (id)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci

Nahoru Odpovědět 19.7.2013 15:39
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

To vypadá dobře. Jen místo int(255) bych raději dal obvyklejší int(11) a místo varchar(4000) jednodušší typ text.

Tím to však nekončí. Bylo by dobré upravit i zbytek aplikace na UTF8, aby se ta kódování nepohádala.

Nahoru Odpovědět 19.7.2013 15:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Aha supr, děkuji upravím.

Ještě jsem se chtěl zeptat, chtěl bych ošetřit to aby se to text pole nezaslalo prázdné.Zkusil jsem

if(empty($_POST["clanek"])){
echo"Textové pole nebylo vyplněné."
}

A ono to bohužel nejde :)
Pomohl by si mi prosím ještě s tímto?

Editováno 19.7.2013 19:12
Nahoru Odpovědět 19.7.2013 19:11
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Viděl bych to zhruba viz kód. Podle mne je mnohem výhodnější vložit ukládání článku na začátek skriptu místo na konec, protože chybové hlášení můžeš hned vypsat. Třídy MyConnectDB a MySession si samozřejmě napiš podle sebe.

A zapomeň na funkci die(). Vyskytuje se už jen ve starých učebnicích.

<?php
session_start();
$db = new MyConnectDB();
$session = new MySession();
if (isset($_POST['clanek'])) {
    try {
        if (empty($_POST['clanek']))
            throw new Exception("Textové pole nebylo vyplněno.");
        $db->addClanek($_POST['clanek']);
        $session->setMessage("Článek byl úspěšně uložen");
        header('Location: .');
        exit();
    } catch (Exception $e) {
        $session->setMessage($e->getMessage());
    }
}

echo <<<EOT
<!DOCTYPE html>
<html>
<head>
<title>Titulek</title>
</head>
<body>
<h2>$session</h2>
Formulář
<body>
</html>
EOT;
Editováno 19.7.2013 20:11
Nahoru Odpovědět  +1 19.7.2013 20:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Zvolil bych něco jednodušího, nejsem až tak pokročilý jak ty si napsal kod jestli mě chápeš, jsem pouhý začátečník :)

Nahoru Odpovědět 19.7.2013 20:39
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Chápu a proto jsem ti ten kód napsal takto. V tom mém je skoro všechno co potřebuješ v jednom souboru. Tedy až na ty chybějící třídy, které bych k tomu také mohl případně napsat.

Nahoru Odpovědět 19.7.2013 20:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět  +1 19.7.2013 22:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Nahoru Odpovědět 19.7.2013 22:17
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

Je to funkční, slepil jsem to během naší debaty.

Nahoru Odpovědět 19.7.2013 22:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Kit
Kit:

Ještě jsem trochu upravil názvy proměnných, aby se to lépe četlo.

Nahoru Odpovědět 19.7.2013 22:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Odpovídá na Kit
Salieri:

Super, já ti moc děkuju.

Nahoru Odpovědět 19.7.2013 22:45
Hlavní zlo? **Školství a Matematika**!
Avatar
Kit
Redaktor
Avatar
Odpovídá na Salieri
Kit:

To není jen pro tebe. Už jsem to chtěl napsat dávno jako minimalistický redakční systém. Dnes na něj konečně přišla řada. Samozřejmě se to dá rozšiřovat dle potřeby, rozdělit do souborů podle tříd, samostatně umístit šablonu apod. To už si však každý udělá podle sebe.

Nahoru Odpovědět 19.7.2013 22:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Salieri
Člen
Avatar
Nahoru Odpovědět 19.7.2013 23:33
Hlavní zlo? **Školství a Matematika**!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 28 zpráv z 28.