Autor Zpráva
wimstr
Profil
Jak mám upravit GB, aby se dala přidat ke každémů článku jako komentáře.... (konkrétně, jak k ní přiřadit ID a jak by měla vypadat databázová tabulka) děkuji
Eddie
Profil
napr

table clanky (
id int - unikatne idcko
nadpis ...
);

table komentare (
id int ... poradove cisla, urcujes nimi v akom poradi sa vypisu riadky
cl_id int ... id clanku ku ktoremu patria komentare
);

dufam ze ti pomohlo toto male nakopnutie :)
wimstr
Profil
dufam ze ti pomohlo toto male nakopnutie :)
obávám se že moc ne.. :(
speacker
Profil *
vytvoríš si tabulku komentáře, kde musíš sloupec, do kterého budeš ukládat k jakému článku byl komentář uložen, tzn. uložíš si tam ID toho článku. a pak udeláš normální SQL dotaz s klauzulí WHERE a ty koment vypíšeš
wimstr
Profil
to s tim ID chápu, ale jak přiřadim tomu komentáři(článku) tu určitou ID
wimstr
Profil
Pokud na to znáte někdo tutoriál, mohl by mi možná pomoci poněkud více děkuji...
speacker
Profil *
ja nevím jak ty články vypisuješ, ale dám ti příklad. pokud to máš www.neco.cz/clanek.php?id=2 tak při ukládání komentáře do db zadáš v SQL dotazu
"INSERT INTO komentare (id,id_clanek,...) VALUES ('','$_GET[id]',...)";


a pak vypisuješ :
"SELECT * FROM komentare WHERE id_clanku='{$_GET[id]}'";
wimstr
Profil
Vzal sem to zatim za jiny konec, kouk sem na interval, a našel si tam komentáře, už jednou sem to nezpustil, a tak to zkusim znova.
vše by šlo, až na ten problém, že to hlásí Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /3w/wz.cz/w/wimstr/komentare.php on line 15


co s tim nevim :D..
speacker
Profil *
tak sem dej kód, btw proč tam dáváš mysql_num_rows?
wimstr
Profil
btw proč tam dáváš mysql_num_rows?
jak už sem uvedl, je to z intervalu




<?

mysql_connect("mysql.webzdarma.cz", "jmeno", "heslo");
mysql_select_db("wimstr");

function komentare_list($id){

$s = mysql_query("Select predmet, ncas, email, meno from komentare where idclanku = $id order by ncas desc");

echo "<table><tr><td height=20>&nbsp;</td></tr></table>";

echo "<div align=center><table bgcolor=black width=100% cellpadding=1 cellspacing=1 border=0>";

echo "<tr><td height=16 bgcolor=#cccccc width=100% class=menuheader>&nbsp; Komentáře (";
echo mysql_num_rows($s);
echo ")</td></tr>";

if(mysql_num_rows($s)!=0):
while($e = mysql_fetch_array($s)):

echo "<tr><td bgcolor=#e5e5e5 class=menu>";
echo "<a href='mailto:";
echo $e["email"];
echo "'>";
echo $e["meno"];
echo "</a> (";
echo date("d.m.Y", $e["ncas"]);
echo ") : <b>";
echo $e["predmet"];
echo "</b>";
echo "</tr></td>";

endwhile;
endif;
echo "<tr><td height=16 bgcolor=#cccccc width=100% class=menuheader><center><a href='komentare_ukaz.php?id=";
echo $id;
echo "'>Ukáž komentáre</a>&nbsp &nbsp; &nbsp; &nbsp; <a href='komentar_pridaj.php?id=";
echo $id;
echo "'>Pridaj komentár</a>";

echo "</td></tr>";

echo "</table></div>";
}


function komentare($id){

$s = mysql_query("Select * from komentare where idclanku = $id order by ncas desc");

echo "<table><tr><td height=20>&nbsp;</td></tr></table>";

echo "<div align=center><table bgcolor=black width=100% cellpadding=1 cellspacing=1 border=0>";

echo "<tr><td height=16 bgcolor=#cccccc width=100% class=menuheader>&nbsp;Komentáre k článku</td></tr>";

if(mysql_num_rows($s)!=0):
while($e = mysql_fetch_array($s)):

echo "<tr><td bgcolor=#e5e5e5 class=menu>";
echo "<a href='mailto:";
echo $e["email"];
echo "'>";
echo $e["meno"];
echo "</a> - <a href='";
echo $e["url"];
echo "'>";
echo $e["url"];
echo "</a> (";
echo date("d.m.Y", $e["ncas"]);
echo ") : <b>";
echo $e["predmet"];
echo "</b><br><br>";
echo $e["text"];
echo "</tr></td>";

endwhile;
endif;
echo "<tr><td height=16 bgcolor=#cccccc width=100% class=menuheader><center><a href='javascript:history.go(-1);'>Zpět na článek</a>&nbsp &nbsp; &nbsp; &nbsp; <a href='komentar_pridaj.php?id=";
echo $id;
echo "'>Přidat komentář</a>";

echo "</td></tr>";

echo "</table></div>";
}

?>

Joker
Profil
Za:
$s = mysql_query("Select predmet, ncas, email, meno from komentare where idclanku = $id order by ncas desc");

přidejte:
if(!$s) die("Chyba SQL: ".mysql_error());
wimstr
Profil
No, tak to hlásí zase něco jineho
Chyba SQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by ncas desc' at line 1
Joker
Profil
wimstr
Právě, napřed je potřeba zjistit, jakou chybu to vlastně hodí ;-)

Takže máte chybu někde v tom SQL dotazu... tak to místo ještě pozměňte takhle:

$sql = "Select predmet, ncas, email, meno from komentare where idclanku = $id order by ncas desc"
$s = mysql_query($sql);

if(!$s) die("Chyba SQL!<br>Dotaz: $sql<br>Chyba:".mysql_error());

edit:
Prozatím je můj tip, že v nějakém případě pošlete prázdné ID a ten dotaz pak vypadá:
Select predmet, ncas, email, meno from komentare where idclanku = order by ncas desc
což právě hodí tu chybu. Zkuste tam dát to co jsem napsal výše, uvidíme, co je špatně.
wimstr
Profil
Tak sem to vyměnil a zas tohle
Chyba SQL!
Dotaz: Select predmet, ncas, email, meno from komentare where idclanku = order by ncas desc
Chyba:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by ncas desc' at line 1
krteczek
Profil
no takže klasický problém s globálními proměnnými: $id naraď (int)$_GET['id'] a mělo by to fachat
krteczek
krteczek
Profil
teda takto: Fungovat to bude, ale stejně bys měl ověřit jestli to id je celé kladné číslo větší než 0. takže nějak takto:


if((!empty($_GET['id'])) && ((int)$_GET['id'] > 0))
{
//ted můžeš testovat ostatní věci,

ještě lepší je doplnit testovaní o dotaz na db, jestli takový článek skutečně existuje, a jsou u něj povoleny komentáře
krteczek
Joker
Profil
wimstr
No, to je přesně to co jsem tipoval. Řešení už popsal krteczek.
Joker
Profil
Jen ještě dodám, že tímhle pravidlem se můžete řídit obecně:

mysql_query vrací false v případě chyby, takže hodnotu false byste měl detekovat a reagovat na ní, nejspíš ukončením skriptu (většinou se nic rozumnějšího dělat nedá).
Příklad:
$vysledek = mysql_query($sql);
if(!$vysledek) die("Chyba komunikace s db!");

Při vývoji aplikace je vhodný postup si nechat vypsat odeslaný SQL dotaz a chybu SQL.
Příklad:
$vysledek = mysql_query($sql);
if(!$vysledek) die("Chyba SQL!<br>Dotaz: $sql<br>Chyba:".mysql_error());

Pro ostrý provoz aplikace není z pohledu bezpečnosti moc vhodné tam tyhle údaje nechávat, případný útočník by je mohl zneužít k napadení webu.
krteczek
Profil
Joker: proto je lepší si napsat svou funkci a tu volat:

//ve $id je ověřená platná hodnota ze $_GET['id']
$dotaz = "SELECT * FROM " . Tabulka_clanky . " WHERE id=" . $id . " ORDER BY id DESC";
if($v = mysql_query($dotaz, $spojeni))
{
$p = mysql_num_rows($v);
...
}
else
{
echo chyba_db($dotaz);
exit;
}


A samotná funkce chyba_db() může obsahovat spoustu fičurekale minimálně by tam měla být možnost nastavit režim výpisu

<?php
function chyba_db($dotaz)
{
/****************************
$hlasky co vsechno se ma vypsat na stranku
false = zákaz výpisu podrobností (odesle je na mail, ulozi do souboru, ...),
true = vypsat všechny podrobnosti na stránku
****************************/
$hlasky = true;
$email = "admin@server.net";
$predmet = "chyba pri databazovem dotaze na " . $_SERVER['SERVER_NAME'];
$sprava = "Litujeme, došlo k chybě při zpracování db dotazu, na odstanění se usilovně pracuje.";
//zjistime vsechno mozne a zapiseme do promenne
$podrobne = "text db dotazu:\n" . $dotaz;
$podrobne .= "\n\nChybová hláška databáze: " . mysql_error();
//dolnis si dalsi veci, treba obsahy vsech promenných, ip adresu, script., číslo bot, podprsenky... ;-) zaprostě všechno co tě jímá a jsi schopný zjistit
if($hlasky === true)
{
mail($email, $predmet, $podrobne);
$sprava .= "\n" . $podrobne;
}
else
{
mail($email, $predmet, $podrobne);
}
return $sprava;
}

je to jen nástin ale určitě to bude lepší, než přepisovat všechny skripty při ostrém nasazení... vždycky ti to zprávu na mail, když budou povolené tak je navíc i vypíše na stránku
mužeš to ukládat do souboru atd..
krteczek
wimstr
Profil
krteczech
a je jedno, kam to umístím aby to fungovalo
wimstr
Profil
hůásít to tohle,
Fatal error: Call to undefined function: komentare_list() in /3w/wz.cz/w/wimstr/miranda_im.php on line 108

kód té části je:
<?
require "komentare.php";
komentare_list($id); ?>
Joker
Profil
krteczek
Jo, to je takové vymakanější řešení, ale často stačí
if(!$vysledek) die($hlaska);
kde nakonec hláška může být i kompletní HTML kód. No a když se na nějakém místě objeví problém, tak se na tom místě prostě nahradí die($hlaska); za nějaký bližší výpis a hned je jasno.
Ono pokud systém používá pro komunikaci s databází třídu, může to zařídit i ta třída, ale to už jsme někde mimo téma

wimstr
Ta chyba znamená, že není definovaná funkce komentare_list()
Jestli jí máte v tom souboru a includujete správný soubor, tak je to docela zvláštní...
Toto téma je uzamčeno. Odpověď nelze zaslat.