IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Ověření jmen v databázi

Aktivity
Avatar
Tomáš Kretek:9.7.2018 15:01

Ahoj potřebuju vytáhnout z databáze zaregistrované jména, abych mohl ověřit, jestli je tam můžu zapsat. Momentálně to dělá to, že to úplně do prázdné databáze zapíše, ale když už je tam jeden řádek s registrovaným týmem a zkusí se registrovat druhý co má jiné jména, už to přes tu podmínku neprojde. Poradí mi někdo prosím? Už nad tím sedím půl dne a na nic jsem nepřišel. Děkuji moc :)

Zkusil jsem: Zkouším to s tímto kódem, ale nefunguje mi to

$Nickname_duo = Db::queryOne('
                        SELECT prvni_hrac, druhy_hrac
                        FROM duo_tymy
                ');
                                if(($Nickname_duo['prvni_hrac'] || $Nickname_duo['druhy_hrac']) == ($_POST['prvni_hrac_duo'] || $_POST['druhy_hrac_duo'])){
                                        $hlaska_reg="Některý z hráčů již je v turnaji zaregistrovaný!";
                                }

zkošel jsem to i s těma jinýma verzema toho querry, ale vždycky to dělalo něco jiného.

Chci docílit: Vlastně se jedná o registraci do turnaje, údaje se odešlou z formu do php a to je pošle do databáze a uloží. Chybí mi ta poslední podmínka a nechci to rozepisovat jedno po druhém, když to určitě jde i rychleji.

 
Odpovědět
9.7.2018 15:01
Avatar
andrasi.m
Člen
Avatar
andrasi.m:9.7.2018 15:29

Osobně tu podmínku co máš ty bych asi nepoužil. Není lepší si vytáhnout pole a zjistit jestli v poli už někdo z nich je? A pak dále pokračoval? Možná více práce, ale lepší než nad tím sedět den. Možná ale blbě chápu :)

 
Nahoru Odpovědět
9.7.2018 15:29
Avatar
Odpovídá na andrasi.m
Tomáš Kretek:9.7.2018 15:34

No teď ale vědět jak to zapsat :D Kdybych z té databáze tahal všechno do pole, tak vytáhnu i ID a to je zbytečné. Nejsem si totiž moc jistý jak které to Querry pracuje, ikdyž je to tam napsané.

Editováno 9.7.2018 15:36
 
Nahoru Odpovědět
9.7.2018 15:34
Avatar
andrasi.m
Člen
Avatar
Odpovídá na Tomáš Kretek
andrasi.m:9.7.2018 15:46

Podle mě se ta proměnná nechytá a proto ti to blbne.

Jestli ti to vrací už pole tak stačí podle mě jen porovnat $_POST s tou tvojí databází.

Mimochodem a proč to neuděláš přímo v dotazu? uděláš tam where prvni_hrac = $_POST["prvni_hra­c"] and $_POST["druhy_hrac"]

Pokud ti to vrátí $vysledek který se bude rovnat více jak 0 tak záznam existuje. V opačném případě můžeš zapisovat.

 
Nahoru Odpovědět
9.7.2018 15:46
Avatar
andrasi.m
Člen
Avatar
Odpovídá na andrasi.m
andrasi.m:9.7.2018 15:48

Ale také to musíš ošetřit ten dotaz :) ne že to tam napřímo napíšeš :D. ID si vytáhneš pokud si ho tam napíšeš do SELECT že ho chceš vytáhnout.

Editováno 9.7.2018 15:49
 
Nahoru Odpovědět
9.7.2018 15:48
Avatar
Odpovídá na Tomáš Kretek
Uživatel sítě :9.7.2018 15:50

Proveď to rovnou v SQL dotazu a pokud záznam bude existovat, tak je registrovaný.

Nahoru Odpovědět
9.7.2018 15:50
Chybami se člověk učí, běžte se učit jinam!
Avatar
andrasi.m
Člen
Avatar
Odpovídá na andrasi.m
andrasi.m:9.7.2018 15:58

if (count($vysledek) > 0)
{
$error = "Jsi registrovaný";
}

tak nějak asi.

 
Nahoru Odpovědět
9.7.2018 15:58
Avatar
Odpovídá na andrasi.m
Tomáš Kretek:9.7.2018 16:08

Jak zajistíš ale tím, že ověříš prvního hráče těma dvěma, že to není třeba napsané naopak ty jména a ten použitý nick je v tom poli druhy hrac? Jestli mě chápeš

 
Nahoru Odpovědět
9.7.2018 16:08
Avatar
andrasi.m
Člen
Avatar
andrasi.m:9.7.2018 16:14

jo vím co myslíš. Nevím ale jak moc jsi v SQL dotazech daleko. Ono to jde udělat dotazem.

Nebo na prasáka.
Uděláš dva dotazy a na první dotaz použiješ

SELECT prvni_hrac, druhy_hrac FROM duo_tymy where prvni_hrac = $_POST["prvni_hra­c"] OR druhy_hrac
a ve druhém
SELECT prvni_hrac, druhy_hrac FROM duo_tymy where druhý_hrac = $_POST["prvni_hra­c"] OR druhy_hrac

pokud se ti $vysledek a $vysledek 2 vrátí s count 0 tak je to cajk. Pokud ne tak Hodíš chybu. Ale jde to udělat i v SQL, ale na to momentálně nemám úplně skill z fleku takto střelit :)

Pokud je to easy formulář a je vpohodě načítání tak dva selekty jdou ok.

 
Nahoru Odpovědět
9.7.2018 16:14
Avatar
Odpovídá na andrasi.m
Tomáš Kretek:9.7.2018 16:19

To mě taky napadlo a tomu jsem se chtěl právě vyhnout :D Ale. nejde zapsat WHERE prvni_hrac OR druhy_hrac = ? OR ?. Do otazníku hodíš potom zvlášť POSTy.

Druhá věc je že tohle je pro dva hráče. Potom bude ještě pro 4 a to roztahovat fakt nechci :D

 
Nahoru Odpovědět
9.7.2018 16:19
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:9.7.2018 16:32

Ahoj,
jak si to tak pročítám, tak bych se zamyslel nad konstrukcí databáze... máš to zbytečně složité...

Jestli chápu správně, tak nyní máš:
tabulka uživatelů... tam je x uživatelů

a pak máš tabulku hry se sloupcemi 1. hráč | 2. hráč atd...

Na to se blbě píšou dotazy.

pokud si uděláš tzv. vazební tabulku, kde budeš mít
id hry | hrac, tak to můžeš procházet velice jednoduše. do WHERE dáš id hry a hráče a máš to... buď je nebo není.

Jestli to chápu špatně, tak napiš jak máš udělané tabulky v databázi.

 
Nahoru Odpovědět
9.7.2018 16:32
Avatar
Tomáš Kretek:9.7.2018 16:48

Já mám vždycky tym_id | prvni_hrac | druhy_hrac

Takže vlastně při každé registraci ti dva jsou jako tým, jsou v jednom řádku, s tím, že se každému týmu zvýší id o 1.

mám to tak schválně rozdělnené, protože ty hry jsou 3 a každá je jinačí typ.

 
Nahoru Odpovědět
9.7.2018 16:48
Avatar
andrasi.m
Člen
Avatar
andrasi.m:9.7.2018 16:56

Jsem to blbě napsal s tím selectem. Jsem nepřemýšlel. No jo už jsem byl dlouho v práci. Ještě mě napadá jedno řešení s whilem kde se jednou dotážu na uživatele prvního a pak na druhého, Takže ve výsledku budu mít 4 dotazy. Není to tedy super řešení....

Mořná by šlo to groupnout na uživatele jednoho a pak na druhého. Jak píše kolega nahoře. takto máš vlastně v jednom řádku dva záznamy a blbě se na to pak dělá dotaz. Jde to ale je to dřina :) kdyby jsi to měl v tabulce tak "Hráči" tak tam je to jen o selectu.

Takto budeme dělat komba. I ty hry jsou dělat do tabulek a přiřazovat skupině určitý id hry atd. Ono databáze je základ. Jak si ji navhrneš tak s ní pracuješ.

 
Nahoru Odpovědět
9.7.2018 16:56
Avatar
Odpovídá na Tomáš Kretek
Matúš Olejník:9.7.2018 17:43

Keby si mal tabuľky

Player - id, name
Game - id, type
duo_tymy - id, playerId, gameId

Select * from duo_tymy
Join player on playerId = player.id
Join game on gameId = game.id
Where player.name like 'meno1' or player.name like 'meno2'
And type = typHry

A keď sa ti vrátia 2 záznamy tak už existuje tím pre daný typ hry, ktorý je zložený práve z tých dvoch hráčov

Nahoru Odpovědět
9.7.2018 17:43
/* I am not sure why this works but it fixes the problem */
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:9.7.2018 18:24

Ale fuj:

($Nickname_duo['prvni_hrac'] || $Nickname_duo['druhy_hrac']) == ($_POST['prvni_hrac_duo'] || $_POST['druhy_hrac_duo'])

Asi si dokážu představit, jak si myslíš, že by to mělo fungovat, ale mohu tě ujistit, že to tak fungovat nebude. Teď říkáš, že podmínka projde jen pokud (je neprázdné $Nickname_duo['prvni_hra­c'] nebo je neprázdné $Nickname_duo['dru­hy_hrac']) a zároveň ( je neprázdné $_POST['prvni_hra­c_duo'] nebo je neprázdné $_POST['druhy_hrac_du­o']). To je naprosto začátečnická chyba, která nefunguje v žádném jazyku.
Ta podmínka se zkrátka nedá napsat nějak na jeden řádek.

Tvůj problém bych asi řešil na úrovni databáze cca takto:

SELECT 1 FROM duo_tymy WHERE (
  prvni_hrac IN (?,?)
) OR (
  druhy_hrac IN (?,?)
)

, kde parametry budou
$_POST['prvni_hra­c_duo'], $_POST['druhy_hrac_du­o'], $_POST['prvni_hra­c_duo'], $_POST['druhy_hrac_du­o'].

Pokud dotaz vrátí nějaký výsledek, vznikla by duplicita a podmínka by neměla projít.

Načítat všechna id nebo páry je hovadina, protože

  1. bude se muset zbytečně moc dat
  2. bude to pomalé, protože hledání v poli bude pomalejší než databáze, která je na to optimalizovaná (především pokud si přidáš indexy)

Z databáze by ideálně mělo lézt jen skutečně to, co potřebuješ a ne něco k mezivýpočtu, co data třeba zredukuje na true/false. Databáze to většinou zvládne, jen si to musíš nastudovat.
PS: pokud nevíš, co jsou ty otazníky, tak to jsou parametrizované dotazy, suprová věc (a hlavně bezpečná).

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.7.2018 18:24
the cake is a lie
Avatar
Tomáš Kretek:9.7.2018 18:59

No, tak nakonec jsem to udělal na prasáka, jak říkal andrasi.m :D

$Nickname1_duo = Db::querySingle('
                        SELECT COUNT(*)
                        FROM duo_tymy
                                                WHERE prvni_hrac=?
                                                LIMIT 1
                ', $_POST['prvni_hrac_duo']);
                        $Nickname2_duo = Db::querySingle('
                        SELECT COUNT(*)
                        FROM duo_tymy
                                                WHERE druhy_hrac=?
                                                LIMIT 1
                ', $_POST['druhy_hrac_duo']);
                                if($Nickname1_duo || $Nickname2_duo){
                                        $hlaska_reg="Některý z hráčů již je v turnaji zaregistrovaný!";
 
Nahoru Odpovědět
9.7.2018 18:59
Avatar
Odpovídá na Petr Čech
Tomáš Kretek:9.7.2018 19:07

Dobře tak to tvoje funguje taky a je to jednodušší a asi i rychlejší. Děkuji moc. Kdybych s tím měl zkušenosti a věděl jak to zapsat, tak tady s tím nebudu otravovat :D

 
Nahoru Odpovědět
9.7.2018 19:07
Avatar
Odpovídá na Petr Čech
Tomáš Kretek:9.7.2018 21:44

Můžu se tě teda ještě zeptat, proč nefunguje tohle?

$hrac_neexistuje = Db::query('
                        SELECT 1 FROM hraci_online WHERE (Nickname IN (?,?))', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if($hrac_neexistuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Má to zjistit, jestli jeden nebo druhý účet je registrovaný na webu.

 
Nahoru Odpovědět
9.7.2018 21:44
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Tomáš Kretek
Petr Čech:9.7.2018 21:56

Nefunguje ve smyslu, že to spadne, nebo ve smyslu nechová se to, jak bys očekával? Mimochodem, je hodně moc špatný nápad pojmenovávat proměnné opačně k jejich významu :-`

Nahoru Odpovědět
9.7.2018 21:56
the cake is a lie
Avatar
Odpovídá na Petr Čech
Tomáš Kretek:9.7.2018 22:05

Nespadne, ale ta podmínka se plní pořád.

 
Nahoru Odpovědět
9.7.2018 22:05
Avatar
Tomáš Kretek:9.7.2018 22:09

Upravil jsem to takhle:

$hrac_existuje = Db::query('
                        SELECT 1 FROM hraci_online WHERE (Nickname IN (?,?))', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if(!$hrac_existuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

A už to vypadá že to funguje. Vlastně jsem to opravil díky tomu pojmenování :D

 
Nahoru Odpovědět
9.7.2018 22:09
Avatar
Tomáš Kretek:9.7.2018 22:15

Tak nefunguje. Achjo.

 
Nahoru Odpovědět
9.7.2018 22:15
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:10.7.2018 6:59

Musíš to mít jako Db::querySingle a k tomu jak se ti vrací sloupec 1 udělej COUNT(1).

Tedy takto:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(1) FROM hraci_online WHERE (Nickname IN (?,?))', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if(!$hrac_existuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Ještě bych ti v tomto případě doporučil to olimitovat LIMIT 1 - jak SQL narazí na první výsledek, skončí prohledávání.

Sice nevím odkud jsi se PHP a MySQL učil, ale měl by sis projít zdejší tutoriály o PHP a databázích v PHP pro začátečníky. Také jsem začínal jako samouk a hodně mi to tady pomohlo. Když to pilně nastuduješ, tak pak nemusíš řešit školácké chyby a nebudeš si do budoucna přidělávat zbytečnou práci předěláváním kódu.

 
Nahoru Odpovědět
10.7.2018 6:59
Avatar
Odpovídá na petr.jouza
Tomáš Kretek:10.7.2018 9:14

Nemůžu to omezit na 1, protože já potřebuju, aby tam byli oba hráči registrovaní. Takže tam dám LIMIT 2, ale stejně to nefunguje...

 
Nahoru Odpovědět
10.7.2018 9:14
Avatar
Odpovídá na petr.jouza
Tomáš Kretek:10.7.2018 9:19

Ta podmínka prostě někdy fungue a někdy ne.

 
Nahoru Odpovědět
10.7.2018 9:19
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:10.7.2018 9:23

to by bylo dost divné... a to máš v databázi skutečně pojmenovaný sloupec "1"?

Nějak tedy nechápu co tím SQL dotazem chceš docílit... v erroru máš chybu: "Nějaký z uvedených hráčů není zaregistrovaný na našem webu!" a tím bych řekl, že chceš zkontrolovat, zda přihlašovaný uživatel vůbec v databázi existuje... nebo ne?

 
Nahoru Odpovědět
10.7.2018 9:23
Avatar
Tomáš Kretek:10.7.2018 9:28

Ano přesně tak.

 
Nahoru Odpovědět
10.7.2018 9:28
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:10.7.2018 12:06

Tak tím pádem ti stačí to provést takto:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(1) FROM hraci_online WHERE Nickname = ? OR Nickname = ? LIMIT 1)', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if(!$hrac_existuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Ten LIMIT nemusíš mít nastavený na 2... pokud jeden z nich nebude v databázi, tak ti stejně ta podmínka neprojde. Pak je jedno jestli je jeden nebo jsou dva. prostě tam není.

Nebo pokud chceš, aby to bylo vždy 2, tak podmínka pak musí být:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(1) FROM hraci_online WHERE Nickname = ? OR Nickname = ? LIMIT 2)', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if($hrac_existuje != 2){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }
 
Nahoru Odpovědět
10.7.2018 12:06
Avatar
petr.jouza
Člen
Avatar
Odpovídá na petr.jouza
petr.jouza:10.7.2018 12:08

Ještě mě napadlo... nevím co máš v tom sloupci 1 ale spíš bych tedy udělal:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(Nickname) FROM hraci_online WHERE Nickname = ? OR Nickname = ? LIMIT 2)', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if($hrac_existuje != 2){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Počítáš uživatelská jména... pokud by sloupec nazvaný "1" měl hodnotu NULL, tak se ti nezapočítá.

 
Nahoru Odpovědět
10.7.2018 12:08
Avatar
Tomáš Kretek:10.7.2018 12:31

Zkusím to použít, děkuji mooc :)

 
Nahoru Odpovědět
10.7.2018 12:31
Avatar
Nahoru Odpovědět
11.7.2018 9:07
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 31 zpráv z 31.