Zdravím,
ti kteří mě už znají (kit... ) ví,že jsem dřív použival takovou tu "bezdatabázovou" diskuzi
na vše možné... Pořád mi říkáte že se mám učit databázi,OK zkouším
to,a to na vtipech (vtipy.bobikpage.cz)
Ale je tam nějaká chybička,a navíc vůbec nevím jak se to dělá,tak bych
prosil poučení
$kategorie=mysql_real_escape_string($_POST['kategorie']);
$vtip=mysql_real_escape_string($_POST['vtip']);
$result=mysql_query("INSERT INTO vtipovnik (kategorie, vtip) VALUES ('$kategorie','$vtip')",$spojeni);
Sice tento zastaralý způsob už nepoužívám, ale snad to mám správně.
Ty první dva řádky ber jako nezbytnou nutnost, pokud o tu databázi nechceš
přijít. Každý uživatelský vstup musíš takto ošetřit proti útokům
nebo použít novější ovladač s parametrizovanými dotazy.
Na esapování rozhodně nepoužívej htmlspecialchars(), tato funkce se
používá až při výstupu z databáze do HTML.
Nejsem tady nonstop, nevolej mě.
A ještě něco: Oprav si datový model. Byla by velká hloupost mít jednu
tabulku pro každou kategorii vtipů.
A ještě přídavek: Po přidání vtipu do tabulky zavolej tyto funkce:
header("Location: .");
exit();
Je to prevence před tzv. doublepostem. Proces ukládání do tabulky se
navíc neuloží do historie prohlížeče. Pokud někdo stiskne F5, nepošle se
znovu a ani při návratu o stránku zpět.
Po každém odeslání dat metodou POST je nutné ta odeslaná data z
formuláře zrušit. Nejlépe přes zmíněný header(). Javascript bych do toho
vůbec netahal, protože zablokuje funkci header(), viz výše.
Fajn,mám to tam akorát to
tak napůl nefunguje... Vtip se přidává bez problému,ale kategorie se nechce
poslat,v PhPMyAdmin je "kategorie" prázdná - na stránce se nic nevypíše.
Zkoušel jsem ručně v adminovi upravit "kategorie" na "ostatní" a na stránce
se text vypsal takže
vypisování funguje,jen tu mám problém s posláním té kategorie...
posílám zdroják...
$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni'",$spojeni);
$radek=mysql_fetch_array($vypis);
if ($radek) //Povedlo se? Kdyby ne, vyšla by logická nula.$vtipy=$radek['vtip']; //OK, máme to - přečti číslo.else$vtipy='Error'; //Nepovedlo se - dej tam nějakou chybovou hlášku.echo($vtipy);
Jenže to nevypíše všechny vtipy,jen ten 1.
Asi se to dělá nějak přes "for"..nevím jak :/
<?php$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni'",$spojeni);
$radek=mysql_fetch_array($vypis);
while($radek=mysql_fetch_assoc($vypis))
{
if ($radek) //Povedlo se? Kdyby ne, vyšla by logická nula.$vtipy=$radek['vtip']; //OK, máme to - přečti číslo.else$vtipy='Error'; //Nepovedlo se - dej tam nějakou chybovou hlášku.echo($vtipy);
}
?>
To jsi jen zkopíroval můj post. Samozřejmě, víc není třeba.
Možná bys mohl doplnit detekci chybových stavů, ale pro začátek je tam
kvůli jednoduchosti dávat nemusíš. Proto používám PDO. Udělá spoustu
práce za mne a navíc je i rychlejší.
<?php$vypis = mysql_query("SELECT vtip FROM dbvtipy WHERE kategorie='ostatni' ORDER BY Datum DESC LIMIT 10",$spojeni);
while($radek=mysql_fetch_assoc($vypis)) {
echo"<p>",nl2br( htmlspecialchars($radek['vtip'])),"</p>\n";
}
Vytvoř jednu tabulku, ve které budeš mít kategorie, a druhou, ve které
budeš mít vtipy.
tabulka pro kategorie může být třeba
create table kategorie(
id tinyint auto_increment primary key,
nazev varchar(30)
)
tabulku pro vtipy třeba
create table vtipy(
id int auto_increment primary key,
kategorie int,
obsah text
)
a přečti si něco o spojování tabulek v databázi. http://www.linuxsoft.cz/article.php?…
A ještě jeden tip ti dám. Když neumíš pořádně pracovat z databází,
nesnaž se s ní hned programovat. Nejdřív se nauč pořádně pracovat s
databází (třeba pomocí adminer nebo phpmyadmin nebo příkazová řádka), a
až potom se snaž databázi používat ve svých programech.
ps : když myslím nauč se pracovat s databází, nemyslím tím jedno
odpoledne, ale třeba týden nebo měsíc
Normalizaci jsem chtěl nechat na později, abych Dana nezahltil, když s
tím předevčírem začal. Prozatím stačí 1NF.
Místo další tabulky s názvy kategorií stačí datový typ ENUM. Ovšem i
na to je dost času.
Názvy tabulek doporučuji volit v jednotném čísle.
Nejlepší je spustit si MySQL v terminálu a projít si to třeba takto: http://www.youtube.com/watch?…
Je toho víc dílů. Možná se dá totéž najít i pro MySQL, ale neměl jsem
potřebu to hledat.
to vím,ale já odpovídal na toto:
A ještě jeden tip ti dám. Když neumíš pořádně pracovat z databází,
nesnaž se s ní hned programovat. Nejdřív se nauč pořádně pracovat s
databází (třeba pomocí adminer nebo phpmyadmin nebo příkazová řádka), a
až potom se snaž databázi používat ve svých programech.
..já chtěl pomoct s těma vtipama,tak jsem nechápal proč sem taháš
programy...
datový typ enum je sice dobrý, ale jen pokud bude seznam kategorií
statický. Pokud bude seznam kategorií dynamický, je mnohem jednoduší
přidávat další kategorie, když jsou zvlášť v jedné tabulce, než když
je typ enum.
DanVitek nyní řeší, jak se naučit pracovat s jednou DB tabulkou. Nepleť
mu hlavu se zbytečnou další tabulkou s kategoriemi, která nijak
nepřispívá ke zlepšení schématu. V tuto chvíli může přidávat
kategorie tak, jak se mu zrovna bude hodit.
když chceš vypsat seznam kategorií, nebo vytvořit dynamicky formulář
pro výběr kategorie, tak jednoduše vypíšeš z té tabulky název. Když
chceš přidat kategorii, tak jednoduše přidáš do tabulky řádek, a tvoje
scripty se postarají samy o ostatní, a nemusíš nic předělávat.
Je hodně případů, ve kterých je výhodné mít samostatnou tabulku
kategorie. Ve tvém případě není potřebná.
Jde o to, že když postupně smažeš všechny vtipy o blondýnkách, zmizí
ti i kategorie 'blondýnky'. Záleží teď na tom, zda ti to vadí nebo ne.
Pokud to vadí (a takových případů je hodně), je nutné udělat další
tabulku kategorie tak, jak popsal martinkobelka.
Databáze je mocný nástroj. Normálně se i menu, v tvém případě seznam
kategorií generuje z databáze. Pro tento případ je třeba lepší mít v
jedné tabulce seznam kategorií.
Ještě taková pomůcka: Datová struktura se dá zapsat nejen do databáze,
ale i do XML. Ve chvíli, kdy v XML podvědomě uděláme vnořenou strukturu, v
SQL bychom měli udělat další tabulku.
Nefunguje to vždy, relace M:N se takto dělají hůř, ale za zkoušku to
stojí. Minimálně tím autor datového modelu získá nový pohled na data a
na vlastní uvažování. Ideálně jsou tato schémata mezi sebou
převoditelná.
Také jsem zkusil do databáze ukládat XML a JSON. Ano, za jistých
okolností to může porušovat 1NF - je potřeba na to dát pozor. S výsledkem
jsem byl velmi spokojen.
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.