Autor Zpráva
Ladiscz
Profil
Dobrý den,
prosím, potřeboval bych poradit ohledně vytvoření tabulky na webových stránkách...

Jde o to, že potřebuji tabulku pro plánovač akcí, kde v prvním sloupci bude ID akce a od toho se bude vše odvíjet. V databázi mám dvě tabulky, v jedné vypsané ID, typ akce, datum akce atp., v druhé stejné ID, jméno účastníka a jeho roli...
Rád bych tabulku vytvořil tak, aby se mi akce + účastníci řadili vpodstatě k sobě, teď mi to totiž dělá to, že to vypíše všechny akce v tabulce nahoru a teprve po všech vypsaných akcích to vypíše účastníky.

Předem děkuji za radu.

(PS: omlouvám se za složitý skript, ale opravdu tomu nerozumím a všechno víceméně okoukávám odjinud a jen překopávám skripty metodou pokus/omyl)

function ShowNews()
  {         
    global $Config, $db;
    
    $db->select_db($Config['Database']['Database']);
    
    if(array_key_exists('raidy', $_GET)) $Filter = ' WHERE `equip` = '.$_GET['equip'];
      else $Filter = '';
    
    $this->db->select_db($Config['Database']['Database']);
    $limit = 5;
    
    if(array_key_exists('page_index', $_GET)) $Page = $_GET['page_index'];
      else $Page = 0; 
    
    $DbResult = $db->query('SELECT COUNT(*) FROM `raidy`' .$Filter);
    $DbRow = $DbResult->fetch_row();
    $TotalCount = $DbRow[0];
      
      $Output = '<table class="QuickInfoTable">'.     
          '<tr>'. 
            '<td width="35"><b>ID</b></td>'.
            '<td width="125"><b>Datum</b></td>'.
            '<td width="50"><b>Čas</b></td>'.
            '<td width="170"><b>Raid</b></td>'.
            '<td width="80"><b>Raid Leader</b></td>'.
            '<td width="110"><b>Požadovaný EQ</b></td>'.
          '</tr>'.         
          '</table>';
    
    $DbResult = $db->query('SELECT * FROM `raidy` WHERE `id`=`id` ORDER BY `rok` DESC, `mesic` DESC, `den` DESC, `hod` ASC, `min` ASC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
    while($raidy = $DbResult->fetch_assoc())    
    {
      $text = str_replace('&', '&amp;', $raidy['text']);
      $leader = str_replace('&', '&amp;', $raidy['leader']);
      $raid = str_replace('&', '&amp;', $raidy['raid']);  
      $id = str_replace('&', '&amp;', $raidy['id']);
      $equip = str_replace('&', '&amp;', $raidy['equip']); 
      $rok = str_replace('&', '&amp;', $raidy['rok']);  
      $mesic = str_replace('&', '&amp;', $raidy['mesic']);
      $den = str_replace('&', '&amp;', $raidy['den']);
      $denvtydnu = str_replace('&', '&amp;', $raidy['denvtydnu']);  
      $hod = str_replace('&', '&amp;', $raidy['hod']);
      $min = str_replace('&', '&amp;', $raidy['min']);
      $Output .= '<table class="QuickInfoTable">'.     
          '<tr>'. 
            '<td width="35"><font color="#99AACC">'.$id.'</font></td>'.
            '<td width="125"><font color="#99AACC">'.$denvtydnu.', '.$den.'.'.$mesic.'.'.$rok.'</font></td>'.
            '<td width="50"><font color="#99AACC">'.$hod.':'.$min.'</font></td>'.
            '<td width="170"><font color="#99AACC">'.$raid.'</font></td>'.
            '<td width="80"><font color="#99AACC">'.$leader.'</font></td>'.
            '<td width="110"><font color="#99AACC">'.$equip.'</font></td>'.
          '</tr>'.      
          '</table>';
    }
    
    global $Config, $db;
          
    $db->select_db($Config['Database']['Database']);      
    $DbResult = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick`,`ucast`.`role`, `raidy`.`id` AS `IDR` FROM `ucast`,`raidy` LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
    while($ucast = $DbResult->fetch_assoc())    
    {
      $guid = str_replace('&', '&amp;', $ucast['IDU']);
      $nick = str_replace('&', '&amp;', $ucast['nick']);
      $role = str_replace('&', '&amp;', $ucast['role']); 
      $Output .= '<table class="QuickInfoTable">'. 
          '<tr>'. 
            '<td width="35"><font color="#99AACC">'.$guid.'</font></td>'.
            '<td width="125"><font color="#99AACC">'.$nick.'</font></td>'.
            '<td width="50"><font color="#99AACC">'.$role.'</font></td>'.
          '</tr>'.        
          '</table>';
    }
    
    $Output .= '<div class="Center">'.$this->PageList('page_index', $Page, $TotalCount, $Config['Web']['TableRowPerPage'], 10).'</div>';

    return($Output);
  }

  
Rellik
Profil
No řeknu to asi tak: Do toho while kde vypisuješ ty akce, dej další While který bude vypisovat účastníky podle ID z toho prvního cyklu..
<?php
while (){ 
			// výpis z tabulky s akcemi kde získáš ID akce
			
			while() { 
					// výpis z tabulky s účastníky WHERE id= získané z předchozího while
					}
					
			}
}
?>

Aspoň tak nějak sem to řešil já při něčem podobném...
Ladiscz
Profil
No upravil jsem to přibližně tak, jak jsem snad měl, ale teď mi to vypisuje chybu:
Fatal error: Call to a member function fetch_assoc() on a non-object in C:\Program Files\EasyPHP-5.3.2i\www\test\inc\html.php on line 27

$DbResult = $db->query('SELECT * FROM `raidy` ORDER BY `rok` DESC, `mesic` DESC, `den` DESC, `hod` ASC, `min` ASC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
    while($raidy = $DbResult->fetch_assoc())    
    {
      $text = str_replace('&', '&amp;', $raidy['text']);
      $leader = str_replace('&', '&amp;', $raidy['leader']);
      $raid = str_replace('&', '&amp;', $raidy['raid']);  
      $id = str_replace('&', '&amp;', $raidy['id']);
      $equip = str_replace('&', '&amp;', $raidy['equip']); 
      $rok = str_replace('&', '&amp;', $raidy['rok']);  
      $mesic = str_replace('&', '&amp;', $raidy['mesic']);
      $den = str_replace('&', '&amp;', $raidy['den']);
      $denvtydnu = str_replace('&', '&amp;', $raidy['denvtydnu']);  
      $hod = str_replace('&', '&amp;', $raidy['hod']);
      $min = str_replace('&', '&amp;', $raidy['min']);
      $Output .= '<table class="QuickInfoTable">'.     
          '<tr>'. 
            '<td width="35"><font color="#99AACC">'.$id.'</font></td>'.
            '<td width="125"><font color="#99AACC">'.$denvtydnu.', '.$den.'.'.$mesic.'.'.$rok.'</font></td>'.
            '<td width="50"><font color="#99AACC">'.$hod.':'.$min.'</font></td>'.
            '<td width="170"><font color="#99AACC">'.$raid.'</font></td>'.
            '<td width="80"><font color="#99AACC">'.$leader.'</font></td>'.
            '<td width="110"><font color="#99AACC">'.$equip.'</font></td>'.
          '</tr>'.      
          '</table>';
               
      $DbResult = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`,`ucast`.`role` AS `ROLE`, `raidy`.`id` AS `IDR` FROM `ucast`, `raidy` WHERE `IDU`=`IDR` LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
      while($ucast = $DbResult->fetch_assoc())    
      {
        $guid = str_replace('&', '&amp;', $ucast['IDU']);
        $nick = str_replace('&', '&amp;', $ucast['NICK']);
        $role = str_replace('&', '&amp;', $ucast['ROLE']); 
        $Output .= '<table class="QuickInfoTable">'. 
            '<tr>'. 
              '<td width="35"><font color="#99AACC">'.$guid.'</font></td>'.
              '<td width="125"><font color="#99AACC">'.$nick.'</font></td>'.
              '<td width="50"><font color="#99AACC">'.$role.'</font></td>'.
            '</tr>'.        
            '</table>';    
      }
    }
Tori
Profil
Ladiscz:
Na ř.26 si přepisujete proměnnou $DbResult z prvního dotazu.
Ladiscz
Profil
Tori:
Bohužel nevím, jak přesně to mám přepsat..
Pokud tam přepíšu na
$DbResult2 = $db2->query...

tak mi to na tomtýž řádku vypíše jinou chybu:

Fatal error: Call to a member function select_db() on a non-object in C:\Program Files\EasyPHP-5.3.2i\www\test\inc\html.php on line 253
Tori
Profil
ř.26+27:
 $DbResult2 = $db->query(....);
      while($ucast = $DbResult2->fetch_assoc())  
Šlo jen o ten DbResult.
Ladiscz
Profil
Už to jde, díky...
Nicméně musel jsem smazat z toho posledního SELECTU WHERE `IDU`=`IDR` a v tabulce teď mám správně hlavičku, pod tím název akce atp., ale pod to mi to vypíše všechny účastníky nezávisle na tom, k jakému ID je řadím...

$DbResult = $db->query('SELECT COUNT(*) FROM `raidy`' .$Filter);
    $DbRow = $DbResult->fetch_row();
    $TotalCount = $DbRow[0];    
      $Output = '<table class="QuickInfoTable">'.     
          '<tr>'. 
            '<td width="35"><b>ID</b></td>'.
            '<td width="125"><b>Datum</b></td>'.
            '<td width="50"><b>Čas</b></td>'.
            '<td width="170"><b>Raid</b></td>'.
            '<td width="80"><b>Raid Leader</b></td>'.
            '<td width="110"><b>Požadovaný EQ</b></td>'.
          '</tr>'.         
          '</table>';
    
    $DbResult = $db->query('SELECT * FROM `raidy` ORDER BY `rok` DESC, `mesic` DESC, `den` DESC, `hod` ASC, `min` ASC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
    while($raidy = $DbResult->fetch_assoc())    
    {
      $text = str_replace('&', '&amp;', $raidy['text']);
      $leader = str_replace('&', '&amp;', $raidy['leader']);
      $raid = str_replace('&', '&amp;', $raidy['raid']);  
      $id = str_replace('&', '&amp;', $raidy['id']);
      $equip = str_replace('&', '&amp;', $raidy['equip']); 
      $rok = str_replace('&', '&amp;', $raidy['rok']);  
      $mesic = str_replace('&', '&amp;', $raidy['mesic']);
      $den = str_replace('&', '&amp;', $raidy['den']);
      $denvtydnu = str_replace('&', '&amp;', $raidy['denvtydnu']);  
      $hod = str_replace('&', '&amp;', $raidy['hod']);
      $min = str_replace('&', '&amp;', $raidy['min']);
      $Output .= '<table class="QuickInfoTable">'.     
          '<tr>'. 
            '<td width="35"><font color="#99AACC">'.$id.'</font></td>'.
            '<td width="125"><font color="#99AACC">'.$denvtydnu.', '.$den.'.'.$mesic.'.'.$rok.'</font></td>'.
            '<td width="50"><font color="#99AACC">'.$hod.':'.$min.'</font></td>'.
            '<td width="170"><font color="#99AACC">'.$raid.'</font></td>'.
            '<td width="80"><font color="#99AACC">'.$leader.'</font></td>'.
            '<td width="110"><font color="#99AACC">'.$equip.'</font></td>'.
          '</tr>'.      
          '</table>';
              
      $DbResult2 = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`,`ucast`.`role` AS `ROLE`, `raidy`.`id` AS `IDR` FROM `ucast`, `raidy`  LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
      while($ucast = $DbResult2->fetch_assoc())    
      {
        $guid = str_replace('&', '&amp;', $ucast['IDU']);
        $nick = str_replace('&', '&amp;', $ucast['NICK']);
        $role = str_replace('&', '&amp;', $ucast['ROLE']); 
        $Output .= '<table class="QuickInfoTable">'. 
            '<tr>'. 
              '<td width="35"><font color="#99AACC">'.$guid.'</font></td>'.
              '<td width="125"><font color="#99AACC">'.$nick.'</font></td>'.
              '<td width="50"><font color="#99AACC">'.$role.'</font></td>'.
            '</tr>'.        
            '</table>';    
      }
Rellik
Profil
no vypíše ti to všechno, protože si právě u toho $DbResult2 vymazal to WHERE `IDU`=`IDR` - jen to `IDR' musíš změnit za výpis z té první tabulky - $raidy['IDR']
I když popravdě moc se v tomto zápisu kódu nevyznám.. šlo by to celé udělat o moc jednodušej a přehledněj... No ale pokud se v tom vyznáš a funguje to, tak ten výběr už nějak splácáš...

Zkus ten řádek 40 vypsat takhle:

$DbResult2 = $db->query("SELECT * FROM ucast WHERE  IDU=".$raidy['IDR'].""); // to $raidy['IDR'] přejmenuj podle buňky v tabulce, kde máš uloženo to ID akce
Ladiscz
Profil
Pokud to napíšu jako:
$DbResult2 = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`,`ucast`.`role` AS `ROLE` FROM `ucast` WHERE `IDU`=".$id."  ORDER BY `IDU` DESC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
      while($ucast = $DbResult2->fetch_assoc())   

vyskytne se chyba
Fatal error: Call to a member function fetch_assoc() on a non-object in C:\Program Files\EasyPHP-5.3.2i\www\test\inc\html.php on line 2

Pokud jako:
$DbResult2 = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`,`ucast`.`role` AS `ROLE` FROM `ucast` WHERE `IDU`=".$raidy['IDR']."  ORDER BY `IDU` DESC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
while($ucast = $DbResult2->fetch_assoc())

objeví se:
Parse error: syntax error, unexpected T_STRING in C:\Program Files\EasyPHP-5.3.2i\www\test\inc\html.php on line 1

Omlouvám se, opravdu tomu vůbec nerozumím a myslím, že pokud bych se snažil skript zjednodušit, úplně bych ho znefunkčnil
Tori
Profil
$DbResult2 = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`,`ucast`.`role` AS `ROLE` FROM `ucast` WHERE `IDU`="'.$raidy['IDR'].'"  ORDER BY `IDU` DESC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
Rellik
Profil
Ladiscz:
Pokud jako:
>
1
2
>
$DbResult2 = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`,`ucast`.`role` AS `ROLE` FROM `ucast` WHERE `IDU`=".$raidy['IDR']." ORDER BY `IDU` DESC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);
while($ucast = $DbResult2->fetch_assoc())
>
>
objeví se:
Protože kombinuješ jednoduché uvozovky s dvojitými...
$DbResult2 = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`,`ucast`.`role` AS `ROLE` FROM `ucast` WHERE `IDU`='.$raidy['IDR'].'  ORDER BY `IDU` DESC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);[/i]
> [i]while($ucast = $DbResult2->fetch_assoc())


EDIT: byl sem pomalejší... :)
Ladiscz
Profil
Děkuji, já jsem na to opravdu levej, pro mě to je uvozovka jako uvozovka =o)

Nicméně další chybička:

Fatal error: Call to a member function fetch_assoc() on a non-object in C:\Program Files\EasyPHP-5.3.2i\www\test\inc\html.php on line 254

tedy na řádku
while($ucast = $DbResult2->fetch_assoc()) 

hned pod výše zmiňovaným $DbResult2 ...
Rellik
Profil
Napiš strukturu těch dvou tabulek, něco s tím vymyslíme... ;)
Tori
Profil
Ladiscz:
Sorry, špatně jsem napsala ten dotaz:
$DbResult2 = $db->query('SELECT `ucast`.`guid` AS `IDU`, `ucast`.`nick` AS `NICK`, `ucast`.`role` AS `ROLE` 
FROM `ucast` WHERE `ucast`.`id_akce` = "'.$raidy['IDR'].'"  
ORDER BY `IDU` DESC LIMIT '.($Page * $Config['Web']['TableRowPerPage']).', '.$Config['Web']['TableRowPerPage']);

Přibližně takhle, ALE: Místo označeného id_akce si doplňte název sloupce v tabulce ucast, který se má shodovat se sloupcem id v tabulce akcí. Nenašla jsem, jak přesně se jmenuje.

↑ Pravda, to bude rychlejší.
Ladiscz
Profil
Tabulka raidy:
-id
-raid
-equip
-leader
-text
-den
-mesic
-rok
-hod
-min
-denvtydnu

Tabulka ucast:
-guid (má se shodovat s id v tabulce raidy)
-nick
-role
Ladiscz
Profil
Už mi to jde, když jsem to upravil =o)

Děkuju moc všem za vaše úsilí, teď už to snad zvládnu, jste zlatí =o*

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0