Diskuze: spojování tabulek

Ostatní jazyky SQL SQL a databáze spojování tabulek

Avatar
fazy
Člen
Avatar
fazy:

Mám svůj blog, učím se php a mysql, a chci přidat možnost vkládání komentářů k mým příspěvkům
mám dvě tabulky spojené pomocí blog.id = komentar.Komen­tar_id
Vkládání příspěvků do blogu mi funguje,
Načtení komentářů ke konkrétnímu příspěvku taky funguje,
Nemůžu ale přijít na to, jak vkládat komentáře aby se k němu zapsalo to správné id. můj zdroják vypadá takhle:

$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">
                    </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 '</div>';
?>

Je to příkaz pro výpis dat z blogu, vypíše to příspěvek blogu, formulář pro vkládání komentářů a již vložené komentáře.
takhle nějak si myslím že by to mělo být, ale možná že se obrovsky pletu.. zkoušel jsem to vkládat do toho příkazu while ale to nefungovalo. když to naprogramuju externě, nevím jak tam dostat to komentar_id aby vědělo kde se to má zobrazit :/

<?php
@$koment_jmeno=trim(htmlspecialchars(strip_tags($_POST['koment_jmeno'])));
@$koment=trim(htmlspecialchars(strip_tags($_POST['koment'])));
@$dotaz3= 'INSERT INTO komentar(prezdivka, time, komentar, komentar_id) Values("'.$koment_jmeno.'", "'.Time().'", "'.$koment.'", "'.$zaznam['id'].'")';
@$vysledky3 = mysql_query($dotaz3,$db) or die(mysql_error($db));
?>
 
Odpovědět 2.7.2014 12:24
Avatar
Martin Konečný (pavelco1998):

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_es­cape_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 :-)

Editováno 2.7.2014 13:03
 
Nahoru Odpovědět 2.7.2014 13:01
Avatar
fazy
Člen
Avatar
fazy:

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

 
Nahoru Odpovědět 2.7.2014 15:47
Avatar
fazy
Člen
Avatar
fazy:

tam kde je komentar_id = 1, tak se zobrazi u prispevku knihy navstev ktere ma id 1.. kde je komentar_id = 2, tak se zobrazí u prispevku knihy navstev ktery ma id 2..

 
Nahoru Odpovědět 2.7.2014 15:53
Avatar
ano95
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
ano95:

Ked si precitas tutorial o bezpecnosti webovych aplikacii tu na ITnetworku zistis ze sa to neodporuca...

 
Nahoru Odpovědět 2.7.2014 15:55
Avatar
fazy
Člen
Avatar
fazy:

tady je náhled jak se to zobrazuje.. zatím to jeste není nastylované.. když to do tabulky narvu natvrdo v phpmyadminu zobrazuje se to krásně tam kde má.. ale pomocí formuláře nevím jak na to..

 
Nahoru Odpovědět 2.7.2014 16:00
Avatar
fazy
Člen
Avatar
fazy:

tady je náhled jak se to zobrazuje.. zatím to jeste není nastylované.. když to do tabulky narvu natvrdo v phpmyadminu zobrazuje se to krásně tam kde má.. ale pomocí formuláře nevím jak na to..

 
Nahoru Odpovědět 2.7.2014 16:00
Avatar
Tomáš Mičulka:

Raději bych použil knihovnu mysqli a proměnné v query dotazu bych zadával jako parametry.

 
Nahoru Odpovědět  -1 2.7.2014 16:02
Avatar
fazy
Člen
Avatar
fazy:

asi bych to potřeboval více rozepsat :) zatím jsem fakt začátečník.. mám svůj web fazy.cz kam pridavam funkce ktere se naucim.. a ted jsem chtel pridat komentare k blogu a knize navstev, ale delam to uz nekolik dni a nedari se mi to :/

 
Nahoru Odpovědět 2.7.2014 16:08
Avatar
Odpovídá na ano95
Martin Konečný (pavelco1998):

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).

 
Nahoru Odpovědět  +2 2.7.2014 16:53
Avatar
Findthee
Člen
Avatar
Odpovídá na fazy
Findthee:

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 :)

Editováno 2.7.2014 17:06
 
Nahoru Odpovědět 2.7.2014 17:05
Avatar
ano95
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
ano95:

ano, nato mas PDO tu je ten clanok(http://www.itnetwork.cz/…ion-a-obrana)

Editováno 2.7.2014 17:37
 
Nahoru Odpovědět 2.7.2014 17:36
Avatar
Odpovídá na ano95
Martin Konečný (pavelco1998):

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í.

 
Nahoru Odpovědět 2.7.2014 17:42
Avatar
mkub
Redaktor
Avatar
Odpovídá na ano95
mkub:

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

 
Nahoru Odpovědět 2.7.2014 19:34
Avatar
fazy
Člen
Avatar
fazy:

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... :(

 
Nahoru Odpovědět 2.7.2014 23:28
Avatar
Findthee
Člen
Avatar
Odpovídá na fazy
Findthee:

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 ;)

 
Nahoru Odpovědět 3.7.2014 19:17
Avatar
fazy
Člen
Avatar
fazy:

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..

 
Nahoru Odpovědět 7.7.2014 22:07
Avatar
fazy
Člen
Avatar
fazy:

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>';
?>
 
Nahoru Odpovědět 7.7.2014 22:13
Avatar
Findthee
Člen
Avatar
Odpovídá na fazy
Findthee:

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

 
Nahoru Odpovědět  +1 8.7.2014 18:57
Avatar
mkub
Redaktor
Avatar
Odpovídá na fazy
mkub:

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...

Editováno 8.7.2014 19:39
 
Nahoru Odpovědět 8.7.2014 19:38
Avatar
ano95
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
ano95:

Ano, to som si nevsimol a o htmlspecialchars() som nehovoril.
a mkub:
ano, mas pravdu

 
Nahoru Odpovědět 8.7.2014 19:42
Avatar
fazy
Člen
Avatar
fazy:

já jsem fakt blbec... :D bylo to jen tím, že jsem neměl ukončený form :D bože... jsem fakt vůl.. každopádně moc děkuji :) komentáře mi běží jak mají :)

 
Nahoru Odpovědět  +1 8.7.2014 20:17
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 24 zpráv z 24.