Používám Wamp 2.4, PHP 5 a Mysql 5.0. Používám jedno forum stažené z netu, které jsem trochu předělal. Původní verze pracovala takto - po rozkliknutí fora, se zobrazí příspěvky. Tzn. první příspěvek je vlastně "topic"/téma, které založil uživatel. Toto teď předělávám, tak, že při vytváření "diskuse" se vlastně nezakládá diskuse, ale nový článek (pod kterým pak budou komentáře). První příspěvek se tedy už nebude ukládat do tabulky posts (příspěvky ve foru), ale jen do topics (témata diskusí).
Teď nevím jestli sem mohu vložit přímo PHP kód, což by pro mě bylo jednodušší než generovat konkrétní SQL příkazy. Snad pochopíte oč mi jde. Jde mi o SQL příkazy, které pracují na prohlížení tématu (diskuse). Se změnou, kterou jsem udělal, se po rozkliknutí diskuse nezobrazí nic a má se zobrazit článek bez komentářů (žádné zatím nebyly přidány).
Původní navržení pro zobrazení diskuse pracuje takto:
Řádek 306
$query = array(
'SELECT' => 'p.id',
'FROM' => 'posts AS p',
'WHERE' => 'p.topic_id='.$id,
'ORDER BY' => 'p.id',
'LIMIT' => $forum_page['start_from'].','.$forum_user['disp_posts']
);
Říká: Vyber všechny záznamy s posts.id, k tomu topicu, který chci prohlédnout... Či-li má vybrat určitý počet komentářů se zadaným topic.id ... Pak se dotaz sestaví a provede. Do pole posts_id se uloží idéčka těch postů.
while ($row = $forum_db->fetch_assoc($result)) {
$posts_id[] = $row['id'];
}
A teď se dostávám k tomu klíčovému s čím potřebuju poradit. Jestliže existuje alespoň jedno idéčko, pak se provede další SQL dotaz:
$query = array(
'SELECT' => 'u.email, u.title, u.url, u.location, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.avatar, u.avatar_width, u.avatar_height, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online',
'FROM' => 'posts AS p',
'JOINS' => array(
array(
'INNER JOIN' => 'users AS u',
'ON' => 'u.id=p.poster_id'
),
array(
'INNER JOIN' => 'groups AS g',
'ON' => 'g.g_id=u.group_id'
),
array(
'LEFT JOIN' => 'online AS o',
'ON' => '(o.user_id=u.id AND o.user_id!=1 AND o.idle=0)'
),
),
'WHERE' => 'p.id IN ('.implode(',', $posts_id).')',
'ORDER BY' => 'p.id'
);
Z tabulky users se vyberou nějaké uživatelské informace jako email, title - název uživatele, avatar.
Z tabulky posts se vybere idéčko příspěvku, poster as username, id odesilatele, message - samotný text příspěvku, datum odeslání.
Z tabulky group se vybere funkce jakou plní uživatel (moderátor, správce, admin, uživatel).
WHERE - to platí pro všechny idečka z daného seznamu.
Napadá vás, jak tento příkaz modifikovat, aby v něm byly zahrnuty také data od uživatele, který napsal článek? Tj. od autora článku.
Opakuji, že původně autor diskuse byl v prvním příspěvku, což teď není, když první příspěvek začíná až od prvního komentujícího uživatele. ID autora už znám.
Jinak na řádku 124, existuje tento SQL příkaz na dohledání informací o topicu, a tam se to dohledává právě podle $id čísla topicu (t.id). ID autora je t.uid as poster_id.
$query = array(
'SELECT' => 't.uid as poster_id, t.subject, t.desc_x, t.article as message, t.hide_smilies, t.posted, t.edited, t.first_post_id, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, u.username',
'FROM' => 'topics AS t',
'JOINS' => array(
array(
'INNER JOIN' => 'forums AS f',
'ON' => 'f.id=t.forum_id'
),
array(
'INNER JOIN' => 'users AS u',
'ON' => 'u.id=t.uid'
),
array(
'LEFT JOIN' => 'forum_perms AS fp',
'ON' => '(fp.forum_id=f.id AND fp.group_id='.$forum_user['g_id'].')'
)
),
'WHERE' => '(fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL'
);