Výpis z databáze
|
14.2.2007 12:58
Kovra
|
Dobrý den,
tvořím web jednoho futsalového klubu. Utkání mám v databázi a rád bych při vypísu utkání docílil toho, že by se mi vypsali všechny kola, ale v následném výpisu :
č.kola
utkání celkem šest na kolo
mezera
atd...
Momentálně to mám tak, že musím na každé kolo udělat jeden dotaz, takže celkem 22 dotazů. A to není moc ideální. Snažím se někde na internetu najít jak to udělat, ale nedaří se mi. Zřejmě to bude pomocí nějakého cyklu, ale já nevím jak tu podmínku vytvořit.
Děkuji za Vaši odpověď.
|
|
|
Re: Výpis z databáze
|
14.2.2007 13:44
Rudolf Svátek
|
Nepovažuji se za odborníka, ale asi nějak takhle?
$sql = "SELECT u.cis_kola FROM `utkani` AS u ORDER BY cis_kola";
$mysql_result=mysql_query($sql);
$num_rows=mysql_num_rows($mysql_result);
if (!$num_rows==0) {
while($row=mysql_fetch_array($mysql_result)){
$cis_kola = $row[0];
echo "č. kola ".$cis_kola;
echo "<br />";
$sql2 = "SELECT u.* FROM `utkani` AS u WHERE cis_kola = $cis_kola ORDER BY utkani";
$mysql_result2=mysql_query($sql2);
$num_rows2=mysql_num_rows($mysql_result2);
if (!$num_rows2==0) {
while($row2=mysql_fetch_array($mysql_result2)){
echo $row[0]." ".$row[1]." ".$row[2]....; //misto tecek dopln pole
echo "<br />";
}
}
}
}
|
|
|
Re: Výpis z databáze
|
14.2.2007 14:10
Kovra
|
A teď se dostávám k tomu, že já prostě nevím jak to do toho kódu vložit.
<tr><td>
<table border="0" cellpadding="0" cellspacing="1" width="100%" class="liga_border">
<tr>
<td width="10%" class="liga_tab_head">è.z.</td>
<td width="32%" class="liga_tab_head">Domácí</td>
<td width="5%" class="liga_tab_head"> </td>
<td width="32%" class="liga_tab_head">Hosté</td>
<td width="14%" class="liga_tab_head" colspan="3">Výsledek</td>
<td width="7%" class="liga_tab_head" colspan="2">Pol</td>
</tr>
<?
$spojeni = MySQL_Connect ("localhost", "fcmikeska8097", "kropa1973");
Do {
if (!$spojeni) break;
MySQL_Select_DB ("fcmikeska8097");
$vysledek = MySQL_Query ("SELECT zapasy.ID, nazev_m1, nazev_m2, s1, s2, sp1, sp2 ".
"FROM zapasy, team1, team2 ".
"WHERE team1.ID=zapasy.m1 And team2.ID=zapasy.m2 And rok=2006 And soutez=1 ".
"ORDER BY zapasy.ID ASC;", $spojeni);
if (!$vysledek) break;
while ($seznam = MySQL_Fetch_Array ($vysledek))
{
if ($seznam[s1] != -1):
{
echo "<tr>";
echo "<td width=\"10%\" class=\"liga_tab_num\">".$seznam[ID]."</td>";
echo "<td width=\"32%\" class=\"liga_tab_muz\">".$seznam[nazev_m1]."</td>";
echo "<td width=\"5%\" class=\"liga_tab_num\">-</td>";
echo "<td width=\"32%\" class=\"liga_tab_muz\">".$seznam[nazev_m2]."</td>";
echo "<td width=\"5%\" class=\"liga_tab_num\">".$seznam[s1]."</td>";
echo "<td width=\"4%\" class=\"liga_tab_num\">:</td>";
echo "<td width=\"5%\" class=\"liga_tab_num\">".$seznam[s2]."</td>";
echo "<td width=\"7%\" class=\"liga_tab_num\">(".$seznam[sp1].":".$seznam[sp2].")</td>";
echo "</tr>";
}
elseif ($seznam[s1] == -1):
{
echo "<tr>";
echo "<td width=\"10%\" class=\"liga_tab_num\">".$seznam[ID]."</td>";
echo "<td width=\"32%\" class=\"liga_tab_muz\">".$seznam[nazev_m1]."</td>";
echo "<td width=\"5%\" class=\"liga_tab_num\">-</td>";
echo "<td width=\"32%\" class=\"liga_tab_muz\">".$seznam[nazev_m2]."</td>";
echo "<td width=\"5%\" class=\"liga_tab_num\">-</td>";
echo "<td width=\"4%\" class=\"liga_tab_num\">:</td>";
echo "<td width=\"5%\" class=\"liga_tab_num\">-</td>";
echo "<td width=\"7%\" class=\"liga_tab_num\">(-:-)</td>";
echo "</tr>";
}
endif;
}
} While (false);
MySQL_Close ($spojeni);
?>
</table>
</td></tr> |
|
|
Re: Výpis z databáze
|
14.2.2007 16:11
Dalibor Smolík
|
Já bych to řešil přes formátování výstupních tabulek. Celkem by byly dva dotazy. První by generoval jednoduchou tabulku, kde by byl uvedeno
číslo kola s proměnnou $cislo_kola, druhý (s jiným názvem dotazu) by byl výstup všech utkání s podmínkou where cislo_kola = $cislo_kola.
Výsledkem by byla tabulka s číslem kola a vnořená tabulka u každé položky čísla kola, kde by byla všechna utkání týkající se právě tohoto čísla kola. |
|
|
Re: Výpis z databáze
|
14.2.2007 16:38
Kovra
|
Jsem začátečník a věru nevím jak to převést do praxe :-( |
|
|
Re: Výpis z databáze
|
14.2.2007 17:42
Dalibor Smolík
|
Nejdříve začátek hlavní tabulky, kde se zobrazí název kola.
echo "<center><font size=5>Seznam expedovaných výrobků<br>v období $od1a.$od2a.$od3a do $do1a.$do2a.$do3a</h3></font></center>";
echo "<TABLE BORDER=0 width=\"100%\" noshade cellspacing=\"0\" cellpadding=\"0\"";
echo "
<TH></TH>
<TH></TH>
</TH>";
while ($row = mysql_fetch_array($sql_result)) {
$cislokola = $row["cislokola"];
echo"
<tr><td colspan=2><hr></td></tr>
<tr>
<TD colspan=2 align=center><small><font size=4>Číslo kola: $cislokola</font></TD>
<TD align=left></TD>
<tr><td>
";
//nyní příjdou informace o zápasech, pole4 je číslo kola
$sql2 = "select pole1, pole2, pole3 from zapasy where pole4 = '$cislokola' ";
$sql_result2 = mysql_query($sql2,$connection) or die
("Nemohu provést dotaz");
echo "<TABLE BORDER=1 width=\"90%\" noshade cellspacing=\"0\" cellpadding=\"0\"";
echo "
<TH>Pole1</TH>
<TH>Pole2</TH>
<TH>Pole3</TH>
";
while ($row2 = mysql_fetch_array($sql_result2)) {
$D1 = $row2["pole1"];
$D2 = $row2["pole2"];
$D3 = $row2["pole3"];
echo"
<tr>
<TD align=left><small>$D1</small></TD>
<TD align=left><small>$D2</small></TD>
<TD align=center><small>$D3</small></TD>
</TR>";
}
echo "</TABLE>"; //KONEC VNORENE TABULKY
echo"</TR>";
}
echo "</TABLE>"; //konec hlavní tabulky |
|
|
Re: Výpis z databáze
|
14.2.2007 17:59
Kovra
|
Zřejmě vám budu připadat jako úplný idiot, ale vůbec se v tom nevyznám. Nevím jak svůj skript upravit. Mám udělaný free hosting na webu profitux.cz. K dispozici mám databázi MySQL na kterou se připojuji přes webové rozhraní.
Url webu je fcmikeska.profitux.cz. |
|
|
Re: Výpis z databáze
|
14.2.2007 18:45
Dalibor Smolík
|
Omlouvám se, chyběl začátek skriptu. Jinak samozřejmě za název
"Seznam výrobků" se dosadí název správný, zůstalo mi to tam :-)
require("../../globals.php") ; // název stroje, uživatele, heslo ..
$connection = mysql_connect($hostName,$userName,$password)
or die ("Nemohu otevřít server");
$db = mysql_select_db("$databaseName", $connection) or die
("Nemohu otevřít vybrat databázi");
$sql = "select cislokola from zapasy";
$sql_result = mysql_query($sql,$connection) or die
("Nemohu provést dotaz");
Nejdříve začátek hlavní tabulky, kde se zobrazí název kola.
echo "<center><font size=5>Seznam zápasů<br>
echo "
<TH></TH>
a nyní pokračuje skript viz minule ...
Předpokládám, že existuje tabulka, do které se zapisují výsledky zápasů.
Případně těch tabulek je víc a lze je spojit na základě společného pole.
Jedním z polí je informace o číslu kola. V prvním dotazu zjišťujeme jen číslo kola (proměnná $cislokola), ve druhém ($sql2) sestavujeme celou tabulku podle potřeby s tím, že výběr (where) se odkáže na příslušné kolo z prvního dotazu.
tzn. .... where cislokola = '$cislokola';
Trochu jsem se zamotal v názvosloví proměnných :-), ale jde o tento princip.
Výsledkem je, že se údaje o zápasech seskupí vždy podle určitého čísla kola. Upravit se to musí ovšem graficky, aby to vypadalo :-) |
|
|
Re: Výpis z databáze
|
15.2.2007 11:58
Kovra
|
Potřeboval bych ještě vědět co je obsahem souboru globals.php. Žádný takový soubor nemám. Jak jste si mohl všimnout připojuji se dotazem přímo ze stránky, kde jsou uvedeny kde se databáze nachází a přihlašovací údaje. |
|
|
Re: Výpis z databáze
|
15.2.2007 12:38
Dalibor Smolík
|
soubor globals.php není moc důležitý :-) je tam jen
$hostName="localhost" ;
$userName="root" ;
$password="heslo" ;
$databaseName = "jmeno_databaze" ;
ale dá se to řešit přímo v skriptu |
|
|
Re: Výpis z databáze
|
15.2.2007 12:27
Kovra
|
Povedlo se, ale až na to, že mi každé kolo vypíše šestkrát. Ani se tomu nedivím, jelikož v tabulce zapasy mam sloupec kolo, kde u vsech sesti zapasu je cislo kola.
Tabulka zapasy ma tyty sloupce:
ID - cislo zapasu napr. 20060101, kde 2006 je rok 01 je cislo kola a 01 cislo zapasu
m1 - muzstvo 1
m2 - muzstvo 2
s1 - skore 1
s2 - skore 2
sp1 - poločas 1
sp2 - polocas 2
b1 - body 1
b2 - body 2
kolo - cislo kola
datum
den
cas
hala
rok
soutez
pozn
|
|
|
Re: Výpis z databáze
|
15.2.2007 12:51
Dalibor Smolík
|
No tak je to úplně jasné. První dotaz:
$sql = "select kolo from zapasy order by kolo";
a v sestavě se objeví číslo kola podle pořadí.
To je hlavní tabulka, bude mít dvě pole, v prvním bude číslo kola,
druhé bude sloužit pro druhý dotaz a sestavu zápasů, které se týkají
toho kola, co je v tom příslušném poli. Takže se číslo kola by mělo
objevit v celkové tabulce vždy jen jednou.
Druhý dotaz zní:
$sql2 = "select ID, m1, m2, s1, s2, sp1, sp2, b1, b2, datum, den, cas, hala, rok, soutez, pozn where kolo = '$kolo'";
Tyhle dotazy lze dosadit do toho skriptu, avšak upozorňuji, že u
druhého dotazu musí být vše jinak pojmenováno, kromě $connection, než u toho prvního!
tj.
$sql_result2 = mysql_query($sql2,$connection) or die
("Nemohu provést dotaz");
while ($row2 = mysql_fetch_array($sql_result2)) {
$D1jina_promenna = $row2["m1"];
a tak dále .. |
|
|
Re: Výpis z databáze
|
16.2.2007 13:26
Kovra
|
Děkuji mnohokrát dílko se povedlo.
Teď potřeboval, aby se mi z výsledků, které mám v tabulce zapasy, vygenerovala tabulka s pořadím, názvem mužstva, počtem zápasů, počtem výher, počtem remíz, počtem porážek, skórem a počtem bodů.
Jak na to? :o) |
|
|
Re: Výpis z databáze
|
16.2.2007 17:59
Dalibor Smolík
|
tohle bych řešil formou dočasné tabulky. Ta by měla sloupce
muzstvo, body, goly, inasovane_goly.
Prvním dotazem bych vložil do ní údaje z tabulky zapasy
insert into zapasy_temp (muzstvo, body, goly, inkasovane_goly) select from zapasy (m1, b1, s1, s2). Druhým dotazem bych to otočil
insert into zapasy_temp (muzstvo, body, goly, inkasovane_goly) select from
zapasy (m2, b2, s2, s1) a výsledkem by byla tabulka, kde by se dalo seskupit podle mužstev, počet bodů, počet gólů a počet inkasovaných gólů.
Pak příkazem order by .. lze na první místo umístit mužstvo s maximální počtem gólů ..
Tenhle skript jsem nedělal, ale tak nějak by to mohlo fungovat ..
Pročtete si problematiku tvorby dočasných tabulek. |
|
|
Re: Výpis z databáze
|
16.2.2007 18:00
Dalibor Smolík
|
pardon .. s maximálním počtem bodů. |
|
|
Re: Výpis z databáze
|
16.2.2007 18:24
Ondřej Čečák
|
tohle bych řešil formou dočasné tabulky.
Vida, neco takoveho se doporucuje? Nas ve skole ucili, ze redundance jsou obecne spatne, nezadouci.
|
|
|
Re: Výpis z databáze
|
16.2.2007 18:31
Dalibor Smolík
|
No jo, nedoporučuje :-). Ale daný úkol podle mého názoru nepředpokládá velký rozsah dat, max. několik set. Navíc omezený příslušnou sportovní sezónou. Svůj účel by to splnilo ..
|
|
|
Re: Výpis z databáze
|
19.2.2007 16:17
Kovra
|
Opět se dílko podařilo. Teď potřebuji udělat číselné pořadí mužstev? |
|
|
Re: Výpis z databáze
|
19.2.2007 19:15
Dalibor Smolík
|
No to je jednoduché:
$poradi = 1;
while ($row = mysql_fetch_array($sql_result)) {
$promenna = $row["promenna"];
$poradix += $poradi;
..
atd
...
echo"<tr><TD>$poradix</TD>
<TD>$promenna</TD>
Výsledkem bude tabulka, kde v prvním sloupci budou čísla 1 ... nekonečno a ve druhém sloupci nějaká proměnná.
Že to šlo i s tou redundací? :-D |
|
|
Re: Výpis z databáze
|
20.2.2007 09:09
Kovra
|
Tak trošku nevím co redundace je :o)
Takhle ten script vypadá:
<?
require("globals.php") ; // název stroje, uživatele, heslo ..
$connection = mysql_connect($hostName,$userName,$password)
or die ("Nemohu otevřít server");
$db = mysql_select_db($databaseName, $connection) or die
("Nemohu otevřít vybrat databázi");
$sql = "TRUNCATE TABLE tab_1liga";
$sql_result = mysql_query($sql,$connection) or die
("Nemohu provést dotaz");
$sql1 = "INSERT INTO tab_1liga
SELECT nazev_m1 As Muzstvo, (Sum(v1) + Sum(r1) + Sum(p1)) AS Zapasy, Sum(v1) As V, Sum(r1) As R, Sum(p1) As P, Sum(s1) As GD, Sum(s2) As GO, ((Sum(v1)*3)+(Sum(r1))) As Body
FROM zapasy, team1
WHERE team1.ID=zapasy.m1 And rok=2006 And soutez=1 And s1<>-1
GROUP BY nazev_m1
ORDER BY Body Desc";
$sql_result1 = mysql_query($sql1,$connection) or die
("Nemohu provést dotaz1");
$sql2 = "INSERT INTO tab_1liga
SELECT nazev_m2 As Muzstvo, (Sum(v2) + Sum(r2) + Sum(p2)) As Zapasy, Sum(v2) As V, Sum(r2) As R, Sum(p2) As P, Sum(s2) As GD, Sum(s1) As GO, ((Sum(v2)*3)+(Sum(r2))) As Body
FROM zapasy, team2
WHERE team2.ID=zapasy.m2 And rok=2006 And soutez=1 And s1<>-1
GROUP BY nazev_m2
ORDER BY Body Desc";
$sql_result2 = mysql_query($sql2,$connection) or die
("Nemohu provést dotaz2");
$sql3 = "SELECT Muzstvo, Sum(Zapasy) As Zapasy, Sum(V) As V, Sum(R) As R, Sum(P) As P, Sum(GD) As GD, Sum(GO) As GO, Sum(Body) As Body
FROM `tab_1liga`
GROUP BY Muzstvo
ORDER BY Body Desc, GD Desc";
$sql_result3 = mysql_query($sql3,$connection) or die
("Nemohu provést dotaz3");
echo "
<table border=0 width=\"100%\" cellspacing=1 cellpadding=0 class=tab_border>
<tr>
<td class=tab_head width=\"5%\">P.</td>
<td class=tab_head width=\"55%\">Muzstvo</td>
<td class=tab_head width=\"5%\">Z</td>
<td class=tab_head width=\"5%\">V</td>
<td class=tab_head width=\"5%\">R</td>
<td class=tab_head width=\"5%\">P</td>
<td class=tab_head width=\"15%\" colspan=3>Skóre</td>
<td class=tab_head width=\"5%\">B</td>
</tr> ";
while ($row3 = mysql_fetch_array($sql_result3))
{
$D1 = $row3["Muzstvo"];
$D2 = $row3["Zapasy"];
$D3 = $row3["GD"];
$D4 = $row3["GO"];
$D5 = $row3["Body"];
$D6 = $row3["V"];
$D7 = $row3["R"];
$D8 = $row3["P"];
echo "
<tr>
<td class=tab_num>.</td>
<td class=tab_muz>".$D1."</td>
<td class=tab_num>".$D2."</td>
<td class=tab_num>".$D6."</td>
<td class=tab_num>".$D7."</td>
<td class=tab_num>".$D8."</td>
<td class=tab_num>".$D3."</td>
<td class=tab_num>:</td>
<td class=tab_num>".$D4."</td>
<td class=tab_num>".$D5."</td>
</tr>";
}
echo "</table>";
?> |
|
|
Re: Výpis z databáze
|
20.2.2007 09:28
Dalibor Smolík
|
No jde o to, že u složitějších dotazů je možné dotaz uložit do dočasné tabulky, jejíž struktura umožní provést další dotaz. Obvykle se tabulka
vytváří přímo ve skriptu (create TEMPORARY table), pak není nutné tuto
tabulku vyprazdňovat zvláštním příkazem, ale váš skript vlastně provádí totéž. Fakt je, že tvorbu dočasným tabulek moc v lásce nemám z důvodu menší přehlednosti skriptu, ale někdy to jinak neumím ...
Teď jsem dával dohromady sestavu ukazující zůstatky látek na skladě,
které se vypočítávaly z počátečních stavů, dodavatelských faktur, dodaného hotového zboží (podle norem spotřeby na každý výrobek) a dosud neuskutečněných nebo i částečně uskutečněných objednávek, řešil jsem to celkem třemi dočasnými tabulkami celý víkend ..výsledek ale vyšel správně |
|
|
Re: Výpis z databáze
|
20.2.2007 09:22
Kovra
|
Vy jste tak trošku hodně moc moje záchrana. Mockrát Vám děkuji za Vaši ochotu pomáhat mi.
Teď přichází na řadu formátování. Zatím jsem nenašel na webu stránku, která by se zabývala formátováním výstupních dat z databáze. Potřeboval bych, aby prvních 8 mužstev a dvě poslední bylo jinak naformátovano (tučný text, jiná pozadí atd.).
Ještě by mě zajímalo, jak zabezpečit aby při rovnosti bodů několika mužstev bylo první to co má nejlepší vzájemný zápas?
Další otázka se týká češtiny. Nezobrazují se mi české znaky při výstupu z databáze. Kódování MySql je UTF8 a na stránkách mám charset=windows-1250. |
|
|
Re: Výpis z databáze
|
20.2.2007 09:56
Dalibor Smolík
|
To formátování sestavy je podle zásad formátování HTML (css, atd.), vtip je v tom, že je možné přerušit výstup sestavy podmínkou php if,
kde lze říci, že pokud pořadové číslo je 1 a 2, bude písmo tučné, v ostatních případech normální a pak bude pokračovat sestava dál. Ale to by bylo na delší výklad :-).
Pořadí mužstev by se dalo asi řešit přidáním dalšího sloupce, ve kterém
by byl ten poměr zápasů (nevím přesně jak) a pak řadit order by pocet_bodu, pomer_zapasu ... tak nějak.
Já mám kódování v mysql defaultní,(nijak nenastavované), v systému iso8859-2. Na stránkách windows-1250. Ve skriptech mám problémy s písmeny š a ž, upravuji dodatečně (ve výstupu z db je to ale OK). |
|
|
Re: Výpis z databáze
|
21.2.2007 11:11
Kovra
|
Čeština už je taky v pohodě.
Teď na to formátování. Nevím přesně jak a kde to do kódu vložit. Doufám, že to někde na webu najdu. Ještě jednou děkuji!! |
|
|
Re: Výpis z databáze
|
21.2.2007 18:16
Dalibor Smolík
|
Zkusím poslat kus kódu. Je to v momentě, kdy jde o výpis sestavy, tj téměř na konci skriptu.
Pokud má $promenna3 hodnotu 1 nebo 2, bude text vypsán tučně, jinak
bude vypsán normálně:
Nyní začíná výpis sestavy
<TD>$promenna1</TD>
<TD>$promenna2</TD>
"; //teď se musí ukončit echo!!
if (($promenna3 == 1)||($promenna3 ==2)) {
//teď pokračuje echo
echo"
<TD><b>$promenna3</b></small></TD>";
}else{
echo"
<TD>$promenna3</TD>";
}
.. a nyní pokračuje sestava, kde se nic už neformátuje ..
echo"
<TD>$promenna4</TD>";
<TD>$promenna5</TD>";
</TR>";
} |
|
|
|
|
KOMENTARZE
|
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
|
Szukanie oprogramowania
|