IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Kamil
Člen
Avatar
Kamil:19.7.2013 14:48

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
Avatar
Juraj Mlich
Tvůrce
Avatar
Juraj Mlich:19.7.2013 15:05

skús

mysql_query("set names CP1250")
 
Nahoru Odpovědět
19.7.2013 15:05
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 15:08

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
Tvůrce
Avatar
Juraj Mlich:19.7.2013 15:08

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
Avatar
FastNode
Tvůrce
Avatar
FastNode:19.7.2013 15:09

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
Tvůrce
Avatar
Odpovídá na Juraj Mlich
Kit:19.7.2013 15:10

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
Tvůrce
Avatar
FastNode:19.7.2013 15:13

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
Kamil
Člen
Avatar
Kamil:19.7.2013 15:21

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
Avatar
Kit
Tvůrce
Avatar
Odpovídá na FastNode
Kit:19.7.2013 15:22

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
Kamil
Člen
Avatar
Odpovídá na Juraj Mlich
Kamil:19.7.2013 15:22

Nepomohlo.

 
Nahoru Odpovědět
19.7.2013 15:22
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 15:23

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

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

Nepomohlo... :/

 
Nahoru Odpovědět
19.7.2013 15:29
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 15:30

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
19.7.2013 15:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kamil
Člen
Avatar
Odpovídá na Kit
Kamil:19.7.2013 15:34

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
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 15:35

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
Kamil
Člen
Avatar
Odpovídá na Kit
Kamil:19.7.2013 15:39

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
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 15:50

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
Kamil
Člen
Avatar
Odpovídá na Kit
Kamil:19.7.2013 19:11

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
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 20:10

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
19.7.2013 20:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kamil
Člen
Avatar
Odpovídá na Kit
Kamil:19.7.2013 20:39

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
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 20:56

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
Tvůrce
Avatar
Nahoru Odpovědět
19.7.2013 22:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kamil
Člen
Avatar
Odpovídá na Kit
Kamil:19.7.2013 22:17

ok, děkuji :)

 
Nahoru Odpovědět
19.7.2013 22:17
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 22:19

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
Tvůrce
Avatar
Odpovídá na Kit
Kit:19.7.2013 22:33

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
Kamil
Člen
Avatar
Odpovídá na Kit
Kamil:19.7.2013 22:45

Super, já ti moc děkuju.

 
Nahoru Odpovědět
19.7.2013 22:45
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Kamil
Kit:19.7.2013 22:59

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
Kamil
Člen
Avatar
Odpovídá na Kit
Kamil:19.7.2013 23:33

Rozumim.

 
Nahoru Odpovědět
19.7.2013 23:33
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.