Database Explorer – Where – Více podmínek

DodiseK
Člen | 56
+
0
-

Zdravím, snažím se vyřešit jedem problém. Mám ticket systém a rád bych udělal „Automatické přiřazování“…
Jedna věc je, že první podmínka (Hodnost $rank) nedělá to, co má… no a ta „podmínka“ ve where mi vyhodí chybu:

if ($rank = 'OWNER') {
    $this->template->issues = $this->database->table('issues')
        ->where('server = ?', 'Technická chyba', 'Žádost o spolupráci')
        ->order('id DESC')
        ->limit(1000);
}if ($rank = 'HELPER'){
    $this->template->issues = $this->database->table('issues')
        ->where('server = ?', 'Nahlášení hackera', 'Cross Teaming')
        ->order('id DESC')
        ->limit(1000);
}

Tento kód mi vyhodí chybu: Argument count does not match placeholder count
Nevíte, co s tím?

Mysteria
Člen | 797
+
0
-

Máš tam jenom jeden otazník a předáváš další dva parametry, tzn. ten druhý se nám kam dosadit. Takže pokud má být ta podmínka nebo, tak to musíš upravit třeba na ->where('server = ? OR server = ?', 'Technická chyba', 'Žádost o spolupráci') nebo ->where('server IN (?)', ['Technická chyba', 'Žádost o spolupráci']).

DodiseK
Člen | 56
+
0
-

Děkuju, jenom, nevíš ještě proč nefunguje ten if ($rank = 'DEV') { ?

F.Vesely
Člen | 368
+
+2
-

Máš v té podímnce jen jedno rovnítko.

DodiseK
Člen | 56
+
0
-

Když dopíši druhé rovnítko tak mi pak hodí error

DodiseK
Člen | 56
+
0
-

Error: Undefined variable: issues
Řádek: foreach ($issues as $issue) {

DodiseK
Člen | 56
+
0
-

Akorát ten řádek již není v presenteru, ale přímo v souboru default.latte

F.Vesely
Člen | 368
+
0
-

Což znamená, že nemáš nastavenou proměnou $issues v šabloně. Asi $rank nevyhovoval ani jedné podmínce a proto se ti ani jedna neprovedla.

DodiseK
Člen | 56
+
0
-

Celá ta funkce vypadá takto:

public function renderDefault(): void
{
    $user = $this->getUser()->getIdentity()->realname;
    $rank = $this->database->table('ranksystem')
        ->where('name = ?', $user)
        ->fetchField('rank');

    if (!$this->getUser()->isLoggedIn()) {
        $this->redirect('Sign:in');
    }
    if ($rank == "ZK.HELPER") {
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }if ($rank == "HELPER"){
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }if ($rank == "E.HELPER"){
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }if ($rank == "HL.HELPER"){
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Stížnost na H-Team' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }if ($rank == "HL.BUILDER"){
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Stížnost na B-Team' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }if ($rank == "DEV"){
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Technická chyba' , 'Návrh na zlepšení' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }if ($rank == "VEDENÍ"){
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Stížnost na H-Team' , 'Stížnost na B-Team' , 'Technická chyba' , 'Návrh na zlepšení' , 'Problém s VIP' , 'Žádost o spolupráci' , 'Stížnost na Vedení' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }if ($rank == "MAJITEL"){
        $this->template->issues = $this->database->table('issues')
            ->where('server IN (?)', ['Nahlášení hackera' , 'Cross Teaming' , 'Reklama' , 'Nevhodný slovník' , 'Trest neprávem' , 'Stížnost na H-Team' , 'Stížnost na B-Team' , 'Technická chyba' , 'Návrh na zlepšení' , 'Problém s VIP' , 'Žádost o spolupráci' , 'Stížnost na Vedení' , 'Jiné'])
            ->order('id DESC')
            ->limit(1000);
    }
}
F.Vesely
Člen | 368
+
0
-

No tak to znamená, že v $rank je ještě něco jiného než ty předpokládáš. Hoď si tam nějakej dump, abys viděl, co v té proměnné máš.

DodiseK
Člen | 56
+
0
-

A jak tam mám hodit ten dump? Promiň, že se ptám, ale nikdy jsem to nedělal…

DodiseK
Člen | 56
+
0
-

Tak mi to vyhodí přesně to, co potřebuji

DodiseK
Člen | 56
+
0
-

Tj. název toho ranku (skupiny)

DodiseK
Člen | 56
+
0
-

Teď mě tak napadá, nemůže to být tím, že se v databázi nenachází ta požadovaná hodnota? Jako např. MAJITEL if ($rank == "MAJITEL")

DodiseK
Člen | 56
+
0
-

Ovšem, bylo to přesně kvůli tomu, problém jsem vyřešil přidáním této podmínky:

}else{
    $this->template->issues = $this->database->table('issues')
        ->where('server IN (?)', [''])
        ->order('id DESC')
        ->limit(1000);
}
F.Vesely
Člen | 368
+
+1
-

Však jsem ti to celou dobu psal, že tam je něco jiného. :)

DodiseK
Člen | 56
+
0
-

Ještě mě napadá jeden problém.
Rád bych vypsal aktuální rank uživatele, který napsal ticket. Akorát to nechci vypisovat přímo z databáze.
Asi bude lepší to vysvětlit: Já jsem uživatel, který má hodnost „VIP“ a napíšu ticket.
V ticketu bych rád zobrazoval hodnost toho daného uživatele. Ale nechci, aby se to zapsalo do databáze po vložení ticketu. Jednoduše jde o to, aby se ta hodnost v ticketu po změně hodnosti v určité tabulce v databázi obnovila a nastavila na jeho aktuální hodnost.
Snažil jsem se to vyřešit nějak takto:
Presenter:

$issuename = $this->template->issues = $this->database->table('issues')
    ->fetchField('autor');

$this->template->userrank = $this->database->table('ranksystem')
    ->where('name = ?', $issuename);

default.latte:

	<span class="badge rank-{foreach $userrank as $ura}{$ura->style} mr-1">{$ura->rank}{/foreach}</span>

Problém je ten, že to nastaví pro všechny ticketu hodnost jednoho uživatele bez ohledu na ostatní.

Editoval DodiseK (25. 3. 2020 0:24)

Kamil Valenta
Člen | 758
+
0
-

Ten redirect v renderu asi nebude úplně fungovat dle očekávání. Dej si to třeba do actiony.

Do $issuename ukládáš právě jednoho autora první issue, na kterou v tabulce issues narazíš. Pominu, že proměnná issuename má zavádějící jméno. Pak vytáhneš userrank podle jména toho jednoho autora.
Při generování SPANu pak v cyklu zavíráš html tag, takže můžeš získat něco jako:

<span class="badge rank-style1 mr-1">100style2 mr-1">200</span>
DodiseK
Člen | 56
+
0
-

Omlouvám se, ale trošku jsem nepochopil…

DodiseK
Člen | 56
+
0
-

Takže já jakoby nebudu brát ohled na to, co mám v presenteru a v default.latte udělám něco takového?

<span class="badge rank-Hráč mr-1>Majitel mr-1">200</span>
DodiseK
Člen | 56
+
0
-

Bohužel, snažím se vymyslet způsob jakým by to mohlo fungovat, ale vždy bez výsledku…
Doplnění: Nemůže to být tím, že ta daná tabulka nemá primární klíč?

Editoval DodiseK (25. 3. 2020 17:08)

David Matějka
Moderator | 6445
+
0
-

ano, muze. spravne primarni a cizi klice jsou pro beh NDB explorer dulezite

DodiseK
Člen | 56
+
0
-

Takže v mém případě, mám tabulku ranksystem, ve které mám: id, name, rank, style … a tabulku issues, ve které zase:id ,autor, title, server, content, stav, created_at, prirazen_nick, prirazen_rank, prirazen_style, rank, style… aby to teda fungovalo, musím nastavit primární klíč v tabulce issues pro name v tabulce rank system a autor v tabulce issues ?

David Matějka
Moderator | 6445
+
0
-

mít v tabulce primární klíče je vždy důležité. jestli to pak začne fungovat, to nevím – ani si neukázal, co si zkoušel a jak přesně to „nefunguje“

DodiseK
Člen | 56
+
0
-

Omlouvám se, moje chyba, zkoušel jsem něco takového

$autorrank = $context->table('issues')->get(1);
    $autorrank->ref('ranksystem', 'name');
David Matějka
Moderator | 6445
+
0
-

pockej, ty do issues ukladas do sloupce „autor“ jmeno autora? tam se ma ukladat ID

DodiseK
Člen | 56
+
0
-

Ano, jelikož to jméno autora pak vypisuji

David Matějka
Moderator | 6445
+
0
-

to si mas vytahnout pres ten cizi klic (pres ref funkci) z te druhe tabulky. co kdyz si uzivatel chce zmenit jmeno?

doporucuju na internetu najit nejaky clanek o normalizaci relacni databaze

DodiseK
Člen | 56
+
0
-

Dobře, děkuji. Zkusím to a dám vědět

DodiseK
Člen | 56
+
0
-

V databázi jsem připsal podle návodu všechny klíče. Aktuálně mi to píše chybu: Undefined variable: Context
V presenteru mám toto:

$user_name = $context->table('users')->get(1);
$user_name->ref('users', 'author_id');

V tabulce users mám id, username, realname, password, atd…
V tabulce issues mám id, autor_id, atd…
No a já potřebuji vytahnout z tabulky users realname, který bych chtěl dát do proměnné $user_rank…

Šaman
Člen | 2634
+
+3
-

DodiseK Prosím tě, víš aspoň trochu co vlastně děláš? Nebo jenom slepuješ náhodné kusy kódu napříč dokumentací a fórem?
Ten $context je tvoje připojení k databázi. V presenteru nejspíš $this->database, ale pojmenované to může být jinak.

Mám z těch dotazů pocit, že plaveš v základech php, relačních databází a neprojel sis základy Nette a ptáš se proč ti kód nefunguje.
Jinak kdybys byl třeba z jiných jazyků zvyklý pracovat s databází nízkoúrovňově, tak můžeš používat metodu query() a dotazy si psát ručně. Nette zápis je fajn, ale je to určitá nadstavba která má svá pravidla, takže zase něco nového.

DodiseK
Člen | 56
+
0
-

@Šaman No, jakože vím co dělám, ale většinou tedy slepuji kódy no.