Diskuze: spojování tabulek
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 24 zpráv z 24.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj,
moc jsem nepobral, jak to máš na mysli. Když máš tabulku 'komentar' a v
ní sloupec 'komentar_id', pak by to mělo být INT AUTO INCREMENT (to ID
jednoznačně identifikuje každý řádek v tabulce).
Když to bude AUTO INCREMENT (AI), pak tam nemusíš ručně vkládat žádnou
hodnotu - databáze si tam vloží další číslo.
Ve tvém případě by pak stačilo napsat pouze:
<?php
$koment_jmeno = mysql_real_escape_string($_POST["koment_jmeno"]);
$koment = mysql_real_escape_string($_POST["koment"]);
mysql_query("
INSERT INTO `komentar` (`prezdivka`, `time`, `komentar`)
VALUES ('" . $koment_jmeno . "', '" . time() . "', '" . $koment . "')
");
Jen takové malé odbočení od tématu: na vkládání dat do DB používej funkci mysql_real_escape_string(), která ošetří nebezpečné řetězce. Funkci htmlSpecialChars() používej až při výpisu dat.
Edit:
Ještě jednou jsem si pročetl ten zdroják a všiml jsem si, že sloupec
'komentar_id' obsahuje ID knihy návštěv.
Můžeš mi, prosím, zaslat strukturu tabulek 'knihanavstev' a 'komentar'?
Mám pocit, že jsem se v tom trochu ztratil
jo, já to totiž zatím zkouším na knize návštěv aby to šlo okomentovat..kniha navstev ma id auto increment a ten se musí rovnat komentar_id aby se to zobrazovalo u správných prispevku.. jsem v tomhle zacatecnik a nevim jestli mam ty tabulky spravne navrhnute a bude to takhle fungovat
Ked si precitas tutorial o bezpecnosti webovych aplikacii tu na ITnetworku zistis ze sa to neodporuca...
Raději bych použil knihovnu mysqli a proměnné v query dotazu bych zadával jako parametry.
Teď tě moc nechápu... escapovat se samozřejmě musí, ale dneska se na to používají parametrizované dotazy, kde automaticky escapuje databázová vrstva (např. PDO).
Jestli jsem to správně pochopil, tak po odeslání formuláře nemáš dostupné id z tabulky knihanavstev, které chceš uložit do tabulky komentar jako komentar_id a tím to spárovat. To znamená že si to ID musíš předat přes formulář. Do něj doplň něco jako
<input type="hidden" name="komentar_id" value="' . $zaznam['id'] . '">
Při zpracování si ho převezmeš.
@$koment_id=(int)$_POST["komentar_id"];
A query upravíš na
@$dotaz3= 'INSERT INTO komentar(prezdivka, time, komentar, komentar_id) Values("'.$koment_jmeno.'", "'.Time().'", "'.$koment.'", "'.$koment_id.'")';
Je tam dost věcí na úpravu a vylepšení, ale na to časem přijdeš sám
ano, nato mas PDO tu je ten clanok(http://www.itnetwork.cz/…ion-a-obrana)
Možná sis mohl všimnout, že jsem ten článek psal já, takže o tom něco málo vím. Fazy ale psal, že se teprve učí, tak ho nechci zatěžovat nějakým objektovým ovladačem. Na druhou stranu by měl vědět, že htmlspecialchars() se používá až při vytahování dat, ne při ukládání.
pokial nepouzivas PDO, tak musis escapeovat, lebo bez escapeovania sa stane aplikacia nachylna na SQL injektion
vyhoda PDO je, ze mozes pouzit aj parametricke dotazy
s tím input type= hidden mi to dává smysl a chápu jak to má fungovat..
ale už několik hodin to tam zkouším vložit a nedaří se mi to...
kam mám vložit tenhle kod
@$komentjmeno=$_POST['koment_jmeno'];
@$koment=$_POST['koment'];
@$koment_id=$_POST['komentar_id'];
@$dotaz3= 'INSERT INTO komentar(prezdivka, time, komentar, komentar_id) Values("'.$komentjmeno.'", "'.Time().'", "'.$koment.'", "'.$koment_id.'")';
@$vysledky3 = mysql_query($dotaz3,$db) or die(mysql_error($db));
aby se to ukládalo správně? když to přidám pod zdroják toho
formuláře tak se to díky tomu while uloží několikrát a špatně.. když
to dám až za while tak to nefunguje a má to vždycky koment_id=1...
Protože ty ta data musíš vkládat pouze v případě, že ti byla
předána z tvého formuláře. Takhle se je tam snažíš nacpat, i když ti
nic nepřišlo.
Doporučuji ti přečíst si aspoň tento článek http://www.itnetwork.cz/…ovy-formular
A možná ještě lepší by bylo, kdyby jsi začal hezky od začátku http://www.itnetwork.cz/php/zaklady
Věř, že to nebude ztráta času
normálně fakt už nevím.. Už jsem sice pokročil, ale pouze v tom že
komentář se do DB uloží pouze u prvniho příspěvku.. u dalších se
komentář ani neuloží.
udělal jsem si na to takový jednoduchý kód
if(trim($_POST['koment_jmeno']) !="" && trim($_POST['koment']) !="")
{
$prezdivka=$_POST['koment_jmeno'];
$koment=$_POST['koment'];
$koment_id=$_POST['komentar_id'];
$dotaz3='INSERT INTO komentar(prezdivka, time, komentar, komentar_id) VALUES("'.$prezdivka.'", "'.Time().'", "'.$koment.'", "'.$koment_id.'")';
$vysledek3=mysql_query($dotaz3, $db) or die(mysql_error($db));
}
ale nechápu proč to funguje pouze u prvního vypsaného příspěvku..
pro přehlednost, tady je celý kód znovu kompletně
<?php
$hodina=time() ;
$host='localhost';
$uzivatel='root';
$heslo='';
$db=mysql_connect($host, $uzivatel, $heslo) or die('Nelze se připojit k serveru');
$databaze='kniha';
mysql_select_db($databaze, $db) or die (mysql_error($db));
mysql_query('SET NAMES UTF8');
mysql_query('SET COLLATION_CONNECTION=utf8_czech_ci');
if(isset($_POST['jmeno']) && isset($_POST['text'])){
if(trim($_POST['jmeno']) !="" && trim($_POST['text']) !="")
{
$jmeno=trim(htmlspecialchars(strip_tags($_POST['jmeno'])));
$prispevek=trim(htmlspecialchars(strip_tags($_POST['text'])));
$dotaz= 'INSERT INTO knihanavstev(jmeno, text, cas, zobrazovat) Values("'.$jmeno.'", "'.$prispevek.'", "'.Time().'", "1")';
$vysledky = mysql_query($dotaz,$db) or die(mysql_error($db));
}}
if(isset($vysledky))
{
echo '<div class="ok"><br>Váš příspěvek byl úspěšně vložen<br></div>';
}
else
{
echo '<div id="err"></div>';
}
$dotaz='SELECT * FROM knihanavstev WHERE zobrazovat="1" ORDER BY cas DESC';
$vysledek=mysql_query($dotaz, $db);
while($zaznam=mysql_fetch_assoc($vysledek))
{
echo '<div id="kniha" >
<div class="pridal"><strong> '.$zaznam['jmeno'].'</strong></div>
<div class="cas">'.date('d.m.y / H:i:s' ,$zaznam['cas']).'</div>
<div style="clear:both"></div>
<div class="textprispevku">'.$zaznam['text'].'</div>
<div id="komentar">
<p>Vložit komentář</p>
<form action="" method="POST">
<label for="prezdivka">Přezdívka: </label>
<input type="text" name="koment_jmeno" id="koment_jmeno" style="width:70px"><br>
<label for="komentar">Komentář: </label>
<textarea name="koment" id="koment" style="width:300px;height:50px"></textarea><br>
<input type="submit" value="vložit">
<input type="hidden" id="komentar_id" name="komentar_id" value="'.$zaznam['id'].'">
</div>
</div>
<br>';
$dotaz2='SELECT * FROM komentar WHERE komentar.komentar_id = ' . $zaznam['id'] . ';';
$vysledek2=mysql_query($dotaz2, $db) or die(mysql_error($db));
while($zaznam2=mysql_fetch_assoc($vysledek2)){
echo $zaznam2['prezdivka'];
echo date('d.m.y / H:i:s' ,$zaznam2['time']);
echo $zaznam2['komentar'];
};
echo '<hr>';
};
if(trim($_POST['koment_jmeno']) !="" && trim($_POST['koment']) !="")
{
$prezdivka=$_POST['koment_jmeno'];
$koment=$_POST['koment'];
$koment_id=$_POST['komentar_id'];
$dotaz3='INSERT INTO komentar(prezdivka, time, komentar, komentar_id) VALUES("'.$prezdivka.'", "'.Time().'", "'.$koment.'", "'.$koment_id.'")';
$vysledek3=mysql_query($dotaz3, $db) or die(mysql_error($db));
}
else {echo '<img src="dfnk">';};
echo '</div>';
?>
Možná to jen špatně vidím, ale nechybí ti tam ukončení </form> ??
Jednou zpracováváš POST nahoře, podruhé dole. Navíc ani nevidím, že by jsi tam pro to první zpracování vůbec měl nějaký formulář pro odeslání. Nedivím se, že se v tom nemůžeš vyznat, když požíváš proměnné jako $vysledky, $vysledek1, $vysledek2 ... Určitě si přečti http://www.itnetwork.cz/…uvod-a-psr-1
vyvaruj sa pouzuvania premien ako $vysledek1, $vysledek2,...$vyskledekn,
radsej pomenuj tie premenne podla udajov, co obsahuju, alebo by mali obsahovat,
tym by sa sprehladnil cely kod a vedel by si aj po roku, co robi dany kusok
kodu...
a okrem toho nezabudaj na komentare, dalej nepouzivaj funkciu "die", ale nauc sa
OOP a zacni pouzivat vynimky, PDO s parametrickymi dotazmi
die nasilne ukonci beh celeho skriptu
ale spat k tvojmu kusku kodu... pokial vysledek1 uz si spracoval a dalej ho nechces spracovavat, tak mozes obsah premennej prepisat novym volanym mysql_query() a takisto $dotaz2 a dotaz3 su taktiez zbytocne premenne...
Ano, to som si nevsimol a o htmlspecialchars() som nehovoril.
a mkub:
ano, mas pravdu
Zobrazeno 24 zpráv z 24.