Diskuze: Znaková sada databáze
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 28 zpráv z 28.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
skús
mysql_query("set names CP1250")
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.
Inak ovládač mysql ktorý používaš je zastaraný. Skús PDO. A znakovú sadu používaj utf-8.
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.
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.
Musíš tu původní tabulku smazat a vytvořit znovu s CP1250 (nebo raději rovnou UTF8).
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.
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.
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;
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
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.
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?
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;
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
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.
Ještě jsem trochu upravil názvy proměnných, aby se to lépe četlo.
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.
Zobrazeno 28 zpráv z 28.