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.

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: