Autor Zpráva
XolyCZ
Profil
Ahoj, mám jeden problém a nevím jak ho vyřešit. Potřeboval bych, aby mi funkce vracela dvě pole return array($games_invited, $game);, které bych mohl následně vypsat. Problém je ale v tom, že nevím jak. Používám foreach a vždycky jsem přes něho vypisoval jenom jedno pole, s dvěma si nevím rady.

$invitations = tournament_invitations();

foreach ($invitations as $invitation){
        echo("
            <h3>" . htmlspecialchars($invitation['game_name']) . "</h3>
            <p>Pozvánka do hry od týmu " . htmlspecialchars($invitation['team']) . "</p>
            <a href='user.php?str=user&stranka=pozvanky  ..............  ' class='tournament_view'>PŘÍJMOUT</a>");
            }
Místo těch teček bych totiž potřeboval poslat několik údajů, ale nevím jak je tam zapsat. Předem díky za radu :)
Keeehi
Profil
XolyCZ:
A co v těch polích je? Z názvu proměnných to nedokážu určit. Nejlepší by byl nějaký příklad.
A mají ty pole mezi sebou nějaký vztah?
Kajman
Profil
Těžko odhadnout z kódu, jak ty dvě věci spolu souvisí.

Tipnul bych, že hledáte buď zápis položky dvojrozměrné pole
$invitation['klic_k_vysledku_ten_funkce'][0]

nebo naplnění více proměnných polem
list($invitations, $game) = tournament_invitations();
XolyCZ
Profil
Ten celý kód co to tahá z databáze je tenhle:
function tournament_invitations(){
    $spojeni = mysqli_connect(...);
    if (!$spojeni)
    die('Spojení s MySQL databází se nezdařilo.'); 
    mysqli_set_charset($spojeni,"utf8");
    $sql = "SELECT game_name_db FROM tournament WHERE game_type='duo' OR game_type='squad'";
    $games_db = mysqli_query($spojeni, $sql, MYSQLI_USE_RESULT);
    while($games_db_array = mysqli_fetch_array($games_db, MYSQLI_ASSOC)){$games[] = $games_db_array;}
    
    foreach($games as $game){
        $game_search=$game['game_name_db'];
        $game_search .="__reg";
        $sql = "SELECT * FROM " . $game_search . " WHERE player_id=" . $_SESSION['Hrac_id_online'] . " AND want_play=0";
        $games_invited_db = mysqli_query($spojeni, $sql, MYSQLI_USE_RESULT);
        while($games_invited_db_array = mysqli_fetch_array($games_invited_db, MYSQLI_ASSOC)){$games_invited[] = $games_invited_db_array;}
    }
    
    return array($games_invited, $game);
    
    mysqli_close($spojeni);
}

Vlastně ten první sql příkaz mi natáhne jméno druhé tabulky, se kterým potom pracuju. Jenomže to pole z toho příkazu používám v tom druhém příkazu a nemůžu tím pádem použít další věci co potřebuju. V té první tabulce je totiž jméno, popis a takové věci.


Jednoduše řečeno, jedná se vždycky o jednu událost, řekněme turnaj. Každý ten turnaj má nějaký popis, kolik tam bude a je lidí a takové a k němu je ještě druhá tabulka, ve které jsou už registrované a kompletní týmy a potom ještě třetí tabulka, ve které jsou týmy, ale nekompletní, co čekají až všichni ti členové týmu potvrdí účast, to je to "want_play", změní se to potom na "1". A já potřebuju vytáhnout všechny ty adresy z první tabulky na třetí a potom ověřit, jestli ten dotyčný má nějaké pozvánky do turnaje, respektive jestli tam má "want_play=0". Pokud jo, vypíšu mu tam ten turnaj.
Kajman
Profil
Dělat pro každý turnaj jinou tabulku je velice špatný návrh. Takto to bude zbytečně komplikované a pomalé.
Některé časteji řešené dotazy pro MySQL - FAQ » Nová tabulka/sloupec pro každý záznam

Připojovat se a odpojovat v každé funkci také není rychlé. Je lepší si $spojeni předat parametrem.

Nyní vracíte všechny pozvánky, ale jen poslední turnaj. Takže si udělejte prázdné pole turnajů s pozvánkou a až pokud nalezente nějakou pozvánku, přidejte např. do $game['invitations'] pole $games_invited (které ale na začátku foreach vyprázdněte, nebo ho plňte přes mysqli_fetch_all místo while cyklu) a $game si dejte do pole turnajů s pozvánkou.

Ale doporučuji celý datový model předělat, čím dřív tím líp. Lépe se Vám bude programovat a stránky budou rychlejší.
XolyCZ
Profil
Kajman:
Dobře tak zkoušel jsem to ještě předělat, ale stejně se v tom začínám ztrácet, tak se musím zeptat někoho zkušenějšího co s tím. Když začnu od začátku, tak teď mám ty tabulky takhle. Mám tabulku tournament, ve které mám zapsané ty základní údaje o turnaji:

game_id je asi jasné, game_name je jméno toho turnaje, které se zobrazje jako nadpis, game_name_db je verze jména turnaje, kterou jsem požíval pro automatické vytváření těch dalších tabulek a zároveň jsem to potom požíval k přístupu do nich. game_max_players bylo pro maximální počet hráčů v tom turnaji, to jsem vypisoval pod nadpis toho turnaje a zároveň tím ověřoval při registraci, jestli není plný, aby tam těch hráčů nebylo více. game_date bylo datum konání, taky jenom výpis jako informace, game_descrtiption ten samý způsob. Teď ty basic_games a finally_games. Ty první hry jsou vlastně normální a ty další jsou jako finále, to tam potřebuju, abych mohl vytvořit počet sloupců na zápis výsledků od hráčů na každou odehranou hru a ve výsledku s nimi počítat. game_process je to jestli turnaj běží, neběží nebo se čeká na výsledky a tak. game_type je typ hry, kdy vlastně SOLO je jako jeden hráč, tím pádem nepotřebuje u sebe mít název týmu, DUO a SQUAD už jo.

Teď přejdu k té druhé tabulce, třeba k té pro ten první řádek z toho screenu.


player_id je ID hráče registrovaného na webu, team je název jeho týmu(kdyby ten turna byl typu SOLO, ten sloupec by tam nebyl) a ty game_X jsou vlastně ty basic a finally games. Ta tabulka se dělá automaticky a bere se jako ta řekněme finální, ve které jsou už ty kompletní týmy, které se počítají do turnaje.

Kdybych počítal ještě tu třetí, tak tam budou asi ty samé týmy, které jsou v režimu nějakého čekání, až všichni ti členové toho týmu potvrdí účast, to je to want_play, přičemž až bude u všech z daného týmu 1, tým se z tama smaže a přesune se do té druhé tabulky. Tady je obrázek:

To je asi vše okolo toho principu co s tím chci dělat. Ve výsledku i mi to přišlo potom složité, protože jsem musel různě tahat věci z jiných tabulek a pořád dokola tam a zpátky. Tak teda se chci zeptat, jestli je tady někdo tak ochotný a pomohl by mi navrhnout něco jednoduššího, s čím by se dalo lépe pracovat.

Jinak Kajman, říkáš parametrem, ale co kolem toho? Nevím úplně co tím myslíš, kde tu proměnnou mám dát a jak se potom zase odpojovat.
Kajman
Profil
Sloupce game_1, game_2, game_3, game_4 jsou také špatně navržené. Univerzálnější je udělat tabulku, kde budou data v potřebném počtu řádku (zde 4). Viz Některé časteji řešené dotazy pro MySQL - FAQ » Musíte pojmenovávat sloupce s indexem (jmeno1, jmeno2, jmeno3, …)

Mrkněte se také na cs.wikipedia.org/wiki/Normalizace_datab%C3%A1ze
XolyCZ
Profil
Kajman:
No pročetl jsem si to, ale stejně si nejsem jistý jak pořádně tu tabulku udělat. Když znám ID turnaje u kterého jsou zapsané ty základní údaje, mám udělat druhou tabulku a tam psát vždycky každého hráče, který se zaregistroval a k němu to ID turnaje + tým, pokud je potřeba? No a ve výsledku co s tím počtem těch her a s tím want_play, tedy s tou pozvánkou...

Jinak není teď zaplacený hosting, tak ty obrázky zmizely, ale tak podle toho popisu kdyžtak si to vyvodíš snad :D Jestli si to aspoň trochu pamatuješ.
Kajman
Profil
Když budete tabulky normalizovat, mohlo by vyjít něco takového.

tabulka hráčů
tabulka týmů
tabulka typů turnajů
tabulka sezón
tabulka turnajů (id turnaje, id typu, id sezóny)
tabulka týmů chtějících hrát turnaj (id turnaje, id týmů, příznak, zda již je kompletní)
tabulka pozvánek od týmů (id týmu zve na id turnaje hráče s tímto id, příznak akceptace)
tabulka pozvánek od hráčů (id hráč se chce připojit na id turnaje k týmu s id, příznak akceptace)
tabulka akceptovaných účastníků turnaje (id turnaje, id týmu, id hráče) (id turnaje, id hráče může být navíc unikátní klíč)
tabulka zápasů v turnaji
tabulka jednotlivých her v zápasu

Hlavní je, že počet tabulek je stále stejný i když bude obsahovat údaje o tisíci turnajů.
XolyCZ
Profil
Kajman:
Tak tohle je úplně jiný návrh než jsem čekal, jde vidět, že se mám ještě hodně co učit. Zkusím to nějak dát dohromady, zatím děkuji moc, kdyžtak se ještě ozvu ��
Kajman
Profil
Zkuste napsat nebo nakreslit svůj návrh. Ve svých potřebách máte jasněji, pak se to dá třeba jen drobně opravit.
XolyCZ
Profil
Tak jsem tady po dlouhé době, když jsem zjistil, že kámoši konečně zprovoznili hosting. Mám ještě teda dotaz. Tabulku hráčů nechám asi jako id, nickname, heslo, email, jaké má výhry a takové věci. Tabulkou týmů myslíš týmy, které jsou kompletní? Jestli jo, tak tam bude asi id turnaje, id týmu a id hráče. Typy turnajů tam bude id typu turnaje, nějaký popis nebo jméno a sezóna bude mít zase id a třeba jméno nebo číslo. Jenom se chci ujistit, jestli jsem to nějak dobře pochopil, akorát to teď musím nějak poskládat.

Ještě mě teda napadá, já budu muset vždycky na určitou stránku vždycky zjistit id turnaje, to asi z adresy stránky a potom vždycky sáhnot několikrát do databáze a do různých tabulek, abych si vytáhl všechno co potřebuju a potom popřípadě zapsal. A teď je otázka jak to všechno dát do nějaké proměnné, aby se to dalo potom jednoduše použít. Nevím jak je to v tomhle případě s polem, asi bych potom musel vědět jaký index pole co v sobě má mít nebo tak něco. Nevím jestli na to jdu úplně dobře, tak bych potřeboval poradit s nějakým postupem, ostatně kvůli totomu jsem tenhle topic vlastně založil. Uděláš mi prosím tě nějaký jednoduchý příklad nebo mám nějak využít to co ji napsat v [#5]?

Ještě s tím odpojování a připojováním databáze. Říkáš pomocí parametru, to chápu, ale co kolem toho?

Díky moc :)
XolyCZ
Profil
Teď se na to dívám ještě znova a pro kompletní týmy jsi napsal tabulku akceptovaných účastníku turnaje, nevím proč mi to nedošlo předtím. Teď úplně nevím jak má být teda myšlená ta tabulka týmů. Bude tam jenom id týmu, jméno týmu a k tomu id toho turnaje? Aby ty názvy týmů byly oddělené na každy turnaj.
Keeehi
Profil
XolyCZ:
Bude tam jenom id týmu, jméno týmu a k tomu id toho turnaje?
To záleží na tvém návrhu. Pokud to chceš tak že když stejní hráči budou chtít hrát v dalším turnaji, tak si musejí znovu vytvořit tým (se stejným nebo rozdílným jménem, na tom nezáleží) pak ano.
Pokud by jsi však chtěl to udělat tak, že když už si hráči tým vytvoří tak ho mohou použít i v dalších turnajích (tedy kamarádi co hrají spolu si nemusí stále dokola zakládat ten samý tým) pak ti stačí id týmu a jeho jméno. Na spojení týmu a turnaje bude sloužit samostatná tabulka (id_týmu, id_turnaje) jelikož pak jde o vazbu n:m.

Doporučoval bych tu druhou variantu. Protože pokud by jsi chtěl pak dělat statistiku pro týmy a přitom zvolil první variantu, tak identifikátorem týmu by byly jen jeho členové a počítalo by se to opravdu obtížně.
XolyCZ
Profil
Keeehi:
No já si myslím ale, že zrovna v tomhle případě se ti hráči budou možná občas měnit, takže je otázka jak to udělat. Buď nechat vždycky jednoho z hráčů udělat tým, který by se potom dal upravovat(přidávat, vyhazovat členy) nebo to udělat konkrétně na jeden turnaj. Jestli budu dělat nějakou statistiku to nevím, ale třeba k tomu někdy dojde. Takže mě napadá asi řešení, že by se udělal jeden tým s omezeným počtem hráčů, dejme tomu 10, ikdyž i to je možná moc a s tím by hráči pracovali. Každý by mohl být pouze v jednom týmu, pro přestup by ho musel nejdříve opustit. K tomu by se hodilo ještě asi nějaké časové omezení, řekněme že třeba 14 dní a v té době by tým nemohl vyměnit. Tím pádem by se to ale asi muselo navrhnout tak, aby to mělo nějakou historii, tím mám namysli třeba ty statistiky, když tam nějaký hráč byl, potom odešel, aby tam měl záznam co tam vlastně udělal. Další věc je registrace do těch turnajů. Nevím teď jestli jsi mi psal i na jinačí dotazy na tomto fóru ohledně totoho, ale mám takový pocit, že jsi mi právě psal něco kolem vybírání hráčů ze celectu ve formu. Tohle je teď už dobrá myšlenka, protože jsem trochu popřemýšlel nad tím jak to teda chci udělat. K tomuhle by asi nebyl teda potřebný ani nějaký našeptávač, protože bych vytáhl těch 10 lidí z toho týmu a dal mu na výběr kterého tam chce dát. Nějaký našeptávač by se ale hodil k tomu pozívání hráčů do týmu jako takového, protože těch hráčů tam budou tisíce a než by projel celý ten select, asi by mu to trvalo dost dlouho. Nevíš o nečem jak by se to dalo udělat? Tipuju že to bude pracovat s nějakým scriptem. Teď uvažuju jestli jsem napsal všechno co jsem chtěl, ale asi jo.


EDIT: Tak nebyl jsi to ty, ale princip asi chápeš.


EDIT: Vlastně ta historie by mohla být v té tabulce jednotliých zápasů, když by každý ten hráč tam měl k sobě id turnaje a to co udělal. Takže vlastně tabulka týmy by obsahovala id týmu, id hráče a jméno týmu. ID týmu by se přičítalo s každým novým názvem týmu..to bych ale musel udělat já v sql tím, že bych zjistil jestli už tam ten tým je a když ne, tak ho vytvořit a k poslednímu ID přičíst 1? Nebo si to ta databáze umí udělat i sama? Nevím jak všechny ty klíče úplně do detailu fungují.

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